gpt4 book ai didi

php - Mcrypt 弃用后如何解密?

转载 作者:可可西里 更新时间:2023-10-31 23:37:06 26 4
gpt4 key购买 nike

我已经将我的 php 版本更新到 7.1。我有使用 mcrypt 加密数据的功能。现在此功能已弃用。

如何在不返回到旧版本的 php 的情况下解密数据。

这是我使用的代码:

public function encrypt($plaintext) {
$ivSize = mcrypt_get_iv_size(self::CIPHER, self::MODE);
$iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM);
$ciphertext = mcrypt_encrypt(self::CIPHER, $this->key, $plaintext, self::MODE, $iv);
return base64_encode($iv.$ciphertext);
}

public function decrypt($ciphertext) {
$ciphertext = base64_decode($ciphertext);
$ivSize = mcrypt_get_iv_size(self::CIPHER, self::MODE);
if (strlen($ciphertext) < $ivSize) {
throw new Exception('Missing initialization vector');
}

$iv = substr($ciphertext, 0, $ivSize);
$ciphertext = substr($ciphertext, $ivSize);
$plaintext = mcrypt_decrypt(self::CIPHER, $this->key, $ciphertext, self::MODE, $iv);
return rtrim($plaintext, "\0");
}

有常量:

const CIPHER = MCRYPT_RIJNDAEL_128; // Rijndael-128 is AES
const MODE = MCRYPT_MODE_CBC;

看到推荐使用OpenSSL。这就是我从现在开始使用的。但是我如何使用这种方法解密旧数据?

谢谢

编辑:我知道我可以使用 OpenSSL 作为替代。这就是我从现在开始为内容所做的。但是我需要从我的旧内容中解密我的 mcrypted 代码。

*编辑请求@symcbean

尝试像这样使用 OpenSSL 解密:

public function decrypt($ciphertext) {
$ciphertext = base64_decode($ciphertext);

if (!function_exists("openssl_decrypt")) {
throw new Exception("aesDecrypt needs openssl php module.");
}

$key = $this->key;
$method = 'AES-256-CBC';
$ivSize = openssl_cipher_iv_length($method);
$iv = substr($ciphertext,0,$ivSize);
$data = substr($ciphertext,$ivSize);
$clear = openssl_decrypt ($data, $method, $key, 'OPENSSL_RAW_DATA'|'OPENSSL_ZERO_PADDING', $iv);

return $clear;
}

最佳答案

需要注意的重要一点是,如果输入数据不是 block 大小的倍数,mcrypt_encrypt 会用零填充输入数据。如果数据本身有尾随零,这会导致不明确的结果。

openssl_decrypt 不会自动删除零填充,因此您只剩下修剪尾随空值的可能性。

这是一个简单的例子:

$data = "Lorem ipsum";
$key = "1234567890abcdef";
$iv = "1234567890abcdef";

$encrypted = mcrypt_encrypt(
MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
echo bin2hex($encrypted) . "\n";

$decrypted = openssl_decrypt(
$encrypted, "AES-128-CBC", $key,
OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
echo var_export($decrypted, true) . "\n";
$result = rtrim($decrypted, "\0");
echo var_export($result, true) . "\n";

输出:

70168f2d5751b3d3bf36b7e6b8ec5843
'Lorem ipsum' . "\0" . '' . "\0" . '' . "\0" . '' . "\0" . '' . "\0" . ''
'Lorem ipsum'

关于php - Mcrypt 弃用后如何解密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42389290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com