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)
相关推荐
努力的家伙是不讨厌的1 小时前
解析json导出csv或者直接入库
开发语言·python·json
云空1 小时前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
凤枭香2 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
测试杂货铺2 小时前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
艾派森2 小时前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
小码的头发丝、3 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
Chef_Chen3 小时前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
千澜空4 小时前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
斯凯利.瑞恩4 小时前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
yannan201903134 小时前
【算法】(Python)动态规划
python·算法·动态规划