【问题标题】:How to get complete decryption when using phpseclib (php 7) to replace deprecated MCRYPT_RIJNDAEL (php 5)?使用 phpseclib (php 7) 替换已弃用的 MCRYPT_RIJNDAEL (php 5) 时如何获得完全解密?
【发布时间】: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


【解决方案1】:

在你的 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)) );

让您的解密工作。

【讨论】:

    猜你喜欢
    • 2016-08-26
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2013-09-25
    • 2013-09-24
    相关资源
    最近更新 更多