from Crypto.Cipher import AES
class DeAesCrypt:
"""
AES-128-CBC 加/解密, Padding ZERO模式
"""
def __init__(self, data, key, pad):
"""
:param data: 加密后的字符串,或者需要加密的字符串
:param key: 随机的16位字符
:param pad: 填充方式
"""
self.key = key.encode()
self.data = data
self.pad = pad.lower()
self.iv=self.key
@property
def decrypt_aes(self):
"""AES-128-CBC解密"""
real_data = base64.b64decode(self.data)
my_aesDecrypt = AES.new(self.key, AES.MODE_CBC, self.iv)
decrypt_data = my_aesDecrypt.decrypt(real_data)
return self.get_str(decrypt_data)
@property
def encrypt_aes(self):
"""
AES-128-CBC加密
:return:
"""
my_aesEncrypte = AES.new(self.key, AES.MODE_CBC, self.iv)
gogo = self.get_16(self.data)
encrypt_data = my_aesEncrypte.encrypt(gogo)
return base64.b64encode(encrypt_data).decode('utf-8')
def get_str(self, decrypt_data):
"""解密后的数据去除加密前添加的数据
:param decrypt_data 解密后得到的bytes类型 字节数组
"""
if self.pad == "zero": # 去掉数据在转化前不足16位长度时添加的ASCII码为0编号的二进制字符
return ''.join([chr(i) for i in decrypt_data if i != 0])
elif self.pad == "pkcs7": # 去掉pkcs7模式中添加后面的字符
return ''.join([chr(i) for i in decrypt_data if i > 32])
elif self.pad == "pkcs7":
return ''.join([chr(i) for i in decrypt_data if i > 32])
else:
return "I don't know what happened,what's this '{}'".format(decrypt_data)
def get_16(self,encrypt_data):
"""加密的时候不足16位补充到16位,超过16位补齐为16的倍数长度
:param encrypt_data string类型要加密的字符
:return encrypt_data 符合加密要求的byte类型
"""
encrypt_data=encrypt_data.encode('utf-8')
length = 16
count = len(encrypt_data)
if count < length:
#加密的时候不足16位补充到16位
add = (length - count)
encrypt_data = encrypt_data + ('\x00' * add).encode('utf-8')
elif count > length:
#将bytes类型超过16位用0的二进制字符补齐为16的倍数长度
add = (length - (count % length))
encrypt_data = encrypt_data + ('\x00' * add).encode('utf-8')
else:
return
return encrypt_data