在與第三方服務對接時,加密與解密,加簽與驗籤是這個過程當中的關鍵一步加密
通常狀況下,對接服務中會有兩對公私鑰。使用對方公鑰進行加密,使用本身私鑰進行加簽。傳回來的數據,使用本身的私鑰解密,使用對方的公鑰驗籤。code
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())
加密ip
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)
解密utf-8
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()
加簽ci
def signer(data): signstr = data.encode('utf-8') sign = SIGN_PKCS.new(PRI_KEY).sign(SHA.new(signstr)) return base64.b64encode(sign)
驗籤it
def verify_sign(unsign, raw_sign): """ unsign: 簽名 raw_sign: 待驗證簽名 """ assert SIGN_PKCS.new(PUB_KEY).verify(SHA.new(unsign.encode('utf-8')), raw_sign)