PHP7+ AES CBC nopadding[zeropadding]加解密

查阅的资料

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方式处理的明文给删掉多余的空。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值