php7.2不支持mcrypt_decrypt怎么办,mcrypt_decrypt能解密,openssl_decrypt无效解决办法

Mcrypt是php常用的加密解密扩展,但在php7.1提示deprecated弃用,php7.2则直接无法使用,替换方式是openssl_decrypt.但是在实际切换中很多地方并不能直接使用,那么php7.2不支持mcrypt_decrypt怎么办,主机观察提供mcrypt_decrypt能解密,openssl_decrypt无效解决办法

php7.2不支持mcrypt_decrypt怎么办,mcrypt_decrypt能解密,openssl_decrypt无效解决办法

加密解密背景知识介绍

现代密码中的加密体制一般分为对称加密体制(Symmetric Key Encryption)和非对称加密体制(Asymmetric Key Encryption)。对称加密又分为分组加密和序列密码。

分组密码:也叫块加密(block cyphers),一次加密明文中的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组,有 ECB、CBC、CFB、OFB 四种工作模式。

序列password。也叫流加密(stream cyphers),一次加密明文中的一个位。是指利用少量的密钥(制乱元素)通过某种复杂的运算(password算法)产生大量的伪随机位流,用于对明文位流的加密。

解密是指用相同的密钥和password算法及与加密相同的伪随机位流,用以还原明文位流。

mcrypt_decrypt是什么

mcrypt_encrypt和mcrypt_decryptphp使用内置的字符串加密解密方法,目前已经逐渐被弃用,在 PHP7 之前,这个扩展是随 PHP 安装包一起内置发布的,但是现在新版本的 PHP 中已经没有了,需要使用这个扩展的话我们需要单独安装,并且在使用的时候也是会报出过时的警告的。

Mcrypt 包含很多的模块和算法。算法就不用多解释了,就是用来对数据进行加密的方式。而模块,包括 CBC, OFB,CFB 和 ECB 这几种,是一系列的分组、流式加密的模式。

openssl_encrypt的加密和解密

DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥被忽略。所谓对称性加密即加密和解密密钥相同,对称性加密一般会按照固定长度,把待加密字符串分成块,不足一整块或者刚好最后有特殊填充字符。

常见的填充模式有: pkcs5、pkcs7、iso10126、ansix923、zero。

加密模式有:DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。

加密方法:

openssl_encrypt($data, $method, $password, $options, $iv)

解密方法:

openssl_decrypt($data, $method, $password, $options, $iv)

openssl_decrypt 解密取代mcrypt_decrypt问题

为什么mcrypt_decrypt能解开,openssl_decrypt却解不开?

在openssl_decrypt中options参数0和1都是默认采用PKCS7方式去填充的,所以解密失败,而参数为2时,则是采用去0方式解密的,归根结底是openssl_decrypt解密方式不对,options参数使用OPENSSL_ZERO_PADDING或者是2,就能解开。

MCrypt rijndael-128到OpenSSL aes-128-ecb转换

$ret = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, ‘v466vazrnpeng66r’, base64_decode(‘N3fthdRHiCTmj2kyoiUOlw==’), ‘ecb’);

$ret = rtrim($ret, “”);

var_export($ret);

$ret = openssl_decrypt(‘N3fthdRHiCTmj2kyoiUOlw==’, ‘AES-128-ECB’, ‘v466vazrnpeng66r’,OPENSSL_ZERO_PADDING);

$ret = rtrim($ret, “”);

var_export($ret);

为什么要加OPENSSL_ZERO_PADDING,我的理解是mcrypt_decrypt可以解开这个加密串,应该密文采用的填充方式应该是补0填充的,所以openssl解密需要指定OPENSSL_ZERO_PADDING填充方式解密。因为openssl_encrypt中options选项0和1默认采用都是PKCS7填充方式,而OPENSSL_ZERO_PADDING是补0填充。

在openssl_encrypt中参数option的含义

0 : 自动对明文进行 padding, 返回的数据经过 base64 编码.

1 : OPENSSL_RAW_DATA, 自动对明文进行 padding, 但返回的结果未经过 base64 编码.

2 : OPENSSL_ZERO_PADDING, 自动对明文进行 0 填充, 返回的结果经过 base64 编码. 但是, openssl 不推荐 0 填充的方式, 即使选择此项也不会自动进行 padding, 仍需手动 padding.

本文来自网络,不代表主机观察立场,如若转载,请注明出处:http://www.lookvps.com/mcrypt_decrypt.html