解决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模式加密字符串后再解密出现乱码问题的更多相关文章
- Python实现AES的CBC模式加密和解密过程详解 和 chr() 函数 和 s[a:b:c] 和函数lambda
1.chr()函数 chr() 用一个范围在 range(256)内的(就是0-255)整数作参数,返回一个对应的字符. 2.s[a:b:c] s=(1,2,3,4,5) 1>. s[a]下标访 ...
- 通过Jni实现AES的CBC模式加密解密
AES加密方式基本实现,出现一个问题就是代码的安全性.我们知道java层代码很容易被反编译,很有可能泄漏我们加密方式与密钥 内容,那我们该怎么办呢?我们可以使用c/c++实现加密,编译成So库的形式, ...
- AES采用CBC模式128bit加密工具类
写在前面 安全测试ECB模式过于简单需要改为CBC模式加密以下为工具类及测试 AESUtils.java package com.sgcc.mobile.utils; import sun.misc. ...
- Android DES加密的CBC模式加密解密和ECB模式加密解密
DES加密共有四种模式:电子密码本模式(ECB).加密分组链接模式(CBC).加密反馈模式(CFB)和输出反馈模式(OFB). CBC模式加密: import java.security.Key; i ...
- javascript JS CryptoJS DES加解密CBC模式与C#DES加解密相同互通
我们只知道不同的语言解密要相互通用,就需要遵循相同的加密方式,然而在具体做技术预研的时候,就发现会遇到很多问题,网上找的资料也是比较片面,所以我踩了坑,并且把解决方案和相关资料源码提供出来,给需要的朋 ...
- php加密字符串超时不可解密
<?php/** * 加密字符串在指定时间内解密有效 * @param [type] $string 明文字符串 * @param string $operation 解密值为DE ...
- [加密]在AES的CBC模式下 pydes vs crypto
因为项目中有个非常重要的功能,并发量和访问量都很大,里面使用了pydes,总感觉它的性能不太好,从别人的对比来看,性能差距应该挺大,但还是自己测试下吧. 自己测试,心里更有数. 环境 macos 10 ...
- java 运用Cipher加密再解密后会变乱码。解决方案!
同样的方法类用main调用加解密都正常,就是当用到业务就是加密后再解密变乱码. 后来发现同样的内容加密后的内容竟不相同. 经调试发现 encryptData.getBytes() 转为字节是的使用 C ...
- C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解
之前工作上需要用C++把软件生成的用户序列号用des加密cbc的模式,加密后为二进制,转化为十六进制,然后提供给java写的授权码管理平台. java平台会根据用户序列号,生成一个授权码,授权码是用r ...
随机推荐
- Hive操作语句实例讲解(帮助你了解 桶 bucket)
http://blog.sina.com.cn/s/blog_66474b16010182yu.html这篇可以较好地理解什么是外部表external #创建表人信息表 person(String ...
- AngularJS进阶(二十八)解决AngualrJS页面刷新导致异常显示问题
解决AngualrJS页面刷新导致异常显示问题 绪 俗话说,细节决定成败,编程亦是如此.编程过程中我们可能会不自觉的忽视一些细节问题,殊不知,这些细节正是导致页面显示出现问题的地方.今略举一例,与君共 ...
- Java-ServletResponse-ServletResponseWrapper
/** * Defines an object to assist a servlet in sending a response to the client. * The servlet conta ...
- 一键安装 redmine on windows 和发邮件设置
一键安装 redmine on windows 和发邮件设置 1)使用http://bitnami.org/stack/redmine一键安装redmine (windows). 2)修改下面的文件: ...
- PS 图像调整算法——反相
这个顾名思义,对图像做减法. Image_new=1-Image_old; 原图: 反相:
- ORACLE中用rownum分页并排序的SQL语句
ORACLE中用rownum分页并排序的SQL语句 以前分页习惯用这样的SQL语句: select * from (selectt.*,rownum row_num frommytable t ord ...
- linux上部署rmi+memcache服务
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/50020437 最近在学习linux上搭建Rmi+Memca ...
- android.os.NetworkOnMainThreadException异常如何解决
android.os.NetworkOnMainThreadException 08-08 17:53:30.635 I/ArticleTable(22461): 添加成功 58 08-08 17:5 ...
- Oracle 中Return 和exit的区别
在Oracle存储过程中,使用Return 时,如果执行到Return语句,会跳出整个语句(如果是循环,会跳出整个循环),将不再执行,也就是结束了整个存储过程. 下面就用一个例子来说明一下 ,这个存储 ...
- MOOS学习笔记——多线程
/* * A simple example showing how to use a comms client */ #include "MOOS/libMOOS/Comms/MOOSAsy ...