1.AES是什么?
高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥。
一种对称加密算法
2.AES的基本结构
AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同
3.利用Python库进行加解密
1.AES有两种模式:ECB和CBC模式。ECB模式和CBC 模式俩者区别就是 ECB 不需要 iv偏移量,而CBC需要。
2.ECB模式:
from Crypto.Cipher import AES
password = b'1234567812345678' #秘钥,b就是表示为bytes类型
text = b'abcdefghijklmnhi' #需要加密的内容,bytes类型
aes = AES.new(password,AES.MODE_ECB) #创建一个aes对象
# AES.MODE_ECB 表示模式是ECB模式
en_text = aes.encrypt(text) #加密明文
print("密文:",en_text) #加密明文,bytes类型
den_text = aes.decrypt(en_text) # 解密密文
print("明文:",den_text)
输出:
密文: b'WU\xe0\x0e\xa3\x87\x12\x95\\]O\xd7\xe3\xd4 )'
明文: b'abcdefghijklmnhi'
以上是针对ECB模式的加密解密,从这个例子中可以看出参数中有几个限制。
- 秘钥必须为16字节或者16字节的倍数的字节型数据。
- 明文必须为16字节或者16字节的倍数的字节型数据,如果不够16字节需要进行补全,关于补全规则,后面会在补全模式中具体介绍。
3.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'
注意:
- 在Python中进行AES加密解密时,所传入的密文、明文、秘钥、iv偏移量、都需要是bytes(字节型)数据。python 在构建aes对象时也只能接受bytes类型数据。
2.当秘钥,iv偏移量,待加密的明文,字节长度不够16字节或者16字节倍数的时候需要进行补全。
- CBC模式需要重新生成AES对象,为了防止这类错误,我写代码无论是什么模式都重新生成AES对象。
4.逆向中的AES
常见C语言中AES加密函数的参数部分:
AES(key, 16u, v7, v5, 16u);
AES_encrypto(密钥 , 初始化向量 , 明文 , 密文 , 填充模式)
初始化向量:对于某些加密模式(如CBC),IV用于确保相同的明文在每次加密时生成不同的密文。IV的长度与块大小相同,通常为128位(16字节)。
AES加密核心部分:
一个实例中解密的实现:
from Crypto.Cipher import AES
def aes_decrypt(key_str, ciphertext_hex):
# 将16进制字符串转换为字节序列
ciphertext_bytes = bytes.fromhex(ciphertext_hex)
# 将字符串密钥转换为字节序列
key = key_str.encode('utf-8')
# 创建AES解密器
cipher = AES.new(key, AES.MODE_ECB)
# 解密
decrypted_data = cipher.decrypt(ciphertext_bytes)
print(decrypted_data)
key_str = '1234567890123456'
ciphertext_hex = 'F3498AED82CE44E2357C23F5DCF897A43B6A7BFEE0467C591E301CBC38F99913'
plaintext_hex_result = aes_decrypt(key_str, ciphertext_hex)
参考文献:
Comments 2 条评论
博主 ktwydsshuv
真棒!
博主 白妍
好棒好棒好棒