1. 程式人生 > 其它 >AES加解密

AES加解密

CBC模式
加密:

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
text = 'wo is liming' #需要加密的內容
while len(text.encode('utf-8')) % 16 != 0:  # 如果text不足16位的倍數就用空格補足為16位        
    text += '\0'
text=text.encode()
mode = AES.MODE_CBC #定義模式
key = '1234567890123456'.encode('utf-8') #祕鑰##祕鑰:必須是16位位元組或者24位位元組或者32位位元組(因為python3的字串是unicode編碼,需要 encode才可以轉換成位元組型資料)
iv = b'abcdabcdabcdabcd'   #偏移量--必須16位元組
cryptos = AES.new(key, mode, iv)   #建立一個aes物件
cipher_text = cryptos.encrypt(text)  #利用aes物件進行加密#b'\xf7t\xa0\x18 \x84-\xcco-\x91\xf5\xdb\x89\xe3\x88'
x=b2a_hex(cipher_text)  # 因為AES加密後的字串不一定是ascii字符集的,輸出儲存可能存在問題,所以這裡轉為16進位制字串#b'f774a01820842dcc6f2d91f5db89e388'
en_text = x.decode('utf-8') #轉換成python中的字串型別
#<class 'str'> f774a01820842dcc6f2d91f5db89e388
print(type(en_text),en_text)

解密:

from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex

mode = AES.MODE_CBC #定義模式
key = '1234567890123456'.encode('utf-8') #祕鑰
##祕鑰:必須是16位位元組或者24位位元組或者32位位元組(因為python3的字串是unicode編碼,需要 encode才可以轉換成位元組型資料)
iv = b'abcdabcdabcdabcd'   #偏移量--必須16位元組
cryptos = AES.new(key, mode, iv)   #建立一個aes物件

text = 'f774a01820842dcc6f2d91f5db89e388' #需要解密的內容
x=a2b_hex(text)  # 16進位制轉換成二進位制
b'\xf7t\xa0\x18 \x84-\xcco-\x91\xf5\xdb\x89\xe3\x88'
x=cryptos.decrypt(x)  #解密
# b'wo is liming\x00\x00\x00\x00'
x=bytes.decode(x).rstrip('\0')  #轉換成字串
#<class 'str'> wo is liming

print(type(x),x)