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 ...
随机推荐
- UVA1613-K-Graph Oddity(贪心)
Problem UVA1613-K-Graph Oddity Accept: 108 Submit: 884Time Limit: 3000 mSec Problem Description Inp ...
- 【转】JS中setTimeout和setInterval的最大延时值详解
前言 JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.而这篇文中主要给大家介绍的是关于JS中setTi ...
- Emacs 中使用中文插件 eim
在 Emacs 中输入中文,一般用 ibus 一类的输入法也能应付,但来回切换有点麻烦,这里介绍国人写的一个好插件 eim. - 安装 由于在 list-packages 中没有找到这个插件,所以不能 ...
- leetcode 153. Find Minimum in Rotated Sorted Array 、154. Find Minimum in Rotated Sorted Array II 、33. Search in Rotated Sorted Array 、81. Search in Rotated Sorted Array II 、704. Binary Search
这4个题都是针对旋转的排序数组.其中153.154是在旋转的排序数组中找最小值,33.81是在旋转的排序数组中找一个固定的值.且153和33都是没有重复数值的数组,154.81都是针对各自问题的版本1 ...
- 【转】git-stash用法小结
https://www.cnblogs.com/tocy/p/git-stash-reference.html 缘起 今天在看一个bug,之前一个分支的版本是正常的,在新的分支上上加了很多日志没找到原 ...
- vsftpd 有关vsftpd的3个注意事项。。sshd[pid]: fatal: chroot into directory without nodev and either noexec or nosuid
今天帮助已好友配置vsftpd,可能是长时间不用这个东西了,竟然这里个半天才把需求折腾完, 其实需求简单,就是使用系统账户登录,不可跳转目录,限制权限,只能上次不能下载. 懵逼一: 最开始配置sftp ...
- P1440 求m区间内的最小值--洛谷luogu
题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入输出格式 输入格式: 第一行两个 ...
- FineUIPro v3.5.0发布了,减少 90% 的上行数据量,15行代码全搞定!
一切为客户着想 一切的一切还得从和一位台湾客户的沟通说起: 客户提到将ViewState保存在服务器端以减少上行数据量,从而加快页面的回发速度. 但是在FineUI中,控件状态都保存在FState中, ...
- Linux Namespace : 简介
在初步的了解 docker 后,笔者期望通过理解 docker 背后的技术原理来深入的学习和使用 docker,接下来的几篇文章简单的介绍下 linux namespace 的概念以及基本用法. na ...
- go项目
1.循环使用缓存 每条日志需要开辟缓存块来存储内容,以减少频繁的内存分配与回收.日志结构体定义如下: type MLogger struct { // freeList is a list of by ...