使用phpseclib(php7)替换不推荐使用的MCRYPT_RIJNDAEL(php5)时,如何获得完全解密



我必须将脚本从php 5.6升级到7.4,但我需要解密以前用MCRYPT_RIJNDAEL_256加密的数据(已弃用(。我尝试使用phpseclib-Github(基于这个SO答案(,但我得到了一个不完整的结果(奇怪的字符(。如何获得正确的非标准化数据?

例如:

$key = "0123456789abcdefghijklmn"; // len = 24
$data = "ABC123 abc123 ABC123 abc123 ABC123 abc123 ABC123 abc123";

PHP 5.6加密:

$enc_old = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $data, MCRYPT_MODE_CBC, md5(md5($key))));
echo $enc_old;
// eOIZd9ND59vfjx6A5fteiFQWgwYFawPccCieAxD1Ir+xJnutpdsc7b6ELNArNPLSghfdVteO0WM4lcfTQToR8w==

PHP 5.6解密=>好的:

$dec_old = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($enc_old), MCRYPT_MODE_CBC, md5(md5($key))), "");
echo $dec_old;
// ABC123 abc123 ABC123 abc123 ABC123 abc123 ABC123 abc123

PHP 7.4用phpseclib:解密

require "vendor/autoload.php";
$rijndael = new phpseclibCryptRijndael(phpseclibCryptRijndael::MODE_CBC);
$rijndael->setKey( md5($key) );
$rijndael->setKeyLength(256);
$rijndael->disablePadding();
$rijndael->setBlockLength(256);
$dec_new = $rijndael->decrypt( base64_decode($enc_old) );
echo $dec_new;
// ttRFXQZVr {PFTVTPs t23 abc123 ABC123 abc123

基本上,数据的第一部分似乎已损坏。但其余的数据还可以。如何正确解密整个数据?

编辑:正如@Michael Fehr所指出的,在最初的mcrypt_encrypt版本中,设置了IV(即最后一个参数:md5(md5($key)(,必须在解密中添加。因此,我添加了这一行:

$rijndael->setIV( md5(md5($key)) );

现在整个数据被正确地解密

在PHP 5.6加密中,您的代码是:

$enc_old = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $data, MCRYPT_MODE_CBC, md5(md5($key))));

其中最后一个md5(md5($key((用于初始化向量。

我错过了你(新的(PHP 7.4解密方法中IV的设置,因为你在CBC模式中使用AES,这需要IV

正如你自己发现的,你应该添加行

$rijndael->setIV( md5(md5($key)) );

让你的解密工作。

最新更新