查阅的资料
mcrypt_decrypt函数在php7.1正式被禁用,后续使用openssl 进行加解密
openssl_encrypt 加密 openssl_decrypt 解密
踩过的坑
由于我的需求是aes-128-cbc zeropadding 加解密与python java等程序配合。
网上的文章大部分是正确的,但不太详细。 比如正确的openssl_encrypt 但没有告诉你zeropadding 需要的填充方式,或不正确的openssl_encrypt 告诉你加密后需要base64编码。
如何做?
不多说,经过百度得出 php7.1后使用openssl,得出两个关键函数
openssl_encrypt openssl_decrypt
1.openssl_encrypt 加密后不需要base64编码,它已经是base64了。注意
2.openssl_decrypt 解密也不需要先base64解码,直接丢入base64即可!
3.openssl_encrypt 的AES-128-CBC ZEROPADDING加密的明文需要先进行一次填充!
4. key 和 iv 均是16位,据说超出16位php会自动截断,未试过。
5. zeropadding 解密后需要trim一下。
function padZero($data, $blocksize = 16){
$pad = $blocksize - (strlen($data) % $blocksize);
return $data . str_repeat("\0", $pad);
}
function aesEn($data, $key, $iv){
return openssl_encrypt(padZero($data), "aes-128-cbc", $key, 2, $iv);
}
function aesDn($data, $key, $iv){
return trim(openssl_decrypt($data, "aes-128-cbc", $key, 2, $iv));
}
$encrypt = aesEn("调用加密,这里是加密的东西", "1234567891234567", "1234567891234567");
$decrypt = trim(aesDn($encrypt, "1234567891234567", "1234567891234567"))
padZero只用于给加密的明文后方补全空格 \0
而这样的数据解密后需要trim一下,去掉后方的空,否则会出现加密前对明文填充的填充符,这里是加密的东西\0x00\0x00 不等长
总结:
加密后不需要base64编码,只需要在加密前用zeropadding的方式处理一下明文长度。 解密需要将zeropadding方式处理的明文给删掉多余的空。
4093

被折叠的 条评论
为什么被折叠?



