• Python-AES加密算法接口测试


    前言

    先前已经学过了Python-SHA256加密算法接口测试,今天我跟大家讲解一下AES加密算法的接口如何写python脚本进行测试。

    AES加密算法

    高级加密标准*(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。*对称加密算法,即相同的加密模式需要用相同加密模式解密

    加密模式

    EBC模式

    ECB算法优点:简单、孤立,每个块单独运算。适合并行运算。传输错误一般只影响当前块。

    ECB算法缺点:同明文输出同密文,可能导致明文攻击。我们平时用的AES加密很多都是ECB模式的,此模式加密不需要向量IV。

    CBC模式

    CBC算法优点:串行化运算,相同明文不同密文

    CBC算法缺点:需要初始向量,不过这其实不算缺点,下文的CTR也是需要随机数的。如果出现传输错误,那么后续结果解密后可能全部错误。

    CFB模式

    CFB算法优点:同明文不同密文,分组密钥转换为流密码。

    CFB算法缺点:串行运算不利并行,传输错误可能导致后续传输块错误。

    OFB模式

    OFB算法优点:同明文不同密文,分组密钥转换为流密码。

    OFB算法缺点:串行运算不利并行,传输错误可能导致后续传输块错误。

    数据填充

    填充模式

    主要针对待加密的数据进行区分数据块,数据块长度不足可以进行填充

    填充的主要模式:pkcs7,x923,zero

    zero---最简单,长度不足则补零

    填充长度

    128位,192位,256位,一个字节等于8位,因此填充长度对应设置为16, 24, 32即可。

    密钥

    原始密钥通过加工以后变为可以使用的

    密钥长度

    128位,192位,256位,一个字节等于8位,因此密钥长度对应设置为16, 24, 32即可。

    密钥填充模式

    自定义,可以和数据块填充模式不一样。

    向量

    ECB模式不需要IV

    向量长度

    同密钥长度

    填充模式

    自定义,可以和数据块填充模式不一样。

    输出编码:base64,hex

    例:AES加密流程(EBC模式)

    1.生成加密器

    确定密钥(1.确定原始密钥, 2.确定密钥长度,如果长度不够需要填充 3.如果需要填充可以自定义填充模式)

    确定加密模式(选择EBC模式)

    2.加密数据块

    原始数据填充(1.确定区块长度,如果原始数据分割后区块长度不够需要填充,2.如果需要填充可以选择填充模式)加密器加密)

    3.将密文重新编码

    可以使用base64编码,解密就是将相同的加密过程倒着来一遍

    一:安装pycryptodome模块

    pip install pycryptodome

    二:定义AES加密的方法,本次使用ECB模式加密

    import base64
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad, unpad
    
    #自定义填充模式-zeropadding
    #字符长度不足16(128位)
    def add_to_16(value):
        while len(value)%16 !=0:
            value += ''
        return value.encode()#转成字节形式
    
    #定义加密方法
    def encrypt_ecb(pt,key='hello123321olleh'):
        #1初始化加密器:128位key,ECB模式加密
        aes=AES.new(add_to_16(key),AES.MODE_ECB)
        #2.处理数据块-128位,pkcs7模式
        block=pad(pt.encode('utf8'),16)
        #3.加密数据块
        tmp=aes.encrypt(block)
        #4.base64编码数据
        ct=base64.encodebytes(tmp).decode()
        return ct

    三:定义解密的方法

    #定义解密方法
    def decrypt_ecb(ct,key='hello123321olleh'): # 1.初始化加密器:128位key,ECB模式加密 aes = AES.new(add_to_16(key), AES.MODE_ECB) # 2.解码base64 block=base64.decodebytes(ct.encode('utf8')) #3.解密数据块 tmp = aes.decrypt(block) # print(tmp) #4.反填充数据-转成字符串 pt=unpad(tmp,16).decode('utf8') return pt

    四:代码如下

    import base64
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad, unpad
    
    #自定义填充模式-zeropadding
    #字符长度不足16(128位)
    def add_to_16(value):
        while len(value)%16 !=0:
            value += ''
        return value.encode()#转成字节形式
    
    #定义加密方法
    def encrypt_ecb(pt,key='hello123321olleh'):
        #1初始化加密器:128位key,ECB模式加密
        aes=AES.new(add_to_16(key),AES.MODE_ECB)
        #2.处理数据块-128位,pkcs7模式
        block=pad(pt.encode('utf8'),16)
        #3.加密数据块
        tmp=aes.encrypt(block)
        #4.base64编码数据
        ct=base64.encodebytes(tmp).decode()
        return ct
    
    #定义解密方法
    def decrypt_ecb(ct,key='hello123321olleh'):
        # 1.初始化加密器:128位key,ECB模式加密
        aes = AES.new(add_to_16(key), AES.MODE_ECB)
        # 2.解码base64
        block=base64.decodebytes(ct.encode('utf8'))
        #3.解密数据块
        tmp = aes.decrypt(block)
        # print(tmp)
        #4.反填充数据-转成字符串
        pt=unpad(tmp,16).decode('utf8')
        return pt
    
    #完成加密接口测试
    
    if __name__ == '__main__':
        import requests
        payload = '''
        {
            "action":"add_case",
            "data":{
            	"title": "test12345",
                "summary": "test11111111111111111",
                "tag": "test",
                "protocol": "HTTP",
                "method": "GET",
                "path": "/",
                "params": "test"
             }
        }
        '''
        # 加密原始报文
        ct = encrypt_ecb(payload)
        body = {'code': ct}
        # 发送加密报文
        resp = requests.post('http://localhost:9090/api/aes', data=body)
        code=resp.json()['code']
        print(decrypt_ecb(code))
  • 相关阅读:
    python装饰器
    python名称空间和作用域
    python函数-函数对象
    python函数-参数
    python文件高级操作
    python基本文件操作
    python2和3的区别
    OSI-传输层
    Android屏幕density, dip等相关概念总结
    架构设计:系统间通信(20)——MQ:消息协议(下)
  • 原文地址:https://www.cnblogs.com/zhangwuxuan/p/12895130.html
Copyright © 2020-2023  润新知