• 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
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
  • 相关阅读:
    Docker安装与应用全套讲解
    Aspose.GIS 22.11.0 for .NET Crack
    简易租赁合同(免费)
    火山引擎徐鑫:工程师如何与云原生共同成长
    实用电脑软件分享,来看看有没有你正在用的
    C++日期和时间编程总结
    jupyter notebook 运行没有反应
    【机器学习】机器学习与时间序列分析的融合应用与性能优化新探索
    《Learning Hierarchical Modular Networks for Video Captioning》论文笔记
    C++学习--基础
  • 原文地址:https://blog.csdn.net/J_____Q/article/details/126039153