我知道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
如果我将加密密钥更改为其他内容,它将更改哪些值正确返回,但不会更改值返回的频率。
任何建议???
提前致谢!
答案 0 :(得分:5)
我刚刚从您的代码中调用了两个trim()
个调用,它可以运行。基本上,mcrypt_encrypt
可以返回尾随空字节(\ 0)的答案,需要保留它们。另外,出于同样的原因,不要将$ decoding参数修剪为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;
}