鉴于以下待加密电子邮件和此(弱)加密密钥:
$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
获得此编码方法答案 0 :(得分:3)
要理解这一点,您需要了解阻塞密码如何工作。
https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
通常(包括AES / Rijndael),每个块用于影响下一个块的解密。 IV仅用于影响第一块的解密(其中不存在先前的块)。所以,是的,单独的IV将 - 取决于所使用的确切算法 - 仅影响密码的第一个块的解密。这就是你所看到的。