Python rsa公私钥生成 rsa公钥加解密(分段加解密)-私钥加签验签实战
一般现在的SAAS服务提供现在的sdk或api对接服务都涉及到一个身份验证和数据加密的问题。一般现在普遍的做法就是配置使用非对称加密的方式来解决这个问题,你持有SAAS公司的公钥,SAAS公司持有你的公钥,你们就可以进行加密和签名的验证了。
先来看下两种在linux或者mac下面生成key pair的方法:
使用openssl 生成一把2048bit长度的钥匙对,首先我们生成一把.pem格式的私钥:
openssl genrsa -out private_key.pem 2048
然后通过这把私钥生成.pem格式的公钥:
openssl rsa -in private_key.pem -pubout -out public_key.pem
生成出来的格式是pkcs#1.5格式的,可以直接被下面类似这种语句直接读取 rsa.PublicKey.load_pkcs1_openssl_pem()对于python的rsa库来说比较方便。
同样我们也可以使用ssh-keygen来生成:
ssh-keygen -t rsa -b 2048 -C "youremail@example.com"
最后-C 参数是给这把钥匙的公钥添加一个comment。-t指定算法,-b指定长度。这种生成方法会让你输入一个密码,这个密码会对生成的private_key进行加密。
会长这个样子开头:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-CBC,84E01D31C0A59D1F
如果你想使用这把钥匙进行加解密签名转成上面格式的钥匙的话。需要使用:
openssl rsa -in <Encrypted key filename> -out < desired output file name>
可以去掉密码,得到私钥。然后再使用这把私钥生成一个公钥,向上面一样操作就可以了。直接使用生成pair的公钥应该是不行的,格式不一样并不是pkcs#1.5。
下面开始介绍加解密和加签验签:
其实在此之前,有个概念非常容易被混淆。就是同样使用非对称加密原理的数据加密和数据加签。
加密和加签完全不是同样一件事情。
加密使用的是公钥对数据进行加密,而且当你使用一把1024bit的rsa公钥的时候,你一次只能加密最多117byte的数据,如果数据量超过这个数,可能会涉及到对数据进行分段加密的问题。而且现在rsa 1024bit长度的钥匙已经被证明了不够安全,应该尽量使用2048bit长度的钥匙。2048bit长度的钥匙一次可以加密245byte长度的数据。这个计算方法是 2048bit/8 = 256byte - 11byte = 245byte长数据。就是钥匙长度减去11byte得到的自己最大能一次加密多长的数据。如果超过了就会报错,所以很多平台要求对数据用公钥进行加密,就可能涉及到分段加密的问题。同时要注意的是,解密的时候不存在这11byte的减少。就是说一把1024bit的钥匙可以解密128byte长的数据而2048bit的可以解密256byte的数据。
而加签是使用自己的私钥对需要加签的字符串进行签名。而对方需要拿着你给的公钥来验证这个数据是不是由你发出的,需要使用公钥对数据进行验签。如果成功验签才能说明你是你。
下面展示使用python对数据进行分段加密的过程,这里我们假设自己使用一把1024bit的公钥进行加密:
def rsa_encrypt(biz_content, public_key):
_p = rsa.PublicKey.load_pkcs1_openssl_pem(public_key)
biz_content = biz_content.encode('utf-8')
# 1024bit key
default_encrypt_length = 117
len_content = len(biz_content)
if len_content < default_encrypt_length:
return base64.b64encode(rsa.encrypt(biz_content, _p))
offset = 0
params_lst = []
while len_content - offset > 0:
if len_content - offset > default_encrypt_length:
params_lst.append(rsa.encrypt(biz_content[offset:offset+default_encrypt_length], _p))
else:
params_lst.append(rsa.encrypt(biz_content[offset:], _p))
offset += default_encrypt_length
target = ''.join(params_lst)
return base64.b64encode(target)
最后一般需要使用base64算法将二进制流转成字符串方便进行放入需要的参数里面进行传递。解密同理可以使用rsa库的此方法
def rsa_decrypt(biz_content, private_key):
_pri = rsa.PrivateKey._load_pkcs1_pem(private_key)
biz_content = base64.b64decode(biz_content.encode('utf-8'))
# 1024bit key
default_length = 128
len_content = len(biz_content)
if len_content < default_length:
return rsa.decrypt(biz_content, _pri)
offset = 0
params_lst = []
while len_content - offset > 0:
if len_content - offset > default_length:
params_lst.append(rsa.decrypt(biz_content[offset: offset+default_length], _pri))
else:
params_lst.append(rsa.decrypt(biz_content[offset:], _pri))
offset += default_length
target = ''.join(params_lst)
return target
对于超过长度的数据,解密也需要分段进行解密。
下面继续展示对数据进行加签的过程:
def rsa_signature(data, private_key):
_pri = rsa.PrivateKey._load_pkcs1_pem(private_key)
signature = rsa.sign(data, _pri, 'SHA-1')
return base64.b64encode(signature)
验签使用:
def rsa_verify(signature, message, public_key):
_pub = rsa.PublicKey.load_pkcs1_openssl_pem(public_key)
signature = base64.b64decode(signature)
return rsa.verify(message, signature, _pub)
以上
Reference:
https://stuvel.eu/python-rsa-doc/usage.html#signing-and-verification Python-RSA 3.4.2 documentation
https://support.citrix.com/article/CTX122930#Decrypting%20the%20Private%20Key%20from%20the%20Command%20Line%20Interface How to Decrypt an RSA Private Key Using OpenSSL on NetScaler
https://segmentfault.com/a/1190000009396950?_ea=2278883 Python的RSA加密和PBE加密
https://stackoverflow.com/questions/1011572/convert-pem-key-to-ssh-rsa-format Convert pem key to ssh-rsa format
Python rsa公私钥生成 rsa公钥加解密(分段加解密)-私钥加签验签实战的更多相关文章
- RSA加密解密及RSA加签验签
RSA安全性应用场景说明 在刚接触RSA的时候,会混淆RSA加密解密和RSA加签验签的概念.简单来说加密解密是公钥加密私钥解密,持有公钥(多人持有)可以对数据加密,但是只有持有私钥(一人持有)才可以解 ...
- Java实现RSA密钥对并在加解密、加签验签中应用的实例
一.项目结构 二.代码具体实现 1.密钥对生成的两种方式:一种生成公钥私文件,一种生成公钥私串 KeyPairGenUtil.java package com.wangjinxiang.genkey. ...
- RSA加密解密与加签验签
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...
- RSA体系 c++/java相互进行加签验签--转
在web开发中,采用RSA公钥密钥体系自制ukey,文件证书登陆时,普遍的做法为:在浏览器端采用c++ activex控件,使用 c++的第三库openssl进行RAS加签操作,在服务器端采用java ...
- java RSA 加签验签【转】
引用自: http://blog.csdn.net/wangqiuyun/article/details/42143957/ java RSA 加签验签 package com.testdemo.co ...
- 微信小程序(17)-- RSA加密 解密 加签 验签
RSA加密 解密 加签 验签 /** * 注:区分RSA私钥的类型,有pkcs1和pkcs8.pkcs8格式的私钥主要用于Java中 pkcs1格式: -----BEGIN RSA PRIVATE K ...
- Java使用数字证书加密通信(加解密/加签验签)
本文中使用的Base64Utils.java可参考:http://www.cnblogs.com/shindo/p/6346618.html 证书制作方法可参考:http://www.cnblogs. ...
- RSA 加密 解密 公钥 私钥 签名 加签 验签
http://blog.csdn.net/21aspnet/article/details/7249401# http://www.ruanyifeng.com/blog/2013/06/rsa_al ...
- C# 数字证书 RSA加密解密 加签验签
KeyValuePair<string, string> keyPair = Encrypter.CreateRSAKey(); string privateKey = keyPair.V ...
随机推荐
- 机器学习算法总结(九)——降维(SVD, PCA)
降维是机器学习中很重要的一种思想.在机器学习中经常会碰到一些高维的数据集,而在高维数据情形下会出现数据样本稀疏,距离计算等困难,这类问题是所有机器学习方法共同面临的严重问题,称之为“ 维度灾难 ”.另 ...
- P1101 单词方阵 (单词方阵)
思路:就是白白的模拟 #include<iostream> using namespace std; ][]; ][]; char kk[] = "yizhong"; ...
- flash设置里面:您的 Flash 设置会一直保留到您退出 Chrome 为止。
疑问:flash设置里面:您的 Flash 设置会一直保留到您退出 Chrome 为止. 我记得以前的版本配置后就一直用啊,允许的就可以一直允许,现在这个sb版本退出后就恢复到默认,允许列表的网站就清 ...
- hdu4966 GGS-DDU
hdu4966 GGS-DDU 有 \(n\) 个课程,每种课程有 \(a_i\) 级,一开始你每种课程都为 \(0\) 级,有 \(m\) 个升级方案:\((x,\ l1,\ y,\ l2,\ c) ...
- eclipse如何设置断点&断点处运行快捷键
第一步: 设置断点:在该行最前面边框双击 或快捷键:Ctrl+Shift+B 第二步: Debug 运行启动 第三部: 运行到断点后: 使用快捷键F5,F6,F7单步执行. F5:Step ...
- 理解Shadow DOM(一)
1. 什么是Shadow DOM? Shadow DOM 如果按照英文翻译的话可以理解为 影子DOM, 何为影子DOM呢?可以理解为一般情况下使用肉眼看不到的DOM结构,那如果一般情况下看不到的话,那 ...
- python:unittest之跳过测试和预期失败的用例
在利用单元测试框架执行测试用例的过程中,有时只需要执行一部分用例,或者跳过某些暂不需要执行的用例,python的unittest框架就内置这样的功能. 前面的博客介绍了unittest框架的测试用例加 ...
- face alignment[Ordinary Procrustes Analysis]
人脸识别,大致可以分为以下四个步骤: 人脸检测:从图片中准确定位到人脸,并以矩形框将其裁剪出来: 人脸矫正(对齐): 检测到的人脸,可能角度不是很正,需要使其对齐,比如旋转,缩放: 特征提取:对矫正后 ...
- Google机器学习课程基于TensorFlow : https://developers.google.cn/machine-learning/crash-course
Google机器学习课程基于TensorFlow : https://developers.google.cn/machine-learning/crash-course https ...
- 一篇自己都看不懂的点分治&点分树学习笔记
淀粉质点分治可真是个好东西 Part A.点分治 众所周知,树上分治算法有$3$种:点分治.边分治.链分治(最后一个似乎就是树链剖分),它们名字的不同是由于分治方式的不同的.点分治,顾名思义,每一次选 ...