解决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)

输出结果:
1525170642_62_w409_h55.png

结论

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

解决方法

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

转载于:https://www.cnblogs.com/cposture/p/9028892.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值