php mcrypt取消,php – Mcrypt弃用后如何解密?

我已将我的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作为替代方案.

这就是我从现在开始为内容做的事情.

但是我需要从旧内容中解密我的加密代码.

*编辑请求@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;

}

最佳答案 需要注意的重要一点是,如果它不是块大小的倍数,则

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'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值