php openssl_decrypt 解密取代mcrypt_decrypt问题

mcrypt_decrypt可以正常解密 ,openssl_decrypt没法解密?返回false

    $ret =  openssl_decrypt('N3fthdRHiCTmj2kyoiUOlw==', 'AES-128-ECB', 'v466vazrnpeng66r');
    var_export($ret);
    $ret = mcrypt_decrypt('rijndael-128', 'v466vazrnpeng66r', base64_decode('N3fthdRHiCTmj2kyoiUOlw=='), 'ecb');
    $ret = rtrim($ret, "\0");
    var_export($ret);die;
阅读 10.8k
2 个回答

openssl_decrypt使用的时候第四个参数填写为OPENSSL_ZERO_PADDING即可解开


$ret = openssl_decrypt('N3fthdRHiCTmj2kyoiUOlw==', 'AES-128-ECB', 'v466vazrnpeng66r',OPENSSL_ZERO_PADDING);
$ret = rtrim($ret, "\0");
var_export($ret);

$ret = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, 'v466vazrnpeng66r', base64_decode('N3fthdRHiCTmj2kyoiUOlw=='), 'ecb');
$ret = rtrim($ret, "\0");
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的含义
options :

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

为啥mcrypt_decrypt(),base64解码了一下,而openssl_decrypt就不解码了呢 老哥

推荐问题