python-aes 调用方法汇总
测试的时候需要用到python构建十六进制数据流,发现全网的教程没一个写得详尽或用例符合我想要的,特别是byte数据流和补全padding方面的,故写下这篇文章。
加密AES
高级加密标准(Advanced Encryption Standard,AES),AES的区块长度固定为128位,密钥长度则可以是128,192或256位。其他自行百度。
AES 通常有以下几个重要输入
- 秘钥:加密的时候用秘钥,解密的时候需要同样的秘钥才能解出来
- 明文:需要加密的参数
- 模式:aes 加密常用的有 ECB 和 CBC 模式 (本文只介绍CBC)
- iv 偏移量:这个参数在 ECB 模式下不需要,在 CBC 模式下需要
padding模式方面
- ZeroPadding
- PKCS7Padding
- PKCS5Padding (本文使用)
官方包下载
- 基于python3以上
- 官方pycrytodome
安装python-aes
pip3 install pycrytodome
使用样例
加载
from Crypto.Cipher import AES
实现AES128 CBC模式+PKCS5_Padding
class AES128_CBC_Crypt(object):
def __init__(self, key, iv):
self.key = key
self.mode = AES.MODE_CBC
self.length = 16
self.iv = iv
def encrypt(self, text):
cryptor = AES.new(self.key, self.mode, self.iv)
count = int(len(text)/self.length)
rest = self.length - len(text)%self.length
restf = len(text)%self.length
cipher_data = b''
i=0
while i < count:
data = text[0+i*self.length:self.length+i*self.length]
cipher_data += cryptor.encrypt(data)
i+=1
restBuf = bytearray()
if restf != 0:
tmp = text[-restf:]
i=0
while i < restf:
restBuf.append(tmp[i])
i+=1
i=0
while i < rest:
restBuf.append(rest)
i+=1
cipher_data += cryptor.encrypt(restBuf)
return str(cipher_data.hex())
def decrypt(self, text):
cryptor = AES.new(self.key, self.mode, self.iv)
if (len(text) % self.length) != 0 :
return None
count = int(len(text)/self.length)
cipher_data = b''
i=0
while i < count:
data = text[0+i*self.length:self.length+i*self.length]
cipher_data += cryptor.decrypt(data)
i+=1
rest = cipher_data[self.length-1]
if rest > self.length or rest == 0 :
return None
return str(cipher_data[:-rest].hex())
使用(已验证),适合byte数据流,单片机输出十六进制数据流
key='68656C6C6F776F726C64112233445566'
iv='00000000000000000000000000000000'
context='01020304050607080910'
encryData=''
decryData=''
ase=AES128_CBC_Crypt(bytes.fromhex(key), bytes.fromhex(iv))
encryData=ase.encrypt(bytes.fromhex(context))
decryData=ase.decrypt(bytes.fromhex(encryData))
print(encryData)
print(decryData)