您的当前位置:首页>全部文章>文章详情

python中AES加密和解密

发表于:2024-07-02 10:38:21浏览:144次TAG: #python #AES #加密 #解密
引言

在python中如何使用AES进行加密解密?直接放出放源码

import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad,unpad
import random
import string

"""
AES加密解密
需要安装 pip install pycryptodome
"""
class Aes():
    def __init__(self) -> None:
        pass

    """
    ECB模式的加密
    :param data: 明文
    :param key: 16字节密钥
    :return: 密文
    """
    def ecbEncrypt(self,data,key):
        data = pad(data.encode('utf-8'),AES.block_size)
        aes = AES.new(key=key.encode('ascii'),mode=AES.MODE_ECB)
        result = base64.b64encode(aes.encrypt(data))
        return str(result,'utf-8')

    """
    ECB模式的解密
    :param data: 密文
    :param key: 16字节密钥
    :return: 明文
    """
    def ecbDecrypt(self,data,key):
        key = key.encode('utf-8')
        aes = AES.new(key=key,mode=AES.MODE_ECB)
        result = aes.decrypt(base64.b64decode(data))
        result = unpad(result,AES.block_size)
        return str(result,'utf-8')

    """
    CBC模式的加密
    :param data: 明文
    :param key: 16字节密钥
    :param iv: 偏移量
    :return: 密文
    """
    def cbcEncrypt(self,data,key,iv):
        key = key.encode('utf-8')
        iv = iv.encode('utf-8')
        data = pad(data.encode('utf-8'),AES.block_size)
        aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv)
        result = base64.b64encode(aes.encrypt(data))
        return str(result,'utf-8')

    """
    CBC模式的解密
    :param data: 密文
    :param key: 16字节密钥
    :param iv: 偏移量
    :return: 明文
    """
    def cbcDecrypt(self,data,key,iv):
        key = key.encode('utf-8')
        iv = iv.encode('utf-8')
        aes = AES.new(key=key,mode=AES.MODE_CBC,iv=iv)
        result = aes.decrypt(base64.b64decode(data))
        result = unpad(result,AES.block_size)
        return str(result,'utf-8')

    """
    生成一个指定长度的随机字符串,包含大小写字母和数字。
    :param length: 字符串的长度,默认为16。
    :return: 一个随机字符串。
    """
    def randomString(self,length=16):
        chars = string.ascii_letters + string.digits
        return ''.join(random.choice(chars) for _ in range(length))

    """
    生成一个指定长度的随机数字。
    :param length: 字符串的长度,默认为16。
    :return: 一个随机数字。
    """
    def randomInt(self,length=16):
        return str(random.randint(10**(length-1), (10**length)-1))

# 调用示例
# aes = Aes()
# plaintext = 'https://blog.dazijie.com/这个博客真是太棒了'
# key = aes.randomString()
# iv = aes.randomInt()
# b = aes.ecbEncrypt(plaintext,key)
# b1 = aes.ecbDecrypt(b,key)
# c = aes.cbcEncrypt(plaintext,key,iv)
# c1 = aes.cbcDecrypt(c,key,iv)
# print("加密前长度:{},加密前字符串为:{}\n加密后长度:{},ECB加密后字符串:{}\n解密后长度:{},解密后字符串:{}\n".format(len(plaintext),plaintext,len(b),b,len(b1),b1))
# print("加密前长度:{},加密前字符串为:{}\n加密后长度:{},CBC加密后字符串:{}\n解密后长度:{},解密后字符串:{}".format(len(plaintext),plaintext,len(c),c,len(c1),c1))
"""
输出
加密前长度:34,加密前字符串为:https://blog.dazijie.com/这个博客真是太棒了
加密后长度:88,ECB加密后字符串:HNDvaWEPdUqTkeIiULdQJra2sGJ8qnwVlRsnJjcYFbiVVZmGJjT76/EJhlqko+40HTd+pY7fkPuHHEb3UHdYqw==
解密后长度:34,解密后字符串:https://blog.dazijie.com/这个博客真是太棒了

加密前长度:34,加密前字符串为:https://blog.dazijie.com/这个博客真是太棒了
加密后长度:88,CBC加密后字符串:xmbyhjHq1EBPRhsDekNI5e1rVR1czMXnYwipnmJ7IzYvgamUIY8HihVB6l2LsKgwXmngc+UIMwmGC9HqQyIkrQ==
解密后长度:34,解密后字符串:https://blog.dazijie.com/这个博客真是太棒了
"""