【发布时间】:2020-12-15 02:53:35
【问题描述】:
我必须将脚本从 php 5.6 升级到 7.4,但我需要解密之前使用 MCRYPT_RIJNDAEL_256 加密的数据(已弃用)。我尝试使用phpseclib - Github(基于此SO answer),但我得到的结果不完整(奇怪的字符)。如何获得正确的解密数据?
例如:
$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))), "\0");
echo $dec_old;
// ABC123 abc123 ABC123 abc123 ABC123 abc123 ABC123 abc123
PHP 7.4 解密 phpseclib:
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(即the last parameter:md5(md5($key)),必须在解密中添加。因此,我添加了这一行:
$rijndael->setIV( md5(md5($key)) );
现在整个数据已正确解密。
【问题讨论】:
-
使用“旧”PHP 5.6 你用 md5 对 $key 两次散列作为初始化向量的值,“新”7.4 解密不设置 IV ?
-
谢谢!我添加了这一行:
$rijndael->setIV( md5(md5($key)) );现在解密已满。我将在一个很长的真实数据文件上对其进行测试,看看它是否正确。您能否将其发布为答案并解释为什么会改变一切?选择它作为正确答案。
标签: php encryption phpseclib