用python实现AES加密解密

Posted 车子 chezi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用python实现AES加密解密相关的知识,希望对你有一定的参考价值。

背景

以蓝牙官方协议(V5.0)中的 sample data 为例子,看看怎么用 python 实现 AES 加密和解密。

测试数据


我们看看怎么由 SK 和 B0 得到 X1,然后从 X1 得到 B0

代码

from Crypto.Cipher import AES    # install pycryptodome
import binascii

SK = 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

说明:

  1. 为了使用 AES 模块,需要安装 pycryptodome

  2. binascii.unhexlify(hexstr) :返回由十六进制字符串 hexstr 表示的二进制数据。 hexstr 必须包含偶数个十六进制数字(可以是大写或小写),否则会引发 Error异常。

  3. 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;…

【End】

以上是关于用python实现AES加密解密的主要内容,如果未能解决你的问题,请参考以下文章

python实现aes加密解密

带你用Python实现AES对称加密

python实现AES加密

python 实现AES加解密

python 实现AES加解密

python 实现aes加密解密 ecb模式和其他模式