Cifrado y descifrado de Python Crypt

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

 

Supongo que te gusta

Origin blog.csdn.net/dance117/article/details/108149125
Recomendado
Clasificación