日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

用python实现AES加密解密

發(fā)布時(shí)間:2025/3/15 python 8 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用python实现AES加密解密 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 背景
    • 測試數(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。