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 小时前
uv 安装包
开发语言·chrome·python
weixin_307779131 小时前
Python获取能唯一确定一棵给定的树的最少数量的拓扑序列
数据结构·python
A.sir啊1 小时前
爬虫基础(六)代理简述
爬虫·python·网络协议
weixin_307779131 小时前
PySPARK带多组参数和标签的SparkSQL批量数据导出到S3的程序
大数据·数据仓库·python·sql·spark
Hi Man3 小时前
Python之如何在Visual Studio Code 中写的python程序打包成可以在Windows系统下运行的.exe程序
开发语言·vscode·python
Return-Log3 小时前
Matplotlab显示OpenCV读取到的图像
python·opencv
程序趣谈3 小时前
算法随笔_36: 复写零
数据结构·python·算法
九亿AI算法优化工作室&4 小时前
GWO优化LSBooST回归预测matlab
人工智能·python·算法·机器学习·matlab·数据挖掘·回归
weixin_307779134 小时前
在AWS上使用Flume搜集分布在不同EC2实例上的应用程序日志具体流程和代码
python·flask·云计算·flume·aws
sirius123451235 小时前
自定义数据集 ,使用朴素贝叶斯对其进行分类
python·分类·numpy