好的,我尝试使用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);
}
我希望这些能够最好地发挥作用,除非我在mcrypt
这个全新的世界中成为一只鸭子,欢迎任何建议,谢谢!
答案 0 :(得分:3)
这是我使用的mcrypt函数的片段。他们使用mcrypt_generic
和mdecrypt_generic
,应根据PHP manual使用。
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);
}
我对mcrypt
也不太了解,所以我只是在一起攻击这些。我md5
键,所以总是32个字符(最大键长),我随机计算一个“初始化矢量”。
使用PKCS7 Padding更好,因为你可以拥有以空格结尾的字符串(因为trim
会删除它),当字符串是一定长度时加密也会更有效。
我在这里使用AES 256(MCRYPT_RIJNDAEL_256),但AES 192(MCRYPT_RIJNDAEL_192)也可以使用。
答案 1 :(得分:2)
您可以使用适当的加密模式大小创建mcrypt_create_iv()
的静脉注射。
$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_192, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);
然后将其作为可选的第五个参数传递给mcrypt_cbc()
。我在此处对原始函数所做的唯一更改是传递$iv
:
function encrypt($key, $data, $iv){
$encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $data, MCRYPT_ENCRYPT, $iv);
return base64_encode($encrypted_data);
}
function decrypt($key, $encryptedData, $iv){
$dec = base64_decode($encryptedData);
$decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_192, $key, $dec, MCRYPT_DECRYPT, $iv);
return trim($decrypt);
}