即插即用demo系列——RSA验证

注意:请先自行装好Crypto
http://ljhzzyx.blog.163.com/blog/static/3838031220136592824697/

# coding=gbk
__author__ = 'linyc'
import os
import base64

from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5 as PKCS
from Crypto.Hash import MD5 as HASH
#from Crypto.Cipher import ARC4 as RC4


# 组织加密明文形式  支持入参为列表、字典和字符串。列表和字典统一转化为特定格式的字符串
# 如果入参是字典,注意键值排序!网络传输可能会打乱key顺序,导致对应的字符串不同,验证会失败!
def _to_content(data, skip_keys):
    if isinstance(data, dict):
        ks = data.keys()
        ks.sort()
        content = '&'.join([i + '=' + data[i]
                            for i in ks
                            if data[i] and (i not in skip_keys) ])

    elif isinstance(data, list):
        content = '&&&'.join(data)

    else:
        content = data

    if isinstance(content, unicode):
        content = content.encode('utf-8')

    return content

# 签名验证,即获取sgn,自己再用公钥加密自己收到的内容,比对两个sgn
def _transfer_verify(data, sgn, public_signer):
    verf_skip_keys = {}
    content = _to_content(data, verf_skip_keys)
    h = HASH.new(content)
    sgn = base64.decodestring(sgn)
    return public_signer.verify(h, sgn)

# 签名,即用私钥,将自己要发送的内容加密成sgn
def _transfer_sign(data, private_signer):
    sign_skip_keys = {}
    content = _to_content(data, sign_skip_keys)
    h = HASH.new(content)
    sgn = private_signer.sign(h)
    return base64.encodestring(sgn).translate(None, ' \r\n')

# RSA加密
def _rsaAdd(message):
    data = message

    dpath = os.path.dirname(__file__)
    with open(os.path.join(dpath, 'private_key.pem')) as f:
        prikey = RSA.importKey(f.read())
        private_signer = PKCS.new(prikey)

    # 生成密文
    sgn = _transfer_sign(data, private_signer)

    return sgn

# RSA解密  如果验证通过,返回True
def _rsaRelease(sgn, data):
    dpath = os.path.dirname(__file__)
    with open(os.path.join(dpath, 'public_key.pem')) as f:
        pubkey = RSA.importKey(f.read())
        public_signer = PKCS.new(pubkey)

    return _transfer_verify(data, sgn, public_signer)

if __name__ == "__main__":
    data = '需要被验证的发送内容message'
    sgn = _rsaAdd(data)
    print sgn

    ismatch = _rsaRelease(sgn, data)
    print ismatch



执行截图:


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值