Mcrypt解密不起作用 - PHP
Posted
技术标签:
【中文标题】Mcrypt解密不起作用 - PHP【英文标题】:Mcrypt Decryption Not Working - PHP 【发布时间】:2013-01-20 19:42:59 【问题描述】:我正在使用两个简单的函数来加密和解密密码。但是解密功能无法正常工作。这是我的输出:
加密:�\� ���#�%\��>�3,�o�Sd��c� 解密:test123
这是我的代码:
$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);
function encrypt($data)
$key = 'test';
$encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_ENCRYPT, $iv);
return $encrypted_data;
function decrypt($encryptedData)
$key = 'test';
$decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $encryptedData, MCRYPT_DECRYPT, $iv);
return $decrypt;
$password = encrypt($member[0]['PASSWORD']);
print('Encrypted: '.$password.'<br />');
$password = decrypt($password);
print('Decrypted: '.$password);
【问题讨论】:
考虑改用this code。这绝对有效。 这里有几个错误;您将字符串或密码视为密钥,您使用的是 Rijndael 256,它 not 与 AES-256 相同,最后您没有明确定义明文的字符编码。这显然不包括我的回答中的 IV 问题。 不幸的是,您不得不欺骗 mcrypt 执行 AES-256。就像让你的密码MCRYPT_RIJNDAEL_128
一样,但是给它一个 256 位的密钥。 php中的字符编码也不容易控制,我不认为。不过在密码这件事上完全正确。
【参考方案1】:
问题在于$iv
代。您在加密期间生成它,然后在解密期间再次生成它。
$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);
function encrypt($data, $iv)
$key = 'test';
$encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_ENCRYPT, $iv);
return $encrypted_data;
function decrypt($encryptedData, $iv)
$key = 'test';
$decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $encryptedData, MCRYPT_DECRYPT, $iv);
return $decrypt;
$password = encrypt("testing", $iv);
echo $password.'<br>';
echo decrypt($password, $iv);
【讨论】:
为什么迟到 7 分钟才发同样的答案? 我在发布更新后检查了更新。我正忙着把代码弄出来。 :( 它看起来像一个很好的小提琴所以解决这个特定的问题,虽然通常加密和解密不会使用相同的实例。您需要以某种方式传达 IV。请注意,*** 喜欢内联代码 - 不要只指向外部小提琴,特别是如果它是一口大小的。 我个人会使用单例方法来进行 IV,以便全面保持相同。我可以在答案中发布代码,但我也想提供一个工作环境以查看它的工作原理。既然你先给出了答案,你可以拿这个小提琴,我会删除我的答案。 :) IV 的整个想法是它会随着使用相同密钥的每次加密而改变。因此,使用单例不是一个好主意。生成一个新的 IV 实际上是 Daniel 做对的事情。但通常 IV 应该与密文一起保存,因为它直接链接到它。将它保存在内存中通常没有多大意义。【参考方案2】:好的,我得到了使用此代码的加密:
$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);
function encrypt($data)
$key = 'test';
$encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_ENCRYPT, $iv);
return base64_encode($encrypted_data);
function decrypt($encryptedData)
$key = 'test';
$encryptedData = base64_decode($encryptedData);
$decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $encryptedData, MCRYPT_DECRYPT, $iv);
return trim($decrypt);
【讨论】:
【参考方案3】:嗯,是的,当您使用随机 IV 进行加密和使用新 IV 进行解密时,就会发生这种情况。您应该只在加密期间生成 IV,例如在密文前面加上前缀。
【讨论】:
以上是关于Mcrypt解密不起作用 - PHP的主要内容,如果未能解决你的问题,请参考以下文章
将 mcrypt AESencrypt 函数转换为 openssl 但不起作用