解决AES算法CBC模式加密字符串后再解密出现乱码问题

Posted cposture

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决AES算法CBC模式加密字符串后再解密出现乱码问题相关的知识,希望对你有一定的参考价值。

问题

在使用 AES CBC 模式加密字符串后,再进行解密,解密得到的字符串出现乱码情况,通常都是前几十个字节乱码;

复现

因为是使用部门 cgi?AESEncryptUtil 库,找到问题后,在这里复现不太方便,这里使用 python 进行复现,可以方便复现。

#!/usr/bin/env python 
#coding=utf-8 
from Crypto.Cipher import AES ?

PADDING = '\0' 

if __name__ == "__main__":? 
? ? pad_it = lambda s: s+(16 - len(s)%16)*PADDING? 
? ? key = '0123456789abcdef'? 
? ? data = pad_it('luffichen0123456789abcdef') 
? ? aes_util = AES.new(key, AES.MODE_CBC, b'0000000000000000')?
? ??crypt = aes_util.encrypt(data) 
? ? print(base64.b64decode(crypt))
? ? print(data) 
? ? # 使用同一个 aes_util 会导致乱码 
? ? recovery = aes_util.decrypt(crypt) 
? ? print(recovery)

输出结果:
技术分享图片

结论

在 CBC 模式,同个AES对象,所有之前的加解密会影响下一次加解密(加密解密谁先谁后影响都一样),因为 CBC 是 Block chained 的,加密的时候是串行的,需要依赖上个块的加解密结果,可以理解为它是有记录中间状态的过程,所以下一次加解密使用原来的 AES 对象存在问题;ECB模式则没有这个问题;详细可以看 wiki:https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

解决方法

每次加解密都需要重新生成一个 AES 对象。

以上是关于解决AES算法CBC模式加密字符串后再解密出现乱码问题的主要内容,如果未能解决你的问题,请参考以下文章

AES在线加密解密-附AES128,192,256,CBC,CFB,ECB,OFB,PCBC各种加密解密源码

在 Android 中的 iOS AES/CBC/PKCS7Padding 128 位算法中加密的解密字符串的问题

php AES cbc模式 pkcs7 128位加密解密(微信小程序)

AES加密解密 助手类 CBC加密模式

IOS AES加密

关于AES加解密中CBC模式的IV初始化向量的安全性问题