SHA1 PHP mcrypt_decrypt结果

Rap*_*tor 3 php encryption mcrypt

我使用PHP mcrypt库有2个加密和解密函数.

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);
}
Run Code Online (Sandbox Code Playgroud)

鉴于密钥是由以下因素生成的:

$key = pack('H*', 'dfgsdighsdfksdhfosdfasdjldsfsdfgdfkgdl'); // a random key
Run Code Online (Sandbox Code Playgroud)

我可以在加密和解密后成功获取输入.

这是代码:

$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
Run Code Online (Sandbox Code Playgroud)

但是,SHA1结果不同:

7c4a8d09ca3762af61e59520943dc26494f8941b // before encrypt & decrypt
f41b44dbecccaccfbb4ccf6a7fc4921c03878c6d // after encrypt & decrypt
Run Code Online (Sandbox Code Playgroud)

它为什么不同?我错过了什么 ?

更新:

接受的答案很有用.对于想要了解更多信息的人来说,这里是:

echo bin2hex($pass) . PHP_EOL; // prints 313233343536
echo bin2hex($pass_decrypt) . PHP_EOL; // prints 31323334353600000000000000000000
Run Code Online (Sandbox Code Playgroud)

之后trim(),SHA1结果按预期工作,因为0删除了空隐藏.

Moł*_*łot 6

问题是你的decrypt_string返回16个字节的字符串,在右侧填充0个字节.这是一个已知约2年的问题.

从右侧删除空字节,其行与此类似:

return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $cipher, MCRYPT_MODE_CBC, $iv), "\0");
Run Code Online (Sandbox Code Playgroud)

要小心,不要在最后加密与空字符的东西,如PHP密码学功能的工作原理就好像所有的字符串是空值终止,且毫不避讳地切串在第一\0或回位的\0小号守在输出端.