PHP openssl_decrypt:即使使用不同的IV,部分解密也能正常工作?

时间:2015-07-22 09:19:42

标签: php encryption

鉴于以下待加密电子邮件和此(弱)加密密钥:

$source="example.email.from.someone@my-office.co.uk";
$pass="Somepassword...";

我想生成一个有点好的加密字符串:

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$method="AES-128-CBC";

$encrypted=openssl_encrypt($source, $method, $pass, true, $iv);

如果我尝试解密它可以正常工作:

$decrypted=openssl_decrypt ($encrypted, $method, $pass, true, $iv);
echo $decrypted;
// example.email.from.someone@my-office.co.uk

但是当我尝试使用不同的$ iv(!)解密时,我希望得到一个无意义的结果,但我得到了:

$iv2 = "tralala1tralala2";
$decrypted=openssl_decrypt ($encrypted, $method, $pass, true, $iv2);
echo $decrypted;
// m~Œ=¢ì  •wêàdÏŠom.someone@my-office.co.uk

所以基本上最后26个字符即使使用不同的$ iv(“om.someone@my-office.co.uk”)也会被解密。有人可以解释为什么会这样吗? (即使我再次更改$ iv,也会解密相同的26个字符)

我从最佳答案here

获得此编码方法

1 个答案:

答案 0 :(得分:3)

要理解这一点,您需要了解阻塞密码如何工作。

https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

通常(包括AES / Rijndael),每个块用于影响下一个块的解密。 IV仅用于影响第一块的解密(其中不存在先前的块)。所以,是的,单独的IV将 - 取决于所使用的确切算法 - 仅影响密码的第一个块的解密。这就是你所看到的。