python如何实现AES/DES加密和解密?
一、引言
- DES是对称性加密里面常见一种,全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),即8个字节,超过位数密钥被忽略。所谓对称性加密,加密和解密密钥相同。对称性加密一般会按照固定长度(8个字节),把待加密字符串分成块。不足一整块可以使用特殊填充字符。常见的加密解密模式有(ECB,CBC,CTR,OFB,CFB,EAX,OPENPGP)。常见的填充模式有: 'pkcs5','pkcs7','iso10126','ansix923','zero' 类型
- AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。AES的区块长度固定为128 位,即16个字节,密钥长度则可以是128,192或256位(即16、24和32个字节)。AES分为几种模式,比如ECB,CBC,CFB等等,这些模式除了ECB由于没有使用IV(初始向量)而不太安全,其他模式差别并没有太明显。DES中IV长度固定为8个字节,AES中IV长度固定为16个字节,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV。
- padding填充:以pkcs7填充为例,如果需要加密的数据的字节码长度不是块大小的整数倍就需要填充。比如数据长度是5个字节,DES就需要填充3个chr(3),即3个‘\x03’,而AES则需要填充13个chr(13)即13个‘\r’。如果数据长度是16个字节,恰好是整数倍,则分别额外填充一个块大小的数据,比如DES则需要填充8个'\x08',而AES则需要填充16个'\x10'
二、安装pycryptodome算法库
pip3 install pycryptodome==3.11.0
- 高版本python中,报SSLError异常时,可以尝试降级urllib3的版本使用:
pip install urllib3==1.26.20 --force-reinstall
三、代码实现
-
DES算法
# coding:utf-8 import base64 from Crypto.Cipher import DES from Crypto.Util.Padding import pad, unpad class DESCrypt: def __init__(self): self.key = b'12345678' # 密钥 self.mode = DES.MODE_CBC # 模式 self.iv = b'87654321' # 初始化向量 def encrpyt(self, text): '''加密''' text_pad = pad(text.encode('utf-8'), DES.block_size) # 填充后的字节串 crpytor = DES.new(self.key, self.mode, self.iv) # 生成算法对象 encrypt_data = crpytor.encrypt(text_pad) # 对数据进行加密 return base64.b64encode(encrypt_data).decode() def decrypt(self, text): '''解密''' data = base64.b64decode(text.encode()) crpytor = DES.new(self.key, self.mode, self.iv) decrypt_data = crpytor.decrypt(data) # 对数据进行解密 res = unpad(decrypt_data, DES.block_size).decode() # 去除多余字符 return res if __name__ == '__main__': des = DESCrypt() data = '123456' encrypt_data = des.encrpyt(data) print(f'【{data}】加密-->【{encrypt_data}】') decrypt_data = des.decrypt(encrypt_data) print(f'【{encrypt_data}】解密-->【{decrypt_data}】')
ECB模式没有IV(初始化向量)
-
AES算法
# coding:utf-8 import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad class AESCrypt: def __init__(self): self.key = b'0123456789abcdef' # 密钥 16、24或32字节 self.mode = AES.MODE_CBC # 模式 self.iv = b'0123456789abcdef' # 初始化向量 16字节 def encrpyt(self, text): '''加密''' text_pad = pad(text.encode('utf-8'), AES.block_size) # 填充后的字节串 crpytor = AES.new(self.key, self.mode, self.iv) # 生成算法对象 encrypt_data = crpytor.encrypt(text_pad) # 对数据进行加密 return base64.b64encode(encrypt_data).decode() def decrypt(self, text): '''解密''' data = base64.b64decode(text.encode()) crpytor = AES.new(self.key, self.mode, self.iv) decrypt_data = crpytor.decrypt(data) # 对数据进行解密 res = unpad(decrypt_data, AES.block_size).decode() # 去除多余字符 return res if __name__ == '__main__': aes = AESCrypt() data = '123456' encrypt_data = aes.encrpyt(data) print(f'【{data}】加密-->【{encrypt_data}】') decrypt_data = aes.decrypt(encrypt_data) print(f'【{encrypt_data}】解密-->【{decrypt_data}】')