我有2个加密&使用PHP mcrypt库解密函数。
public function encrypt_string($input, $key) {
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$cipher = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $input, MCRYPT_MODE_CBC, $iv);
return base64_encode($iv . $cipher);
}
public function decrypt_string($input, $key) {
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$ciphertext = base64_decode($input);
$iv = substr($ciphertext, 0, $iv_size);
$cipher = substr($ciphertext, $iv_size);
return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $cipher, MCRYPT_MODE_CBC, $iv);
}
鉴于密钥是由:
生成的$key = pack('H*', 'dfgsdighsdfksdhfosdfasdjldsfsdfgdfkgdl'); // a random key
我可以在加密后成功获取输入&解密。
以下是代码:
$pass = '123456';
echo sha1($pass) . PHP_EOL; // prints 7c4a8d09ca3762af61e59520943dc26494f8941b
$pass_cipher = encrypt_string($pass, $key);
$pass_decrypt = decrypt_string($pass_cipher, $key);
echo $pass_decrypt . PHP_EOL; // prints 123456
echo sha1($pass_decrypt) . PHP_EOL; // prints f41b44dbecccaccfbb4ccf6a7fc4921c03878c6d
但是,SHA1结果不同:
7c4a8d09ca3762af61e59520943dc26494f8941b // before encrypt & decrypt
f41b44dbecccaccfbb4ccf6a7fc4921c03878c6d // after encrypt & decrypt
为什么会有所不同?我错过了什么?
更新
接受的答案很有用。对于需要其他信息的人来说,这是:
echo bin2hex($pass) . PHP_EOL; // prints 313233343536
echo bin2hex($pass_decrypt) . PHP_EOL; // prints 31323334353600000000000000000000
在trim()
之后,SHA1结果按预期工作,因为删除了空隐藏0
。
答案 0 :(得分:6)
问题是你的decrypt_string返回16个字节的字符串,在右侧填充0个字节。这是一个问题known for about 2 years。
从右侧删除空字节,其行与此类似:
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $cipher, MCRYPT_MODE_CBC, $iv), "\0");
注意不要在末尾加密带有空字符的东西,因为PHP中的密码学函数就好像所有字符串都是空终止的并且不会害怕在第一个\0
剪切字符串或者返回一点\0
粘在他们输出的末尾。
答案 1 :(得分:0)
在帖子中加密的数据+符号将被替换为空格。这就是解密没有完成的原因。