适当的PHP mcrypt加密方法?

nkc*_*cmr 5 php mcrypt

好吧,我曾尝试使用PHP创建自己的加密/解密方法mcrypt,当我稍后发布它们时,有些人称它们为"垃圾".他们提到了关于"初始化矢量"等的事情.基本上,我如何才能更好地使这些加密方法:

function encrypt($key, $data){
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $data, MCRYPT_ENCRYPT);
    return base64_encode($encrypted_data);
}

function decrypt($key, $encryptedData){
    $dec = base64_decode($encryptedData);
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $dec, MCRYPT_DECRYPT);
    return trim($decrypt);
}
Run Code Online (Sandbox Code Playgroud)

我希望这些能够最好地发挥作用,除非我在一个崭新的世界中成为一个鸳鸯,mcrypt欢迎任何建议,谢谢!

Roc*_*mat 3

这是我使用的 mcrypt 函数的片段。他们使用mcrypt_genericand mdecrypt_generic,应该根据PHP 手册使用。

function encrypt($key, $data){
    $b = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $enc = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($enc), MCRYPT_DEV_URANDOM);
    mcrypt_generic_init($enc, md5($key), $iv);

    // PKCS7 Padding from: https://gist.github.com/1077723
    $dataPad = $b-(strlen($data)%$b);
    $data .= str_repeat(chr($dataPad), $dataPad);

    $encrypted_data = mcrypt_generic($enc, $data);

    mcrypt_generic_deinit($enc);
    mcrypt_module_close($enc);

    return array(
        'data' => base64_encode($encrypted_data),
        'iv' => base64_encode($iv)
    );
}

function decrypt($key, $iv, $encryptedData){
    $iv = base64_decode($iv);
    $enc = mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', MCRYPT_MODE_CBC, '');
    mcrypt_generic_init($enc, md5($key), $iv);

    $encryptedData = base64_decode($encryptedData);
    $data = mdecrypt_generic($enc, $encryptedData);
    mcrypt_generic_deinit($enc);
    mcrypt_module_close($enc);

    // PKCS7 Padding from: https://gist.github.com/1077723
    $dataPad = ord($data[strlen($data)-1]);

    return substr($data, 0, -$dataPad);
}
Run Code Online (Sandbox Code Playgroud)

我对这两个都不太了解mcrypt,所以我只是把它们放在一起。我md5使用密钥,因此它始终是 32 个字符(最大密钥长度),并且我随机计算“初始化向量”。

使用PKCS7 填充更好,因为您可以使用以空格结尾的字符串(这样trim可以删除空格),而且当字符串达到一定长度时,加密效率更高。

我在这里使用 AES 256 (MCRYPT_RIJNDAEL_256),但 AES 192 (MCRYPT_RIJNDAEL_192) 也可以。

演示: http: //ideone.com/WA5Tk