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