php - SHA1 PHP mcrypt_decrypt 结果

标签 php encryption mcrypt

我有 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 是由以下人员生成的:

$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 被删除。

最佳答案

问题是您的 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

关于php - SHA1 PHP mcrypt_decrypt 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19379875/

相关文章:

php - RAD Visual Web Application Creator/Builder/Designer for PHP

java - 在java中解密时出错

ios - 使用公钥解密文件内容

php - 使用 mcrypt 在 php 和 c 中进行 AES 加密

PHP - 用 openssl_random_pseudo_bytes() 替换 mcrypt_create_iv()

php - 生成一个 N 位随机数

php - PHP 中简单的 3 个字母日

PHP 系列适用于 Windows,但不适用于 Linux

java - 无法使用 Obj-C 解密使用 Java 加密的 AES 数据

PHP实时动态计算mysql结果之和