对称加密算法
1.对称加密
1.1 AES加密
- AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是同一个。
- 安装:pip install pycryptodome
- AES加密最常用的模式就是ECB模式和CBC模式,当然还有很多其它模式,他们都属于AES 加密。ECB模式和CBC模式两者区别就是ECB不需要iv偏移量,而CBC需要。
- 具体加密过程
-
参数作用及数据类型
- 秘钥 加密的时候用秘钥,解密的时候需要同样的秘钥才能解出来;数据类型为bytes
- 明文需要加密的参数;数据类型为bytes
- 模式 aes加密常用的有ECB和CBC模式(主要是这两个模式,还有其他模式),数据类型为aes类内部枚举类型
- iv偏移量这个参数在ECB模式下不需要,在CBC模式下需要;数据类型为bytes
-
长度
- 16:*AES-128*
- 24: *AES-192*
- 32: *AES-256*
-
mode 加密模式
- 常见的ECB,CBC
- ECB:是一种基础的加密方式,密文被分割成多组长度相等的块(不足补齐),然后单独一个个加密,一个个输出,组成密文
- CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或操作后在加密,这样的操作是为了增加破解难度
-
1.1.1 ECB加密案例:
from Crypto.Cipher import AES
import base64
key='1234567890123456'.encode()#秘钥
#秘钥:必须是16位字节或者24位字节或者32位字节
text='aaaaa is ddddddd' #需要加密的内容
text=text.encode()
print("完整text:",text)
aes=AES.new(key,AES.MODE_ECB)#创建一个aes对象
en_text=aes.encrypt(text) #加密明文
print("加密数据:",en_text)
en_text=base64.b64encode(en_text).decode()#将返回的字节型数据转化为base64编码
print(en_text) #rRPMWCaOBYahYnKUJzq65A==
- ECB解密:
from Crypto.Cipher import AES
import base64
key='123456780123456'.encode()#秘钥
model=AES.MODE_ECB#定义模式
aes=AES.new(key,model)#创建一个aes对象
test='3NeIhJsnhzy3Ojoquz+9eg=='.encode()#需要解密的文本
ecrypted_base64=base64.b64decode(text)#base64解码成字节流
str=aes.decrypt(ecrypted_base64).decode()#解密
print(str)
- 以上是针对ECB模式的加密解密,从这个例子中可以看出参数中有几个限制。
- 秘钥必须为16字节或者16字节倍数的字节型数据
- 明文必须为16字节或者16字节的倍数的字节型数据,如果不够16字节需要进行补全
#数据补全
while len(text.encode('utf-8'))%16!=0:
text+=\0
1.1.2 CBC加密
from Crypto.Cipher import AES
import base64
key='1234567890123456'.encode()#秘钥
text='aaaaaaa is dddddd'
#数据补全
while len(text.encode('utf-8'))%16!=0:
text+=\0
text=text.encode()
print("完整text:",text)
iv=b'abdcabcdabdcabcd' #偏移量---必须16字节
aes=AES.new(key,AES.MODE_CBC,iv)#创建一个aes对象
en_text=aes.encrypt(text)#加密明文
print("aes加密数据:::",en_text)
en_text=base64.b64encode(en_text).decode()#将返回的字节型数据转换成base64编码
print(en_text)
- CBC解密
from Crypto.Cipher import AES
import base64
key='1234567890123456'.encode()#秘钥
model=AES.MODE_CBC#定义模式
iv=b'abcdabcdabcdabcd'
aes=AES.new(key,model,iv)#创建一个aes对象
text='J8bwyhYt1chAPAGu8N6kKA=='.encode()
ecrypted_base64=base64.b64decode(text)
str=aes.decrypt(ecrypted_base64).decode()
print("aes解密数据::::",str)
- 注意
- 在python中进行AES加密解密时,所传入的密文、明文、秘钥、iv偏移量都需要是bytes(字节型)数据。python在构建aes对象时也只能接受bytes类型数据。
- 当秘钥、iv偏移量,待加密的明文,字节长度不够16字节或者16字节倍数的时候需要进行补全。
- CBC模式需要重新生成AES对象,为了防止这类错误,无论是什么模式都重新生成AES对象就可以了。