PHP 实现 AES-128-CBC-PKCS5Padding 加密
本文最后更新于:3 年前
PHP 实现 AES-128-CBC-PKCS5Padding 加密
最近在工作中负责对接 API,数据接⼝交互过程中,不可避免会有⼀些敏感数据的传输,为了使数据交互更加安全,因此对数据进行加密。对方的要求是对接口的业务数据进行
AES-128-CBC-PKCS5Padding
加密,然后再做Base64
编码将得到的最终字符串进行提交,也给到了加密方式对应的密钥(key)和初始化向量(偏移量)。
首先看到这个加密方式之后,就在 PHP 函数库中进行寻找,看看有没有对应的加密函数,然而找了一圈下来,发现并没有,需要自己实现,后了解到可以用 mcrypt 函数扩展实现,但是 mcrypt 函数 自 PHP 7.1.0 起就废弃了,强烈建议不要使用本函数,只好再寻找其他加密函数库,在手册的下方看到了 OpenSSL 函数,通过了解 openssl_encrypt(加密数据) 函数发现可以实现需求,openssl_encrypt 具体的使用方法请自行看手册,
实现函数如下:
1 |
|
自测通过,一脸得意地坐等联调。然后开始写其他业务去了,过了几天,结果一联调发现我加密的对方无法解密,对方加密的我无法解密,加密算法不匹配(挠头中。经过 Google 搜索相关问题,发现一句话(如下图),大概的意思就是说,在废弃的 mcrypt
加密库中,128 实际上指的是块大小而不是密钥大小,但是在 openssl
中的 aes-128-cbc
的 128 指的是密钥大小,也就是说,在使用有效的 256 位密钥时,它们都是 aes-256
,而如果要把 mcrypt
转为 openssl
的加密方式,mcrypt
的 128 需要写成 openssl
的 256 ,于是抱着试试看的态度,更改了一下 aes-128-cbc
为 aes-256-cbc
,然后再进行调试,发现联调通过了。不过具体的技术细节原理还不是很明白,先这样子修改使用,以后有时间再研究吧。
解决方案
- 解决的方案,是把加密方式
AES-128-CBC
替换成AES-256-CBC
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!