【问题标题】:PHP Mcrypt - Decrypt function does not work for a fraction of the stringsPHP Mcrypt - 解密函数对一小部分字符串不起作用
【发布时间】:2014-02-01 18:38:26
【问题描述】:

我知道 PHP 的 mcrypt_decrypt 上已经有一百万个帖子,但我找不到与我的结果相同的帖子。我有一对简单的加密/解密函数,我想用它们对数据执行双向加密。奇怪的是,对于我提供给函数的任何随机字符串中的大约 4%,它不会成功解密。例如,如果我创建一个从 0 到 9999 的“for 循环”,并加密和解密这些数字的字符串版本,那么每次都会失败相同的值,并且这些值取决于我传递给函数的密钥。我可以传递任何键,虽然失败的具体值会发生变化,但失败的值的百分比将大致保持不变。

我试过不带 IV 参数的 ECB 模式,也试过带 IV 参数的 CBC 模式,结果相同。

这是我在 ECB 模式下的加密功能:

function mc_encrypt($string, $mc_key) {
    $passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($string), MCRYPT_MODE_ECB));
    $encode = base64_encode($passcrypt);

    return $encode;
}

这是我在 ECB 模式下的解密函数:

function mc_decrypt($string, $mc_key) {
    $decoded = base64_decode($string);
    $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($decoded), MCRYPT_MODE_ECB));

    return $decrypted;
}

CBC模式版本相同,只是在加密时使用mcrypt_create_iv()函数创建IV,并在解密时作为参数传入。

在我的服务器上使用这些函数并以“abc”作为测试加密密钥,如果我从 0 运行到 300,以下值将无法正确解密:

4、6、70、145、151、176、237、254、275

如果我将加密密钥更改为其他值,它将改变正确返回的值,但不会改变值返回的频率。

有什么建议吗???

提前致谢!

【问题讨论】:

  • +1 用于故障排除尝试,因为那是该死的奇怪结果。

标签: php mcrypt


【解决方案1】:

我刚刚从您的代码中提取了两个trim() 调用,并且它有效。基本上,mcrypt_encrypt 可能会返回带有尾随空字节 (\0) 的答案,需要保留这些。此外,出于同样的原因,不要将 $decoded 参数修剪为mcrypt_decrypt。并且在修剪来自mcrypt_decrypt 的响应时,仅使用rtrim

function mc_encrypt($string, $mc_key) {
    $passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($string), MCRYPT_MODE_ECB);
    $encode = base64_encode($passcrypt);

    return $encode;
}

function mc_decrypt($string, $mc_key) {
    $decoded = base64_decode($string);
    $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, $decoded, MCRYPT_MODE_ECB));

    return $decrypted;
}

【讨论】:

  • 填充将在最后结束。所以应该使用 rtrim() 而不是 trim()。
  • @ManuelH,你是对的,mcrypt_decrypt 响应应该使用 rtrim() ,而不是修剪,现在更新。
猜你喜欢
  • 2013-01-20
  • 2015-09-04
  • 2012-12-12
  • 2017-06-04
  • 2015-11-24
  • 2016-09-01
  • 2013-05-29
  • 2011-10-13
  • 2017-01-03
相关资源
最近更新 更多