python接口自动化测试之API接口测试(分段加解密)

        很多公司都开放对外的API,测试时候我们一般用postman,jmeter等工具可以简单上手,但是对于复杂的流程有时候就不太友好了。

例如:
  1. API如果是做支付相关的业务,每次调用接口订单号这个字段要做参数化处理。
  2. 调用接口有签名字段要做签名,返回参数需要做验签。
  3. 上传文件或图片的接口要做文件二进制的转换。
  4. 一些字段需要做加密传输。
  5. 多个API接口之间是有业务关系的,例如我调用一个接口需要另一个接口返回的值
接上章内容讲分段加解密

前置条件:

安装 pycryptodome

pip3 install pycryptodome

 引用相关类

from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as Signature_PKCS1_v1_5
from Crypto.Cipher import PKCS1_v1_5 as Cipher_PKCS1_v1_5
from Crypto.Hash import MD5, SHA,SHA1, SHA256
from Crypto import Random

 先使用上章普通加密看报错内容

def encryption(text: str, publicKey):
    # 加密text数据是字符串,进行编码,编码为UTF-8格式的字节串
    text_bytes = text.encode('utf-8')
    # 加密公钥是base64字符串,先解码,解码后格式为字节串
    public_key_Bytes = base64.b64decode(publicKey)
    # 构建公钥对象
    cipher_public = Cipher_PKCS1_v1_5.new(RSA.importKey(public_key_Bytes))
    # 加密
    text_encrypted = cipher_public.encrypt(text_bytes)
    # base64编码,并转为字符串
    text_encrypted_base64 = base64.b64encode(text_encrypted).decode()
    return text_encrypted_base64

用长一点的数据进行加密

    private_key=r'MIIEowIBAAKCAQEA2OnMeAxfrFVhU6M/G4gKR9815/Au93Rru9EkWu/Pk1juQ2nA4HCCvKtAAmeY35f80ZBcj1lIKK6icL31cpDaDSMWSQ2W64Bd1K34N0Zja6mLbI3jISgVcSKLSjo9I0I2e/JNo0A/tkPfTA2jxeKgcUGZPvUEUtb06GsC681oapImi+6OpRCC9b2dc1h4xDnbUdZbesGZspSYVFsNLRZLSUG6JfuJqQNSmDl4BJd0sxZJRBytlzSQuenczTqaHdf7JtvEsCpXseaoVO1A0c8RjYhLGhAsldE4NNPx6Jop66TYsokBv9KSJPZqaTvIng1szlw/jp+f5Lhv+Wyntnl2sQIDAQABAoIBAB4wZ/SQpaN6semDOmNutcjr+s4q4kvZaFcYVArTU9yqOhBS1cpxjkM2QwSH/kGm9G5cPQL3G5u3Nm93g1jXFSn9PKWdM73XZ00UNgwctUtE1QfzisLQwoSKQ2roxnKI+BlHD2F4WIWvAOh5ANan5HREJiZve727IhR+NEa07LfhbrdqdQ/RWb8N/vrt8HTpuLBLTFA0D943it9RHQw/s7rWA37qcgeScLONJ7Ewu0Yrulh9Rpv3JtxfdicG8ZEAqhen2p1Gf2oqTBeC4k9feHyUCpkARMDqvKm2ifhzO8cgKnVR0+pxLAa7BfgOCdeCXcNlz55Oz3dI4TRXnYlnD6sCgYEA36wpvXxwFsvovBOTy7ng4kaDYD8SjpC7CFPvAIO23xdWOathncCZjTpvhrT2OiKDUcd8i45KlbtB6ZIeMAfsonjNE/rGcEEckOtjvN6Toyt42UQuzOeKjTB2nLE66TYZ83N8IZjUqhfjCxTJFsgixsLyFM1kXYP5yolctM5GAncCgYEA+EOLmpqDkqxlK3Gju8/wz2lk9Hurcu7vVcIRX/LJtOtMLWFilJZprdjH2EZ7c7+b5DaHzklmJH2Rm8CaMmTHqptNEe11n25iP0p319pHGyxxaSvKkABk+31ykJUFFk8l260NzfZXMk3QhYMkKZ9ZbKjjukUb5+l2HPZhR6TsMhcCgYAN8tebiIIY+dhmujXSU6IxmkIhI23N1DrFty5FcvFZkkP/Tq/EvbkVtJo15V0hnPthgzZCIbqHAemHXmRhjGz2aOApKc9sOrNEWlma8qp0V4auzfC5OItMaMRM20SYPJZ7tyz7j2NbxCeVjlNIB20bxhaAs5pZtpxCRDSy1dZJ2wKBgQDsGKhJ5gmcUhCAaTjx4kW7qhpVGssoqSu4na+SVL0YLfCq84MhlY14w8EB372FjUH+nRE3z7uwli4ENf0uUYNErx5zHyUN8pbCY9pmz3Fx2SkdgITJv2ZJeLqb3uwQlEKHkCKhrVStRS0520Znwt/zIwY23YQ1X2NxFanbzW7GDwKBgFrR0UZDl55bJgqIvlt0QNufsJyStRr8teIqX7F0U9T4RoeCWuF7KjtHrk0WCgiMREOxIc3b9gICAlGxc8hhKAi2JWOxmwXaeIYWWXgSu/Ojhsj0wTBWRGigCRqhyB01Y1GirXx7nUHVYnegjxBMOa+oPacHB76Zb/6Aejkg2QeL'
    public_key=r'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2OnMeAxfrFVhU6M/G4gKR9815/Au93Rru9EkWu/Pk1juQ2nA4HCCvKtAAmeY35f80ZBcj1lIKK6icL31cpDaDSMWSQ2W64Bd1K34N0Zja6mLbI3jISgVcSKLSjo9I0I2e/JNo0A/tkPfTA2jxeKgcUGZPvUEUtb06GsC681oapImi+6OpRCC9b2dc1h4xDnbUdZbesGZspSYVFsNLRZLSUG6JfuJqQNSmDl4BJd0sxZJRBytlzSQuenczTqaHdf7JtvEsCpXseaoVO1A0c8RjYhLGhAsldE4NNPx6Jop66TYsokBv9KSJPZqaTvIng1szlw/jp+f5Lhv+Wyntnl2sQIDAQAB'
    data='测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据测试数据'
    # sign=RSA_sign(data,private_key)
    # print(sign.decode('utf-8'))
    # test_return=RSA_verify(sign,data,public_key)
    # print(test_return)
    enc=encryption_too_long(data,public_key)

    print(decryption_too_long(enc,private_key))

报错 

  File "D:\Python\Python37\lib\site-packages\Crypto\Cipher\PKCS1_v1_5.py", line 107, in encrypt
    raise ValueError("Plaintext is too long.")
ValueError: Plaintext is too long

看上面内容,数据太长加密会报错,我们修改加密方法,把数据按照一定长度进行加密,最后再把加密数据组装起来,加密长度117位,对应解密256位

def encryption_too_long(text: str, publicKey,length=117):
    # 加密text数据是字符串,进行编码,编码为UTF-8格式的字节串
    text_bytes = text.encode('utf-8')
    # 加密公钥是base64字符串,先解码,解码后格式为字节串
    public_key_Bytes = base64.b64decode(publicKey)
    # 构建公钥对象
    cipher_public = Cipher_PKCS1_v1_5.new(RSA.importKey(public_key_Bytes))
    # 加密
    print('加密长度\n',text_bytes,len(text_bytes))
    print(len(text_bytes))
    if len(text_bytes) <= length:
        # 加密(bytes)
        text_encrypted = cipher_public.encrypt(text_bytes)
        # base64编码,并转为字符串
        text_encrypted_base64 = base64.b64encode(text_encrypted).decode()
        return text_encrypted_base64
    else:
        rsa_text = []
        # 对编码后的数据进行切片,原因:加密长度不能过长
        for i in range(0, len(text_bytes), length):
            cont = text_bytes[i:i + length]
            # 对切片后的数据进行加密,并新增到rsa_text后面
            rsa_text.append(cipher_public.encrypt(cont))
        # 加密完进行拼接
        cipher_text = b''.join(rsa_text)
        # base64进行编码
        result = base64.b64encode(cipher_text)
        return result.decode()
def decryption_too_long(text_encrypted_base64: str, private_key,length=256):
    # 字符串指定编码(转为bytes)
    text_encrypted_base64 = text_encrypted_base64.encode('utf-8')
    # base64解码
    text_encrypted = base64.b64decode(text_encrypted_base64)
    # 加密公钥是base64字符串,先解码,解码后格式为bytes
    private_key_Bytes=base64.b64decode(private_key)
    # 构建私钥对象

    cipher_private = Cipher_PKCS1_v1_5.new(RSA.importKey(private_key_Bytes))
    # 解密(bytes)
    print('解密长度\n', text_encrypted)
    print(len(text_encrypted))
    if len(text_encrypted) <= length:

        text_decrypted = cipher_private.decrypt(text_encrypted, Random.new().read)
        return text_decrypted.decode()
    else:
        rsa_text = []
        # 对编码后的数据进行切片,原因:加密长度不能过长
        for i in range(0, len(text_encrypted), length):
            cont = text_encrypted[i:i + length]
            print(len(cont))
            # 对切片后的数据进行解密,并新增到rsa_text后面
            rsa_text.append(cipher_private.decrypt(cont, Random.new().read))
        # 解密完进行拼接
        cipher_text = b''.join(rsa_text)
        return cipher_text.decode()

再执行就不会报错了 

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值