博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟一个http 请求的json格式报文,带 rsa 签名操作
阅读量:5019 次
发布时间:2019-06-12

本文共 3578 字,大约阅读时间需要 11 分钟。

一、对需要加密的字符串,定义RsaSignUnsign 类,代码如下:

实现了:

1、实现了生成新的pubkey、pri_key方法;

2、将新生成的keys 写入文件;

3、从文件获取pubkey、pri_key

4、对传入的字符串进行签名,转为bytes类型串,签名,转为base64串,再转为str 串

5、对传入的字符串验签,传入字符串转为bytes串,解base64格式,与原字符串的bytes格式进行验签

 

#coding=utf-8'''rsa字符串签名'''import rsaimport tracebackimport base64class RsaSignUnsign():    def __init__(self):                self.pubkey=None        self.pri_key=None    def get_newkeys(self,n=1024):        self.pubkey,self.pri_key=rsa.newkeys(n)        return self.pubkey,self.pri_key    def get_keys(self):        if self.pubkey != None and self.pri_key != None:            return self.pubkey,self.pri_key        return None        #如果路径未输入,会在当前路径生成pubkey.pem、pri_key.pem    def write_keytofile(self,pubkey_path='pubkey.pem',pri_key_path='pri_key.pem'):        with open(pubkey_path,'w',encoding='utf-8')as fp:            fp.write(self.pubkey.save_pkcs1().decode('utf-8'))                with open(pri_key_path,'w',encoding='utf-8')as fp:            fp.write(self.pri_key.save_pkcs1().decode('utf-8'))    def load_keys(self,pubkey_path='pubkey.pem',pri_key_path='pri_key.pem',encode_format='utf-8'):                try:            fp=open(pubkey_path,'r',encoding=encode_format)            fp.readline()            fp1=open(pri_key_path,'r',encoding=encode_format)            fp1.readline()        except:            traceback.print_exc()        else:            fp.seek(0.0)            self.pubkey=rsa.PublicKey.load_pkcs1(fp.read().encode())            fp.close()            fp1.seek(0.0)            self.pri_key=rsa.PrivateKey.load_pkcs1(fp1.read().encode())            fp1.close()        return self.pubkey,self.pri_key    def rsa_str_sign(self,s_str,sign_type='SHA-1'):        if not isinstance(s_str,str):            return None        s_sign=rsa.sign(s_str.encode('utf-8'),self.pri_key,sign_type)        s_b64=base64.b64encode(s_sign).decode('utf-8')        #print('s_b64:',s_b64)        return s_b64        #s_str 是加密后转码base64 再decode为str类型;s为原str未签名串    def rsa_str_verify(self,s_str,s):        if not isinstance(s_str,str):            return None        s_b64=s_str.encode('utf-8')        s_unsign=base64.b64decode(s_b64)        try:            result=rsa.verify(s.encode('utf-8'),s_unsign,self.pubkey)            return result        except:            print('验签失败:')            traceback.print_exc()  if __name__=='__main__':    r=RsaSignUnsign()    pubkey,prikey=r.get_newkeys(1024)    #print('pubkey:',pubkey)    #print('prikey:',prikey)    r.write_keytofile('e:\\pubkey.pem','e:\\pri_key.pem')    r.load_keys('e:\\pubkey.pem','e:\\pri_key.pem')    print(r.get_keys())    print('*'*30)        s='nihaoma'    ss=r.rsa_str_sign(s)    print('ss:',ss)        #s='nihaoma1'    print('#'*20)    print(r.rsa_str_verify(ss,s))

二、主程序请求报文,对格式字符串进行拼串,签名操作

 

#coding=utf-8'''模拟一个http的json格式请求报文'''from rsa_str import *import jsond_header={
'typeCode':'onlineCoupon', 'version':1.0}couponUseDateList=["20180228", "20180301", "20180302"]d_body={
'promotionPlanId':10001, "faceValue": '%.2f'%5.00, "couponUseDateList":couponUseDateList}signature=''d={
'header':d_header,'body':d_body}for i in sorted(d_header): signature+=str(d_header[i])for i in sorted(d_body): if isinstance(d_body[i],list): signature+=''.join(d_body[i]) else: signature+=str(d_body[i])print('signature:',signature)rsasign=RsaSignUnsign()rsasign.load_keys('e:\\pubkey.pem','e:\\pri_key.pem')signature=rsasign.rsa_str_sign(signature)d['signature']=signatured_json=json.dumps(d)print('d_json:',d_json)

 

转载于:https://www.cnblogs.com/xiaoxiao075/p/10450913.html

你可能感兴趣的文章
关于<form> autocomplete 属性
查看>>
收缩SqlServer数据库日记方法
查看>>
学习方法--提问
查看>>
merge-two-sorted-lists
查看>>
Educational Codeforces Round 60 (Rated for Div. 2) C. Magic Ship
查看>>
归并排序法
查看>>
CRC标准以及简记式
查看>>
SEO搜索引擎
查看>>
一、Text To Speech
查看>>
Java读取并下载网络文件
查看>>
在word中粘贴的图片为什么显示不完整
查看>>
SQL Server 数据库的鼠标操作
查看>>
SQL SERVER BOOK
查看>>
WebAPI HelpPage支持area
查看>>
Path元素
查看>>
js学习总结----DOM增删改和应用
查看>>
(20)sopel算法
查看>>
学习总结 javascript 闭包
查看>>
实验吧一个小坑注入
查看>>
【 D3.js 高级系列 — 8.0 】 打标
查看>>