python加密解密
AES加密
简介
AES的全称是Advanced Encryption Standard,意思是高级加密标准。它的出现主要是为了取代DES加密算法的,因为我们都知道DES算法的密钥长度是56Bit,因此算法的理论安全强度是2的56次方。但二十世纪中后期正是计算机飞速发展的阶段,元器件制造工艺的进步使得计算机的处理能力越来越强,虽然出现了3DES的加密方法,但由于它的加密时间是DES算法的3倍多,64Bit的分组大小相对较小,所以还是不能满足人们对安全性的要求。于是1997年1月2号,美国国家标准技术研究所宣布希望征集高级加密标准,用以取代DES。AES也得到了全世界很多密码工作者的响应,先后有很多人提交了自己设计的算法。最终有5个候选算法进入最后一轮:Rijndael,Serpent,Twofish,RC6和MARS。最终经过安全性分析、软硬件性能评估等严格的步骤,Rijndael算法获胜。
在密码标准征集中,所有AES候选提交方案都必须满足以下标准:
分组大小为128位的分组密码。
必须支持三种密码标准:128位、192位和256位。
比提交的其他算法更安全。
在软件和硬件实现上都很高效。
AES密码与分组密码Rijndael基本上完全一致,Rijndael分组大小和密钥大小都可以为128位、192位和256位。然而AES只要求分组大小为128位,因此只有分组长度为128Bit的Rijndael才称为AES算法。本文只对分组大小128位,密钥长度也为128位的Rijndael算法进行分析。密钥长度为192位和256位的处理方式和128位的处理方式类似,只不过密钥长度每增加64位,算法的循环次数就增加2轮,128位循环10轮、192位循环12轮、256位循环14轮。
注意:
CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)
ECB加密不需要iv
安装
pip install pycryptodome
导入
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Util.Padding import unpad
import base64
加密解密流程(ECB模式,pkcs7填充模式)
初始化构造函数,此时的Mod为ECB
'''
@use: 构造函数
@parameter: 密钥
'''
def __init__(self,key):
self.__key = key.encode("UTF-8") # 将字符串转换成UTF-8的字节流
self.__mode = AES.MODE_ECB
AES加密
'''
@use: AES加密
@parameter:
data 需要加密的明文
@return:
加密后的密文(ECB模式,pkcs7填充)
'''
def encrypt(self, data):
cipher = AES.new(self.__key, self.__mode) # 传输key和mode进入AES类
# 将数据转换成UTF-8字节流后,用pksc7填充模式进行16位填充并加密
encrData = cipher.encrypt(pad(data.encode("UTF-8"), 16, "pkcs7"))
# 将加密过后的密文进行base64编码,之后转换成字符串类型得到密文
return str(base64.b64encode(encrData),encoding="UTF-8")
AES解密
'''
@use: AES解密
@parameter:
encrData 加密后的密文(ECB模式,pkcs7填充)
@return:
解密后的明文
'''
def decrypt(self, encrData):
cipher = AES.new(self.__key, self.__mode) # 传输key和mode进入AES类
encrData = bytes(encrData,"UTF-8") # 将密文字符串转换成UTF-8字节流
encrData = base64.b64decode(encrData) # 将密文字节流用base64编码
decr_code = cipher.decrypt(encrData) # 解密
# 用pksc7填充模式进行16位填充对解密数据进行转换,后转换成字符串形式得到明文
return str(unpad(decr_code,16,"pkcs7"),"UTF-8")