php7 中怎么使用openssl替代mcrypt进行aes加密解密-mile米乐体育
开发技术
2021年05月30日 14:05
0
这篇文章主要介绍php7 中怎么使用openssl替代mcrypt进行aes加密解密,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
mcrypt十年过去,现在php7 中已经开始淘汰。官方给出掉提示:
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加密解密”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注恰卡编程网行业资讯频道!
展开全文