import binascii
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
key = b"1234123412ABCDEF"
iv = b"ABCDEF1234123412"
data = b"zhiliao"
def encrypt():
# 參數(shù)key: 秘鑰,要求是bytes類型仙畦,并且長度必須是16嘿悬、24或32 bytes侨歉,因為秘鑰的長度可以為:128位青伤、192位菇篡、256位
# 參數(shù)mode: 加密的模式煞额,有ECB泛领、CBC等等荒吏,最常用的是CBC
# 參數(shù)iv: 初始向量,是CBC加密模式需要的初始向量渊鞋,類似于加密算法中的鹽
# 創(chuàng)建用于加密的AES對象
cipher1 = AES.new(key, AES.MODE_CBC, iv)
# 使用對象進行加密绰更,加密的時候,需要使用pad對數(shù)據(jù)進行填充锡宋,因為加密的數(shù)據(jù)要求必須是能被128整除
# pad參數(shù)內(nèi)容儡湾,第一個是待填充的數(shù)據(jù),第二個是填充成多大的數(shù)據(jù)执俩,需要填充成128位即16bytes
ct = cipher1.encrypt(pad(data, 16))
# 將加密后的結(jié)果(二進制)轉(zhuǎn)換成十六進制的或者其它形式
ct_hex = binascii.b2a_hex(ct)
return ct_hex
def decrypt(ct_hex):
# 創(chuàng)建用于解密的AES對象
cipher2 = AES.new(key, AES.MODE_CBC, iv)
# 將十六進制的數(shù)據(jù)轉(zhuǎn)換成二進制
hex_data = binascii.a2b_hex(ct_hex)
# 解密完成后徐钠,需要對數(shù)據(jù)進行取消填充,獲取原來的數(shù)據(jù)
pt = unpad(cipher2.decrypt(hex_data), 16)
return pt
if __name__ == '__main__':
print("原始數(shù)據(jù):",data)
enc_data = encrypt()
print("加密后的數(shù)據(jù):",enc_data)
dec_data = decrypt(enc_data)
print("解密后的數(shù)據(jù):", dec_data)
輸出結(jié)果
原始數(shù)據(jù): b'zhiliao'
加密后的數(shù)據(jù): b'e376c278392567b329e3f9dea06abe14'
解密后的數(shù)據(jù): b'zhiliao'