python AES

一,安装

win:

javascript 复制代码
pip install pycryptodome

linux:

bash 复制代码
pip install pycrypto

二,AES - ECB模式

  • 纯ecb,便于理解
python 复制代码
import os

try:
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad, unpad
except:
    os.system("pip install pycrypto")
    os.system("pip install pycryptodome")
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad, unpad


class AesUtils:
    """Aes[ECB]加解密"""

    @staticmethod
    def ecb_encrypt(mingwen: str, key: str):
        """ECB 加密"""
        # 补足指定字节数 Padding
        pad_key = pad(key.encode(), block_size=AES.key_size[2], style="pkcs7")
        pad_mingwen = pad(mingwen.encode(), block_size=AES.block_size, style="pkcs7")
        # 加密
        obj = AES.new(pad_key, AES.MODE_ECB)
        miwen = obj.encrypt(pad_mingwen)
        return miwen

    @staticmethod
    def ecb_decrypt(miwen: bytes, key: str):
        """ECB 解密"""
        # 解除加密时对key的补充
        pad_key = pad(key.encode(), block_size=AES.key_size[2], style="pkcs7")
        # 解密
        obj = AES.new(pad_key, AES.MODE_ECB)
        pad_mingwen = obj.decrypt(miwen)
        # 解除加密时对明文的填充
        mingwen = unpad(pad_mingwen, block_size=AES.block_size, style="pkcs7")
        return mingwen.decode()


if __name__ == "__main__":
    # 一个汉字两个字节
    text = "我是需要加密的明文"
    # Key 必须是16字节(*AES-128*), 24字节(*AES-192*),32字节(*AES-256*)
    key = "abcdfeghijklmnop"
    #####################################################################
    # 加密过程中,对key和mingwen进行了填充,需要返回来用于解除填充后用于解密
    miwen = AesUtils.ecb_encrypt(mingwen=text, key=key)
    print("加密:", miwen)
    #####################################################################
    decrypted = AesUtils.ecb_decrypt(miwen=miwen, key=key)
    print("解密:", decrypted)
  • ecb+base64,便于查看加密效果

    python 复制代码
    import os
    import base64
    
    try:
        from Crypto.Cipher import AES
        from Crypto.Util.Padding import pad, unpad
    except:
        os.system("pip install pycrypto")
        os.system("pip install pycryptodome")
        from Crypto.Cipher import AES
        from Crypto.Util.Padding import pad, unpad
    
    
    class AesUtils:
        """Aes[ECB]加解密"""
    
        @staticmethod
        def ecb_encrypt(mingwen: str, key: str):
            """ ECB 加密"""
            # 补足指定字节数 Padding
            pad_key = pad(key.encode(), block_size=AES.key_size[2], style="pkcs7")
            pad_mingwen = pad(mingwen.encode(), block_size=AES.block_size, style="pkcs7")
            # 加密
            obj = AES.new(pad_key, AES.MODE_ECB)
            miwen = obj.encrypt(pad_mingwen)
            # base64对字节密文进行b64加密,并转成str
            bs_miwen = base64.encodebytes(miwen).decode()
            return bs_miwen
    
        @staticmethod
        def ecb_decrypt(bs_miwen: str, key: str):
            """ ECB 解密"""
            # 解除加密时对key的补充
            pad_key = pad(key.encode(), block_size=AES.key_size[2], style="pkcs7")
            # 将b64的str明文先转成bytes,再b64解密
            miwen = base64.decodebytes(bs_miwen.encode())
            # 解密
            obj = AES.new(pad_key, AES.MODE_ECB)
            pad_mingwen = obj.decrypt(miwen)
            # 解除加密时对明文的填充
            mingwen = unpad(pad_mingwen, block_size=AES.block_size, style="pkcs7")
            return mingwen.decode()
    
    
    if __name__ == "__main__":
        # 一个汉字两个字节
        text = "我是需要加密的明文"
        # Key 必须是16字节(*AES-128*), 24字节(*AES-192*),32字节(*AES-256*)
        key = "abcdfeghijklmnop"
        #####################################################################
        # 加密过程中,对key和mingwen进行了填充,需要返回来用于解除填充后用于解密
        bs_miwen = AesUtils.ecb_encrypt(mingwen=text, key=key)
        print("加密:", bs_miwen)
        #####################################################################
        decrypted = AesUtils.ecb_decrypt(bs_miwen=bs_miwen, key=key)
        print("解密:", decrypted)

    三,AES - CBC

  • 纯cbc,便于理解

python 复制代码
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@CreateDate:	 2024/08/28 12:18:11
@modifyDate:   
@Author:   Yang·MaoMao
@Version:   1.0.0.0
@summary:   Aes[CBC]加解密
"""


import os

try:
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad, unpad
except:
    os.system("pip install pycrypto")
    os.system("pip install pycryptodome")
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad, unpad


class AesUtils:
    """Aes[CBC]加解密"""

    @staticmethod
    def cbc_encrypt(mingwen: str, key: str, iv: str):
        """CBC 加密"""
        # iv必须是固定的16字节,这里不做填充
        iv = iv.encode()

        # key,mingwen 补字节 Padding
        pwd_key = pad(key.encode(), block_size=AES.key_size[1], style="pkcs7")
        pad_mingwen = pad(mingwen.encode(), block_size=AES.block_size, style="pkcs7")

        # 加密
        obj = AES.new(pwd_key, AES.MODE_CBC, iv=iv)
        return obj.encrypt(pad_mingwen)

    @staticmethod
    def cbc_decrypt(miwen: bytes, key: str, iv: str):
        """CBC 解密"""
        iv = iv.encode()
        #填充key是保证跟加密时填充过的key一致
        key = pad(key.encode(), block_size=AES.key_size[1], style="pkcs7")

        # 解密
        obj = AES.new(key, AES.MODE_CBC, iv=iv)
        pad_mingwen = obj.decrypt(miwen)

        # 解密得到的是加密时填充过的明文,所以需要解除填充
        mingwen = unpad(pad_mingwen, block_size=AES.block_size, style="pkcs7")
        return mingwen.decode()  # 解除填充是bytes类型,转成str


if __name__ == "__main__":
    text = "我是需要加密的明文"  # 一个汉字两个字节
    # Key 必须是16字节(*AES-128*), 24字节(*AES-192*),32字节(*AES-256*)
    key = "abcdfeghijklmnopabcd"
    # IV 必!须!是!16字节   , 适用于CBC模式
    iv = "abcdfeghijklmnop"
    #####################################################################
    miwen = AesUtils.cbc_encrypt(mingwen=text, key=key, iv=iv)
    print("加密:", miwen)
    mingwen = AesUtils.cbc_decrypt(miwen=miwen, key=key, iv=iv)
    print("解密:", mingwen)
  • cbc+base64,便于查看加密结果

    python 复制代码
    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    """
    @CreateDate:	 2024/08/28 12:18:11
    @modifyDate:   
    @Author:   Yang·MaoMao
    @Version:   1.0.0.0
    @summary:   Aes[CBC]加解密
    """
    
    
    import os
    import base64
    
    try:
        from Crypto.Cipher import AES
        from Crypto.Util.Padding import pad, unpad
    except:
        os.system("pip install pycrypto")
        os.system("pip install pycryptodome")
        from Crypto.Cipher import AES
        from Crypto.Util.Padding import pad, unpad
    
    
    class AesUtils:
        """Aes[CBC]加解密"""
    
        @staticmethod
        def cbc_encrypt(mingwen: str, key: str, iv: str):
            """CBC 加密"""
            # iv必须是固定的16字节,这里不做填充
            iv = iv.encode()
    
            # key,mingwen 补字节 Padding
            pwd_key = pad(key.encode(), block_size=AES.key_size[1], style="pkcs7")
            pad_mingwen = pad(mingwen.encode(), block_size=AES.block_size, style="pkcs7")
    
            # 加密
            obj = AES.new(pwd_key, AES.MODE_CBC, iv=iv)
            miwen = obj.encrypt(pad_mingwen)
            bs_miwen = base64.encodebytes(miwen).decode()
            return bs_miwen
    
        @staticmethod
        def cbc_decrypt(bs_miwen: str, key: str, iv: str):
            """CBC 解密"""
            iv = iv.encode()
            #填充key是保证跟加密时填充过的key一致
            key = pad(key.encode(), block_size=AES.key_size[1], style="pkcs7")
    
            # base64解密
            miwen = base64.decodebytes(bs_miwen.encode())
    
            # 解密
            obj = AES.new(key, AES.MODE_CBC, iv=iv)
            pad_mingwen = obj.decrypt(miwen)
    
            # 解密得到的是加密时填充过的明文,所以需要解除填充
            mingwen = unpad(pad_mingwen, block_size=AES.block_size, style="pkcs7")
            return mingwen.decode()  # 解除填充是bytes类型,转成str
    
    
    if __name__ == "__main__":
        text = "我是需要加密的明文"  # 一个汉字两个字节
        # Key 必须是16字节(*AES-128*), 24字节(*AES-192*),32字节(*AES-256*)
        key = "abcdfeghijklmnopabcd"
        # IV 必!须!是!16字节   , 适用于CBC模式
        iv = "abcdfeghijklmnop"
        #####################################################################
        bs_miwen = AesUtils.cbc_encrypt(mingwen=text, key=key, iv=iv)
        print("加密:", bs_miwen)
        mingwen = AesUtils.cbc_decrypt(bs_miwen=bs_miwen, key=key, iv=iv)
        print("解密:", mingwen)
相关推荐
phltxy18 分钟前
LangChain_Agent中间件实战
人工智能·python·深度学习·语言模型·中间件·langchain
axinawang25 分钟前
第14课:查找、统计、分割字符串
python
倒流时光三十年31 分钟前
第一阶段 02 · Mapping 与数据类型(text vs keyword 是重点)
后端·python·django
小大宇35 分钟前
python蓝图、拦截器、异常处理、redis队列、线程池、控制台及日志文件输出
python
喝茶与编码1 小时前
真实业务场景:高并发 Upsert 死锁频发?InnoDB 锁机制与重试机制深度解析
数据库·python
倒流时光三十年1 小时前
第一阶段 05 · Java 客户端查询类详解(Query / SearchCriteria / Response 与复杂拼接)
java·开发语言·python
CTA终结者1 小时前
近期AI量化学习,把规则改写接到策略开发
人工智能·python
有Li1 小时前
使用整合电子健康记录的大语言模型智能体实现前列腺癌患者教育个性化文献速递/医学智能体前沿
人工智能·python·机器学习·语言模型·医学生
米码收割机2 小时前
【Python】Flask+SQLite_web 宠物领养系统 (源码+文档)【独一无二】
前端·python·flask
卷无止境2 小时前
python进阶:类方法与静态方法的分野,classmethod 和 staticmethod 到底该怎么选
后端·python