Python:AES+Base64的加密与解密(ECB模式)

本篇记录使用 AES(ECB模式)+Base64 如何进行加密与解密

函数名称函数使用注意事项
pkcs7padding()该方法主要用于对需要加密的明文处理
因为明文 text 也必须为16字节或者16字节的倍数的字节型数据
计算需要填充的字符数量并与明文拼接,从而得到符合加密规则的明文数据
AES_Encryption()该方法需要传入 密钥secret_key、明文text
其中密钥长度和明文长度需要满足16的倍数,但一般密钥规则都是16位
所以方法中传递的明文text需要调用 pkcs7padding()方法进行填充处理
AES_Decrypt()该方法需要传入 密钥secret_key、密文ciphertext
其中密文 ciphertext 的长度要求为3的倍数
因为Base64编码后的字符除了英文字母和数字外还有三个字符’ + / =‘
其中’='只是为了补全编码后的字符数,所以可以用于密文填充处理

示例代码如下:

# -*- coding: utf-8 -*- 
# @Desc      :  AES加密、解密方法
# -*- -*- -*- -*- -*- -*-
import base64
from Crypto.Cipher import AES

def pkcs7padding(text):
    """明文使用PKCS7填充,padding:凑篇幅的文字 """

    # 明文 text 也必须为16字节或者16字节的倍数的字节型数据
    need_size = 16

    # 获取明文的长度
    text_length = len(text)

    # 获取明文编码转换后的字符长度
    bytes_length = len(text.encode('utf-8'))

    # 判断明文长度与编码转换后的字符长度是否相等
    # 1、如相等,返回明文长度length; 2、如不相等,返回编码转换后的字符长度bytes_length
    padding_size = text_length if (bytes_length == text_length) else bytes_length

    # 获取需要填充的字节数:16-(明文数据长度 % 16)
    padding = need_size - padding_size % need_size

    # 使用 chr(十进制整数) 方法从ASCII码表中获取对应编号的字符,并乘以字节个数,以获取需要填充的数据
    padding_text = chr(padding) * padding

    # 返回使用PKCS7填充后的数据:明文+需要填充的数据,使明文长度为16的倍数
    return text + padding_text


def AES_Encryption(secret_key=None,text=None):
    """ AES加密 ,python运行处理的是 unicode码,因此,在做编码转换时,通常需要以unicode作为中间编码 """

    # 秘钥 secret_key 必须为16字节或者16字节的倍数的字节型数据【项目中一般都是16字节】
    if (secret_key is None) or len(secret_key) == 0:
        secret_key = "1234567812345678"

    # 明文 text 也必须为16字节或者16字节的倍数的字节型数据,所以我们需要调用PKCS7填充明文的方法
    text =  pkcs7padding(text)

    # 1、创建一个aes对象,AES.MODE_ECB 表示模式是ECB模式
    aes = AES.new(secret_key.encode("utf-8"), AES.MODE_ECB)

    # 2、对明文进行编码加密
    en_text = aes.encrypt(text.encode('utf-8'))

    # 3、通过base64编码重新进行一次编码
    result = str(base64.b64encode(en_text), encoding='utf-8')

    return result




def AES_Decrypt(secret_key=None, ciphertext=None):
    """AES解密,ciphertext:密文"""

    # 秘钥 secret_key 必须为16字节或者16字节的倍数的字节型数据【项目中一般都是16字节】
    if (secret_key is None) or len(secret_key) == 0:
        secret_key = "1234567812345678"

    # 1、创建一个aes对象,AES.MODE_ECB 表示模式是ECB模式
    aes = AES.new(secret_key.encode('utf-8'), AES.MODE_ECB)

    # 2、解密规则与加密规则有所不同,密文长度需要是3的倍数
    if len(ciphertext) % 3 == 1:
        ciphertext += "==" # 如果余数为1,则填充两个等号==,长度凑3
    elif len(ciphertext) % 3 == 2:
        ciphertext += "=" # 如果余数为2,则填充一个等号=,长度凑3

    # 3、将密文先进行base64反编译
    content = base64.b64decode(ciphertext)

    # 4、讲反编译后的密文通过AES解密
    text = aes.decrypt(content).decode('utf-8')

    return text



res = AES_Encryption(secret_key="1234567812345678",text="abc我的错")
print("加密后的密文是:",res)

res = AES_Decrypt(secret_key="1234567812345678",ciphertext="iGaMr8nHU5V6UwbLYf1g5g==")
print("密文解密后的明文是:",res)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值