用python实现AES加密解密
文章目錄
- 背景
- 測試數據
- 代碼
- 遺留問題
- 補充(2021.10.6)
背景
以藍牙官方協議(V5.0)中的 sample data 為例子,看看怎么用 python 實現 AES 加密和解密。
測試數據
我們看看怎么由 SK 和 B0 得到 X1,然后從 X1 得到 B0
代碼
from Crypto.Cipher import AES # install pycryptodome import binasciiSK = binascii.unhexlify('99AD1B5226A37E3E058E3B8E27C2C666') # MSB - LSB B0 = binascii.unhexlify('49000000008024ABDCBABEBAAFDE0001') # LSB - MSB# 加密 plaintext = B0 rijn = AES.new(SK, AES.MODE_ECB) ciphertext = rijn.encrypt(plaintext) result = binascii.hexlify(ciphertext).decode('utf-8') print(result)# 解密 plaintext = rijn.decrypt(ciphertext) result = binascii.hexlify(plaintext).decode('utf-8') print(result)運行結果:
712eaaaae60603521d245e50786eefe4 49000000008024abdcbabebaafde0001說明:
為了使用 AES 模塊,需要安裝 pycryptodome
binascii.unhexlify(hexstr) :返回由十六進制字符串 hexstr 表示的二進制數據。 hexstr 必須包含偶數個十六進制數字(可以是大寫或小寫),否則會引發 Error異常。
binascii.hexlify(data): 返回二進制數據 data 的十六進制表示形式。 data 的每個字節都被轉換為相應的 2 位十六進制表示形式。因此返回的字節對象的長度是 data 的兩倍。
遺留問題
我對字節序這塊比較困惑,網上說 AES 是按照字節來加密的,可以認為明文是一個字節一個字節送進加密引擎,所以應該是低字節在前面;那 KEY 應該是什么順序呢?是大端嗎?
我嘗試用 http://www.efgh.com/software/rijndael.htm 的代碼實現,發現在下面的函數中:
int rijndaelSetupEncrypt(uint32_t *rk, const uint8_t *key, int keybits)
第二個參數 key,應該是從 MSB 到 LSB,也就是說 key[0] = 0x99,key[1] = 0xAD;…
補充(2021.10.6)
考慮到大小端的問題,有時候需要對字符串做端的轉換,添加一個小函數。
def reverse(key):out = ''for i in range(30, -1, -2):out = out + key[i:i+2]return out解釋一下,假定 key 字符串的長度是 32 個字符
循環中 i 的取值是 30,28,26,…,0
這樣就可以構成切片 key[30:32] , key[28:30] , key[26:28] , … , key[0:2],把它們拼在一起就可以得到結果。
【End】
總結
以上是生活随笔為你收集整理的用python实现AES加密解密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 多线程中的 join 和
- 下一篇: wxpython界面切换_wxpytho