from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
class AES_enc():
def __init__(self, key, iv):
self.block_size = AES.block_size #设置block_size的大小为16字节,也就是128位
self.key = key
self.iv = iv
self.mode = AES.MODE_CBC #采用CBC模式
#加密时自动补全16位,填充内容是“16-len(s)”对应的ascii字符
self.padding_chr = lambda s: s + (self.block_size - len(s) % self.block_size) * chr(self.block_size - len(s) % self.block_size)
#解密时反向剪裁补充字符
self.unpadding_chr = lambda s: s[0:-ord(s[-1])]
#加密
def encrypt(self, text):
cryptor = AES.new(self.key, self.mode, self.iv)
text = self.padding_chr(text)
ciphertext = cryptor.encrypt(text)
#把加密后的字符串转化为16进制字符串 ,也可以转换为base64加密的内容,使用b2a_base64(ciphertext)或者base64.urlsafe_b64decode(ciphertext)
return b2a_hex(ciphertext).decode("utf-8")
# 解密
def decrypt(self, text):
cryptor = AES.new(self.key, self.mode, self.iv)
plain_text = cryptor.decrypt(a2b_hex(text)).decode("utf-8")
return self.unpadding_chr(plain_text)