MCrypt rijndael-256 转换为 OpenSSL aes-256-ecb

6

由于 Mcrypt 已被弃用,我们希望在我们的代码中使用 OpenSSL,因为我们的服务器已经使用了 PHP 7.2.4。

我已经使用以下代码进行加密/解密。

//加密

function encrypt($text, $salt='') {
    if ($text == "") {
        return "";
    }

    if ($salt == "") {
        $salt = 'DiAo74dOO09T48YESmuvbS0T';
    }

    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
}

//解密

function decrypt($text, $salt = '') {
    if ($text == "") {
        return "";
    }

    if ($salt == "") {
        $salt = 'DiAo74dOO09T48YESmuvbS0T';
    }

    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $salt, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}

AFdT9sa81krHkp/GoYCSwh7/lZn/gLZLHJSldi5/QCU= 这个字符串是使用上述加密函数加密的,但我想使用 OPENSSL 对其进行解密。我使用了以下代码对其进行解密:

$string = 'AFdT9sa81krHkp/GoYCSwh7/lZn/gLZLHJSldi5/QCU=';   
$output = false;
$secret_key = 'DiAo74dOO09T48YESmuvbS0T';   
$secret_iv1 = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-256-ECB'));
$secret_iv = bin2hex($secret_iv1);
$key = hash('sha256', $secret_key);    
$iv = substr(hash('sha256', $secret_iv), 0, 16);

$output = base64_encode(openssl_encrypt($string, 'aes-256-ecb', $key, OPENSSL_RAW_DATA));

我希望得到解密后的输出结果:durhs-14767-w0163j1-89047 感谢您的回复。


请重新格式化您的代码。 另外,我不清楚您实际在询问什么。 - hellow
您不能在启用ECB模式的加密算法中使用IV。 - IsThisJavascript
这可能会引起兴趣 https://dev59.com/G7Lma4cB1Zd3GeqPWCJ7#54887672 - Tschallacka
1个回答

7

很遗憾,您走错了路。

参考:

http://php.net/manual/en/function.mcrypt-encrypt.php#117667

https://en.wikipedia.org/wiki/Advanced_Encryption_Standard

AES是Rijndael的一种变体,具有固定的128位块大小和128、192或256位的密钥大小。相比之下,Rijndael规范本身是指定块和密钥大小可以是32位的任意倍数,最小为128位,最大为256位。
因此,您不能使用OpenSSL的AES-256来解密MCrypt的输出。
一些可能的方法:
1.继续使用PECL的mcrypt扩展程序(幸运的是,它仍然存在),直到您完全替换了遗留数据。
2.在PHP中重写正确的RIJNDAEL-256密码。

4
这真是太糟糕了。我理解为什么他们弃用了mcrypt,但如果你已经使用MCRYPT_RIJNDAEL_256加密了数据,却没有提供替代方案,那就像是被踢了一下要害。现在很高兴有一个PECL扩展可用,但实际上应该提供一个本地的、无需修改即可替换的替代方案。 - Mahn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接