在與第三方服務對接時,加密與解密,加簽與驗籤是這個過程中的關鍵一步
-
一般情況下,對接服務中會有兩對公私鑰。使用對方公鑰進行加密,使用自己私鑰進行加簽。傳回來的資料,使用自己的私鑰解密,使用對方的公鑰驗籤。
import base64
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
from Crypto.Cipher import PKCS1_v1_5
from Crypto.Signature import PKCS1_v1_5 as SIGN_PKCS
PUB_KEY = RSA.importKey(open(`rsa_public_key.pem`,`r`).read())
PRI_KEY = RSA.importKey(open(`rsa_private_key.pem`,`r`).read())
加密
def split_data(l, n):
for i in range(0, len(l), n):
yield l[i: i+n]
def encrypt(params):
raw = params.encode(`utf-8`)
cipher = PKCS1_v1_5.new(PUB_KEY)
# 加密超長位元組117個位元組一加密
content = b``.join([cipher.encrypt(x) for x in chunks(raw, 117)])
return base64.b64encode(content)
解密
def decrypt(data):
raw = data.encode(`utf-8`)
decrypt = PKCS1_v1_5.new(PRI_KEY).decrypt
# 解密超長字元128一解密
content = b``.join(decrypt(x, object()) for x in chunks(raw, 128))
return content.decode()
加簽
def signer(data):
signstr = data.encode(`utf-8`)
sign = SIGN_PKCS.new(PRI_KEY).sign(SHA.new(signstr))
return base64.b64encode(sign)
驗籤
def verify_sign(unsign, raw_sign):
"""
unsign: 簽名
raw_sign: 待驗證簽名
"""
assert SIGN_PKCS.new(PUB_KEY).verify(SHA.new(unsign.encode(`utf-8`)), raw_sign)