RSA加密的接口怎么编写Python脚本?

作者: TT 分类: 技术 发布时间: 2020-01-22 09:00

今天有同学问到:在调用接口的时候,传参被RSA加密了,应该怎么调用?在这里就简单说下,希望对其他同学有所帮助。

开始之前,先啰嗦两句,新型冠状病毒肺炎疫情汹涌而来。春节期间能不出门就不要出门了(^_^),如果非要出门,还是带上口罩、勤洗手。

为了接口的安全性考虑,有些接口在传递的时候使用了RSA加密,RSA加密是一种非对称加密,可以在不直接传递密钥的情况下,完成解密。服务端生成一对密钥(公钥和私钥),公钥是用来做加密使用的,私钥是用来做解密使用的。

那么,测试人员在调用接口进行测试的时候,只需要拿到公钥,并了解传递的参数是怎么拼接成一个字符串的即可,然后对字符串进行组装使用RAS加密后,再进行参数的传递即可。

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64


def handle_pub_key(key):
    """
    处理公钥
    公钥格式pem,处理成以-----BEGIN PUBLIC KEY-----开头,-----END PUBLIC KEY-----结尾的格式
    :param key:pem格式的公钥,无-----BEGIN PUBLIC KEY-----开头,-----END PUBLIC KEY-----结尾
    :return:
    """
    start = '-----BEGIN PUBLIC KEY-----\n'
    end = '-----END PUBLIC KEY-----'
    result = ''
    # 分割key,每64位长度换一行
    divide = int(len(key) / 64)
    divide = divide if (divide > 0) else divide + 1
    line = divide if (len(key) % 64 == 0) else divide + 1
    for i in range(line):
        result += key[i * 64:(i + 1) * 64] + '\n'
    result = start + result + end
    return result


def encrypt(key, content):
    """
    RSA公钥加密
    :param key: 无BEGIN PUBLIC KEY头END PUBLIC KEY尾的pem格式key
    :param content:待加密内容
    :return result:返回RAS加密后的字符串
    """
    pub_key = handle_pub_key(key)
    pub = RSA.import_key(pub_key)
    cipher = PKCS1_v1_5.new(pub)
    encrypt_bytes = cipher.encrypt(content.encode(encoding='utf-8'))
    result = base64.b64encode(encrypt_bytes)
    result = str(result, encoding='utf-8')
    return result


if __name__ == '__main__':
    rsa_key = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8RVzwz5UHyJdunvDL7yYTnsTIhXipj33BKV8AjbPsDJ35WlfViOGw+deRgwVtruKRCEyqi2SBkwcu1Sdp6gPbELW1mkiTS2QT/Tnj3E2iEIqWKEUJW27PfJCPKE83+UD+zflDVB/LEdinOaFjCf6h/SaznarsXhx0zSYU9wjhmQIDAQBA'
    password = 'qwer1234'
    pwd = encrypt(rsa_key,password)
    print(pwd)

执行结果:

D:\tttesting\workspace\venv\Scripts\python3.exe D:/tttesting/workspace/c/encrypt.py
Zd5DNbfX5w8u+FWF4mHoLXQJEy+RTmjzxq6kgNIKKhfrx8o3I9JzX57Ya4N3O69WAWeUh6XVQhrTTJhPke456EyNGi9r74NN3K6YAcN6maJm4py6Kc3gyg6HKfjkRiQv4ZZTf/qCPobdyZkbBiowLmfdCg/t8EN0DAj30G1j5T8=

Process finished with exit code 0

以上例子可以看出,使用公钥rsa_key对password进行RSA加密后得到code的值就可以作为接口的传参了。