python使用Crypto实现AES对称加密

it2025-10-28  6

使用Crypto实现对称加密

导入第三方库

pip install pycryptodome

代码:

# 需要导入库 pip install pycryptodome from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex from Crypto import Random class AesEncryption(object): def __init__(self, key, mode=AES.MODE_CFB): self.key = self.check_key(key) # 密钥key长度必须为16,24或者32bytes的长度 self.mode = mode # 随机生成16字节的字节流 self.iv = Random.new().read(AES.block_size) # 也可以定义一个16位的字符串iv,然后编码成字节流 # self.iv = iv.encode('utf-8') def check_key(self, key): """ 检测key的长度是否为16,24或者32bytes的长度 :param key: 密钥 :return: """ try: if isinstance(key, bytes): assert len(key) in [16, 24, 32] return key elif isinstance(key, str): assert len(key.encode()) in [16, 24, 32] return key.encode() else: raise Exception(f'密钥必须为str或bytes,不能为{type(key)}') except AssertionError: raise Exception('输入的密钥长度不正确') def check_data(self, data): """ 检测加密的数据类型 :param data: 需加密的报文 :return: """ if isinstance(data, str): data = data.encode('utf-8') elif isinstance(data, bytes): pass else: raise Exception(f'报文类型必须为str或bytes,不能为{type(data)}') return data def encrypt(self, data): """ 对报文进行加密 :param data: 需加密的报文 :return: """ data = self.check_data(data) cryptor = AES.new(self.key, self.mode, self.iv) return b2a_hex(cryptor.encrypt(data)).decode() def decrypt(self, data): """ 解密 :param data: :return: """ data = self.check_data(data) cryptor = AES.new(self.key, self.mode, self.iv) return cryptor.decrypt(a2b_hex(data)).decode() if __name__ == '__main__': key = 'dsf12j@34rt78gh.' data = 'hello world' aes = AesEncryption(key) encrypt_data = aes.encrypt(data) # 加密 decrypt_data = aes.decrypt(encrypt_data) # 解密 print('加密:{}'.format(encrypt_data)) print('解密:{}'.format(decrypt_data))

输出:

加密:e2adc66c2b13aceb1061cd 解密:hello world

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。 如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

最新回复(0)