好吧,我曾尝试使用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欢迎任何建议,谢谢!
这是我使用的 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