给定以下要加密的电子邮件以及此(弱)加密密钥:
$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
因此,即使使用不同的$iv(“ om.someone@my-office.co.uk”),基本上也可以解密最后26个字符.有人可以解释为什么会这样吗? (即使我再次更改$iv,也会解密相同的26个字符)
我已经从最佳答案here得到了这种加密方法
解决方法:
要了解这一点,您将需要研究块密码的工作方式.
https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
通常(包括AES / Rijndael),每个块都用于影响下一个块的解密. IV仅用于影响第一个块的解密(不存在先前的块).因此,是的,根据所使用的确切算法,单独的IV仅会影响密文的第一块的解密.这就是您所看到的.