解决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 对象。

原文地址:https://www.cnblogs.com/cposture/p/9028892.html

时间: 2024-11-05 22:56:16

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

通过Jni实现AES的CBC模式加密解密

AES加密方式基本实现,出现一个问题就是代码的安全性.我们知道java层代码很容易被反编译,很有可能泄漏我们加密方式与密钥 内容,那我们该怎么办呢?我们可以使用c/c++实现加密,编译成So库的形式,可供java实现调用,这样就大大增强程序安全性,因为so反编译结果是 arm指令,没有java中smali那么易懂.完全使用c/c++实现可能会比较麻烦,其实我们也可以简化一部分,只将密钥使用jni实现,其它还是用java实现,这样会简单一些,下面是具体操作: (1)新建项目aes 在java类中添

python AES CBC模式加密

今天需要用到AES CBC模式加密,搜索了很久,终于加密成功,记录一下今天的理解. 首先要安装pycrypto库,不知道为什么在windows安装失败,在linux可以正常安装 http://tool.chacuo.net/cryptaes,https://tools.lami.la/jiami/aes,以下代码加密后结果与这两个网页加密后一样. 这里有几点要注意,key的长度要是16,24或32,text的长度要是16的倍数,不满足长度都会补全,补全的字符可以自己定义,比如key补全不一定要"

AES CBC模式下的Padding Oracle解密

*/--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-color: #292b

php加密字符串超时不可解密

<?php/** * 加密字符串在指定时间内解密有效 * @param  [type]  $string    明文字符串 * @param  string  $operation 解密值为DECODE,其它值为加密 * @param  string  $key       加密key * @param  integer $expiry    过期时间单位秒 * @return [type]             [description] */function str_encrypt($st

[加密]在AES的CBC模式下 pydes vs crypto

因为项目中有个非常重要的功能,并发量和访问量都很大,里面使用了pydes,总感觉它的性能不太好,从别人的对比来看,性能差距应该挺大,但还是自己测试下吧. 自己测试,心里更有数. 环境 macos 10.10.5 python2.7 pyDes (2.0.1) 纯python pycrypto (2.6.1) 底层依赖C 测试 由于加密,解密方式很多,这里只测试一种,大概看下在完成相似功能性能差别就好(对于加密算法的基本原理还要学习) pydes代码 #coding:utf-8 #file:pyd

AES算法加解密纯C语言实现

文件清单: AES算法实现:aes.c,aes.h AES算法CBC模式加解密封装:aes_util.c,aes_util.h BASE64编解码实现:base64.c,base64.h AES算法测试:aes_util_test.c aes.c: /********************************************************************* * Filename: aes.c * Author: Brad Conte (brad AT bradco

AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】

先简单从百度找来介绍: ? 1 2 3 4 5 6     密码学中的高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准Rijndael加密法, 是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界 所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日 发布于FIPS PUB197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对

AES加密CBC模式 IOS - Java 互通共用

AES加密模式和填充方式 算法/模式/填充                16字节加密后数据长度        不满16字节加密后长度AES/CBC/NoPadding             16                          不支持AES/CBC/PKCS5Padding          32                          16AES/CBC/ISO10126Padding       32                          16AE

AES中几种加密模式的区别:ECB、CBC、CFB、OFB、CTR

AES: aes是基于数据块的加密方式,也就是说,每次处理的数据时一块(16字节),当数据不是16字节的倍数时填充,这就是所谓的分组密码(区别于基于比特位的流密码),16字节是分组长度 分组加密的几种模式: ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文. CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度. CFB/OFB:实际上是一种反馈模式,目的也是增强破解的难度. FCB和