python-aes 调用方法汇总

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 (本文使用)

官方包下载

安装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)

下载包

猜你喜欢

转载自blog.csdn.net/qq_15232177/article/details/115175778
今日推荐