php7+中怎么使用openssl替代mcrypt进行AES加密解密

这篇文章主要介绍php7+中怎么使用openssl替代mcrypt进行AES加密解密,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

mcrypt十年过去,现在php7+中已经开始淘汰。官方给出掉提示:

php7+中怎么使用openssl替代mcrypt进行AES加密解密

mcrypt_get_block_size—获得加密算法的分组大小

Warning
ThisfunctionhasbeenDEPRECATEDasofPHP7.1.0.Relyingonthisfunctionishighlydiscouraged.

在php7中需要openssl替代,这里需要注意的是: 在mcrypt中对加密key长度没有限制要求,传入多少长度都会参加加密,但是在openssl_encrypt中。key长度只能是16长度,>16长度后,签名结果保持不变,这里是哥坑,在替代方案测试时候容易出错,具体直接上代码对比:

低于php7版本代码

classAES{
publicstaticfunctionencrypt($input,$key){
$blockSize=mcrypt_get_block_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_ECB);
$paddedData=static::pkcs5_pad($input,$blockSize);
$ivSize=mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_ECB);
$iv=mcrypt_create_iv($ivSize,MCRYPT_RAND);
$encrypted=mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$paddedData,MCRYPT_MODE_ECB,$iv);
returnbin2hex($encrypted);

}
privatestaticfunctionpkcs5_pad($text,$blocksize){
$pad=$blocksize-(strlen($text)%$blocksize);
return$text.str_repeat(chr($pad),$pad);
}
publicstaticfunctiondecrypt($sStr,$key){
$decrypted=mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
$key,
hex2bin($sStr),
MCRYPT_MODE_ECB
);
$dec_s=strlen($decrypted);
$padding=ord($decrypted[$dec_s-1]);
$decrypted=substr($decrypted,0,-$padding);
return$decrypted;
}
/**
*url安全的base64编码sunlonglong
*/
functionbase64url_encode($data){
returnrtrim(strtr(base64_encode($data),'+/','-_'),'=');
}
/**
*url安全的base64解码sunlonglong
*/
functionbase64url_decode($data){
returnbase64_decode(str_pad(strtr($data,'-_','+/'),strlen($data)%4,'=',STR_PAD_RIGHT));
}
}

$key='g87y65ki6e8p93av8zjdrtfdrtgdwetd';
$encrypt=AES::encrypt('123abc',$key);
$decrypt=AES::decrypt($encrypt,$key);
var_dump($encrypt,$decrypt);

加密结果:
da07f6363eb0024b4bdd264e5fd4a2f5

下面是php7以上。使用openssl加密:

classAES{

/**
*
*@paramstring$string需要加密的字符串
*@paramstring$key密钥
*@returnstring
*/
publicstaticfunctionencrypt($string,$key)
{

//openssl_encrypt加密不同Mcrypt,对秘钥长度要求,超出16加密结果不变
$data=openssl_encrypt($string,'AES-128-ECB',$key,OPENSSL_RAW_DATA);

$data=strtolower(bin2hex($data));

return$data;
}


/**
*@paramstring$string需要解密的字符串
*@paramstring$key密钥
*@returnstring
*/
publicstaticfunctiondecrypt($string,$key)
{
$decrypted=openssl_decrypt(hex2bin($string),'AES-128-ECB',$key,OPENSSL_RAW_DATA);

return$decrypted;
}
}


$encrypt=AES::encrypt('123abc','g87y65ki6e8p93av8zjdrtfdrtgdwetd');
$decrypt=AES::decrypt($encrypt,'g87y65ki6e8p93av8zjdrtfdrtgdwetd');
var_dump($encrypt,$decrypt);die;

加密结果:
8c927c42f93a83c5de763aa18e4e6c7d

虽然key长度32位,但是openssl_encrypt加密时候,key长度只使用了16长度,后面未参加签名,而mcrypt_encrypt会整个key参与加密,这样就会出现加密出来对结果不一致。造成困惑,key=g87y65ki6e8p93av8zjdrtfdrtgdwetd与key=g87y65ki6e8p93av结果都是一致对;

以上是“php7+中怎么使用openssl替代mcrypt进行AES加密解密”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2021-05-30 14:05:06
收藏
分享
海报
0 条评论
186
上一篇:html中如何设置网页背景 下一篇:html如何让字体加粗
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码