以上是针对ECB模式的加密解密,从这个例子中可以看出参数中有几个限制。
1. 秘钥必须为16字节或者16字节的倍数的字节型数据。
2. 明文必须为16字节或者16字节的倍数的字节型数据,如果不够16字节需要进行补全,关于补全规则,后面会在补全模式中具体介绍。
通过CBC模式例子:
from Crypto.Cipher import AES
password = b’1234567812345678’ #秘钥,b就是表示为bytes类型
iv = b’1234567812345678’ # iv偏移量,bytes类型
text = b’abcdefghijklmnhi’ #需要加密的内容,bytes类型
aes = AES.new(password,AES.MODE_CBC,iv) #创建一个aes对象
AES.MODE_CBC 表示模式是CBC模式
en_text = aes.encrypt(text)
print(“密文:”,en_text) #加密明文,bytes类型
aes = AES.new(password,AES.MODE_CBC,iv) #CBC模式下解密需要重新创建一个aes对象
den_text = aes.decrypt(en_text)
print(“明文:”,den_text)
输出:
密文: b’\x93\x8bN!\xe7~>\xb0M\xba\x91\xab74;0’
明文: b’abcdefghijklmnhi’
通过上面CBC模式的例子,可以简单看出CBC模式与ECB模式的区别:AES.new() 解密和加密重新生成了aes对象,加密和解密不能调用同一个aes对象,否则会报错`TypeError: decrypt() cannot be called after encrypt()`。
总结:
1. 在Python中进行AES加密解密时,所传入的密文、明文、秘钥、iv偏移量、都需要是bytes(字节型)数据。python 在构建aes对象时也只能接受bytes类型数据。
2.当秘钥,iv偏移量,待加密的明文,字节长度不够16字节或者16字节倍数的时候需要进行补全。
3. CBC模式需要重新生成AES对象,为了防止这类错误,我写代码无论是什么模式都重新生成AES对象。
#### 5. 编码模式
前面说了,python中的 AES 加密解密,只能接受字节型(bytes)数据。而我们常见的 `待加密的明文可能是中文`,或者`待解密的密文经过base64编码的`,这种都需要先进行编码或者解码,然后才能用AES进行加密或解密。反正无论是什么情况,在python使用AES进行加密或者解密时,都需要先转换成bytes型数据。
我们以ECB模式针对中文明文进行加密解密举例:
from Crypto.Cipher import AES
password = b’1234567812345678’ #秘钥,b就是表示为bytes类型
text = “好好学习天天向上”.encode(‘gbk’) #gbk编码,是1个中文字符对应2个字节,8个中文正好16字节
aes = AES.new(password,AES.MODE_ECB) #创建一个aes对象