篇首语:本文由小编为大家整理,主要介绍了关于AES加解密中CBC模式的IV初始化向量的安全性问题相关的知识,希望对你有一定的参考价值。
参考技术A 前段时间,在研究HLS的AES加密,由于一个地方电视台的HLS流有AES加密,在查看了相关的加解密方案后发现使用的是简单的AES的CBC模式,在CBC的模式下,会设置一个IV,初始化向量。但是我在解密的时候,使用了一个由于理解错误而产生的一个错误IV居然也能解密视频并进行播放,于是就有了这篇张文章。目录
1.AES加密
2.需要导入的模块
3.定义好全局变量
4.编写加密函数
5.将密文解密
6.完整代码
AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;
AES有多种加密模式,其中CBC分组模式是SSL、IPSec的标准。使用CBC加密模式时需要提前给出一段初始化向量iv,因为明文分组都是根据前一个明文分组加密的,所以第一个明文分组需要用到iv来加密。
import base64from Crypto.Cipher import AES
iv = '1234567887654321'key = 'miyaoxuyao16ziji'data = 'hello world'
iv是初始化向量,第一组明文就是用它加密的
key是密钥,这里选择的长度是128比特,所以字符串的长度要固定在16
data就是需要加密的数据
# 将原始的明文用空格填充到16字节def pad(data): pad_data = data for i in range(0,16-len(data)): pad_data = pad_data + ' ' return pad_data
代码:
# 将明文用AES加密def AES_en(key, data): # 将长度不足16字节的字符串补齐 if len(data) < 16: data = pad(data) # 创建加密对象 AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8")) # 完成加密 AES_en_str = AES_obj.encrypt(data.encode("utf-8")) # 用base64编码一下 AES_en_str = base64.b64encode(AES_en_str) # 最后将密文转化成字符串 AES_en_str = AES_en_str.decode("utf-8") return AES_en_str
解密是加密的逆过程,按着加密代码的逆序很容易就能写出
代码:
def AES_de(key, data): # 解密过程逆着加密过程写 # 将密文字符串重新编码成二进制形式 data = data.encode("utf-8") # 将base64的编码解开 data = base64.b64decode(data) # 创建解密对象 AES_de_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8")) # 完成解密 AES_de_str = AES_de_obj.decrypt(data) # 去掉补上的空格 AES_de_str = AES_de_str.strip() # 对明文解码 AES_de_str = AES_de_str.decode("utf-8") return AES_de_str
import base64from Crypto.Cipher import AESiv = '1234567887654321'key = 'miyaoxuyao16ziji'data = 'hello world'# 将原始的明文用空格填充到16字节def pad(data): pad_data = data for i in range(0,16-len(data)): pad_data = pad_data + ' ' return pad_data# 将明文用AES加密def AES_en(key, data): # 将长度不足16字节的字符串补齐 if len(data) < 16: data = pad(data) # 创建加密对象 AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8")) # 完成加密 AES_en_str = AES_obj.encrypt(data.encode("utf-8")) # 用base64编码一下 AES_en_str = base64.b64encode(AES_en_str) # 最后将密文转化成字符串 AES_en_str = AES_en_str.decode("utf-8") return AES_en_strdef AES_de(key, data): # 解密过程逆着加密过程写 # 将密文字符串重新编码成二进制形式 data = data.encode("utf-8") # 将base64的编码解开 data = base64.b64decode(data) # 创建解密对象 AES_de_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8")) # 完成解密 AES_de_str = AES_de_obj.decrypt(data) # 去掉补上的空格 AES_de_str = AES_de_str.strip() # 对明文解码 AES_de_str = AES_de_str.decode("utf-8") return AES_de_strdata = AES_en(key, data)print(data)data = AES_de(key, data)print(data)
以上是关于关于AES加解密中CBC模式的IV初始化向量的安全性问题的主要内容,如果未能解决你的问题,请参考以下文章