golang重写PHP版AES加密(aes-256-cfb)
背景
公司底层服务(PHP版)计划通过golang进行重写, 结束golang提升性能。
目前遇到PHP版本AES加解密,在golang环境下解密不出来的情况。 暂时还没找到解决方案。 先记录。
PHP版本 加解密方式
1 |
|
golang版本 加解密方式
1 |
|
python版本 加解密方式
1 |
|
分析思路
先分析我们选的加密算法aes-256-cfb8
aes
:顾名思义, 这里即是选择的加密算法
256
: iv向量位数。 一般是 128, 192, 256, 即对应的iv为 16字节, 24字节,32字节。通过查看PHP源码确认,如果自定义的iv长度不满足给定的长度, 比如使用256,需要设置32位字节的IV, 而我们只有24位的IV长度, 剩余的8位需要补0
cfb8
: 具体到aes下加密的模式,最后数字代表 加密算法的复杂度,越大复杂度越高, 有1, 8, 128位,三个选项。php, python都支持这三个选项。 但是golang官网只支持128位。
因此aes-256-cfb8
, 没办法直接转成golang模式。
cfb加密模式不需要内容字段补齐, 比如待加密的内容有两位, 加密结果也是仅有2位。 这个和其他加密模式不一样, 比如cbc
模式,就需要补齐内容。
因此目前能想到的解决方案是
- 调整PHP的加密方式, 改成aes-256-cfb(128位)加密, 适配golang 加密
- golang选择三方加密, 但是存在安全问题, 因为不是官方的,需要确认其方案是否靠谱 。
我这里更倾向于模式1。 我上面实现的例子, 即通过golang, python, php互解密的方式来呈现这种加密结果
## 参考文章
- aes加密相关
- aes图解
- golang, python 等其他语言互换解密 但是PHP版本和golang还是不能互转
- https://stackoverflow.com/questions/23897809/different-results-in-go-and-pycrypto-when-using-aes-cfb/23899604
- https://stackoverflow.com/questions/46346371/convert-openssl-aes-in-php-to-python-aes
- https://ekyu.moe/article/aes-cfb-in-golang-and-nodejs/
- https://takeai.silverpigeon.jp/tried-crypt-aes-mode-cfb-with-python-javascript-and-php-data-cross-each-other/
- https://stackoverflow.com/questions/23897809/different-results-in-go-and-pycrypto-when-using-aes-cfb