Python 如何实现AES/DES加密和解密

https://www.cnblogs.com/eliwang/p/14880121.html

1、DES实现 (ECB模式没有IV(初始化向量))

import base64

from Crypto.Cipher import DES
from Crypto.Util.Padding import pad


def encrypt(key, text, mode):
    '''
    DES加密
    :param key: 密钥
    :param text: 待加密文本
    :param mode: 模式
    :return:
    '''
    key = key.encode('utf-8')
    text = text.encode('utf-8')
    pad_text = pad(text, DES.block_size, style='pkcs7')
    cipher = DES.new(key, mode)
    enc_data = cipher.encrypt(pad_text)
    return base64.b64encode(enc_data).decode('utf-8')


def decrypt(key, text, mode):
    '''
    DES解密
    :param key: 密钥
    :param text: 待解密文本
    :param mode: 模式
    :return:
    '''
    new_key = key.encode('utf-8')
    new_text = base64.b64decode(text)  # base64解码
    cipher = DES.new(new_key, mode)
    dec_data = cipher.decrypt(new_text)
    print(dec_data)
    return dec_data[:-dec_data[-1]].decode('utf-8') # 去除末尾填充的字符


if __name__ == "__main__":
    key = '12345678'
    pwd = '密码'
    enc_pwd = encrypt(key, pwd, DES.MODE_ECB)
    print(enc_pwd)
    dec_data = decrypt(key, enc_pwd, DES.MODE_ECB)
    print(dec_data)
View Code

2、AES实现

# coding:utf-8
import base64
from Crypto.Cipher import AES

class AESCrypt:
    def __init__(self,key,mode,iv):
        self.key = key # 密钥
        self.mode = mode # 模式
        self.iv = iv #初始化向量

    def encrpyt(self,text):
        '''加密'''

        num = AES.block_size - len(text) % AES.block_size #需要填充的字符个数
        text_pad = (text + num*chr(num)).encode('utf-8') #填充后的字节串
        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 = decrypt_data[:-decrypt_data[-1]].decode()#去除多余字符
        return res


if __name__ == '__main__':
    #key = random._urandom(16) 可以利用random模块随机生成
    key = b'\xc7(\xa4rq{\x89r\xd05kH\xbf^\x8a\x16' #密钥,长度可以是16,24或32个字节
    mode = AES.MODE_CBC
    iv = b'-\x95)\x82\x1a\x00\xde/^:\xd3\xbeXK9\xd2' #初始化向量,固定16个字节长度
    aes = AESCrypt(key,mode,iv)
    text = input('请输入需要AES加密的数据:')
    en_data = aes.encrpyt(text)
    print('%s 经过加密得到:%s'%(text,en_data))
    de_data = aes.decrypt(en_data)
    print('%s 经过解密得到:%s'%(en_data,de_data))
View Code

 

posted @ 2023-03-19 21:09  saaas  阅读(50)  评论(0编辑  收藏  举报