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

当使用phpseclib(php7)替换不推荐使用的MCRYPT_RIJNDAEL(php5)时,如何获得完整的解密?,php,encryption,phpseclib,Php,Encryption,Phpseclib,我必须将一个脚本从PHP5.6升级到7.4,但我需要解密先前使用MCRYPT_RIJNDAEL_256加密的数据(已弃用)。我尝试使用(基于此),但得到的结果不完整(奇怪的字符)。如何获取正确的已解密数据 例如: $key = "0123456789abcdefghijklmn"; // len = 24 $data = "ABC123 abc123 ABC123 abc123 ABC123 abc123 ABC123 abc123"; PHP 5.6加

我必须将一个脚本从PHP5.6升级到7.4,但我需要解密先前使用
MCRYPT_RIJNDAEL_256
加密的数据(已弃用)。我尝试使用(基于此),但得到的结果不完整(奇怪的字符)。如何获取正确的已解密数据

例如:

$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解密=>OK:

$dec_old = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($enc_old), MCRYPT_MODE_CBC, md5(md5($key))), "\0");

echo $dec_old;
// ABC123 abc123 ABC123 abc123 ABC123 abc123 ABC123 abc123
使用
phpseclib
进行PHP 7.4解密:

require "vendor/autoload.php";

$rijndael = new \phpseclib\Crypt\Rijndael(\phpseclib\Crypt\Rijndael::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))用于初始化向量

我缺少(新的)PHP7.4解密方法中的IV设置,因为您在CBC模式下使用AES,这需要IV

正如你自己发现的那样,你应该添加这一行

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

要使您的解密工作正常。

使用“旧”PHP 5.6,您可以使用md5对$key进行两次哈希,以获得初始化向量的值,“新”7.4解密不会设置IV?谢谢!我添加了这一行:
rijndael->setIV(md5(md5($key))现在解密已满。我将在一个长的真实数据文件上测试它,看看它是否正确。你能把它作为一个答案,解释一下为什么它会改变一切吗?选择它作为正确答案。