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

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

示例代码如下:

import base64
from Crypto.Cipher import AES

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


    need_size = 16


    text_length = len(text)


    bytes_length = len(text.encode('utf-8'))



    padding_size = text_length if (bytes_length == text_length) else bytes_length


    padding = need_size - padding_size % need_size


    padding_text = chr(padding) * padding


    return text + padding_text


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


    if (secret_key is None) or len(secret_key) == 0:
        secret_key = "1234567812345678"


    text =  pkcs7padding(text)


    aes = AES.new(secret_key.encode("utf-8"), AES.MODE_ECB)


    en_text = aes.encrypt(text.encode('utf-8'))


    result = str(base64.b64encode(en_text), encoding='utf-8')

    return result




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


    if (secret_key is None) or len(secret_key) == 0:
        secret_key = "1234567812345678"


    aes = AES.new(secret_key.encode('utf-8'), AES.MODE_ECB)


    if len(ciphertext) % 3 == 1:
        ciphertext += "==" 
    elif len(ciphertext) % 3 == 2:
        ciphertext += "="


    content = base64.b64decode(ciphertext)


    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)