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}】')

     

posted @ 2021-06-13 13:02  eliwang  阅读(3220)  评论(0编辑  收藏  举报