python加密與解密,加簽與驗籤

努力奮鬥的小菲菲發表於2019-02-16

在與第三方服務對接時,加密與解密,加簽與驗籤是這個過程中的關鍵一步

  • 一般情況下,對接服務中會有兩對公私鑰。使用對方公鑰進行加密,使用自己私鑰進行加簽。傳回來的資料,使用自己的私鑰解密,使用對方的公鑰驗籤。

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)

相關文章