加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – Mcrypt弃用后如何解密?

发布时间:2020-12-13 16:08:57 所属栏目:PHP教程 来源:网络整理
导读:我已将我的php版本更新为7.1. 我有使用mcrypt加密数据的功能. 现在不推荐使用此功能. 无论如何我都可以通过回到旧版本的php来解密数据. 这是我使用的代码: public function encrypt($plaintext) { $ivSize = mcrypt_get_iv_size(self::CIPHER,self::MODE);
我已将我的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,$ivSize);
    $ciphertext = substr($ciphertext,$ivSize);
    $plaintext = mcrypt_decrypt(self::CIPHER,$ciphertext,$iv);
    return rtrim($plaintext,"");
}

使用常量:

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,$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,$data,MCRYPT_MODE_CBC,$iv);
echo bin2hex($encrypted) . "n";

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

输出:

70168f2d5751b3d3bf36b7e6b8ec5843
'Lorem ipsum' . "" . '' . "" . '' . "" . '' . "" . '' . "" . ''
'Lorem ipsum'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读