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 ...
随机推荐
- Leetcode:0027
Leetcode:0027 题目:给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度.不要使用额外的数组空间,你必须在原地修改输入数组并在使用 ...
- 【ES6】export和important使用区别
export命令 export { name1, name2, …, nameN }; export { variable1 as name1, variable2 as name2, …, name ...
- ②---Java开发工具Eclipse安装配置
Java开发工具Eclipse安装及配置 以下将为大家介绍Java开发工具Eclipse安装及配置. 一.下载Eclipse安装文件 正所谓工欲善其事必先利其器,我们在开发java语言过程中同样需要依 ...
- pytorch visdom可视化工具学习—1—详细使用-2-plotting绘图
3)plotting绘图 我们已经包装了几种常见的plot类型,以便轻松创建基本的可视化.这些可视化是由Plotly驱动的. Visdom支持下列API.由 Plotly 提供可视化支持. vis.s ...
- ORA-08104
https://blog.csdn.net/daiqiulong2 create index idx_p_merchant_detail_id on D_ORDER_DETAIL (merchant_ ...
- Spring Security(五):2.2 History
Spring Security began in late 2003 as "The Acegi Security System for Spring". A question w ...
- 理解 vue-router的beforeEach无限循环的问题
在理解beforeEach无限循环之前,我们先来看一下beforeEach相关的知识点,该篇文章的项目是基于 express+vue+mongodb+session实现注册登录 这篇文章项目基础之上进 ...
- 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 3
备注: 因为文章太长,所以将它分为三部分,本文是第三部分. 第一部分:深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1 第二部分:深入浅出经典面试题:从浏览器中输入URL ...
- 提取jedis源码的一致性hash代码作为通用工具类
一致性Hash热点 一致性Hash算法是来解决热点问题,如果虚拟节点设置过小热点问题仍旧存在. 关于一致性Hash算法的原理我就不说了,网上有很多人提供自己编写的一致性Hash算法的代码示例,我在跑网 ...
- Windows Community Toolkit 4.0 - DataGrid - Overview
概述 Windows Community Toolkit 4.0 于 2018 月 8 月初发布:Windows Community Toolkit 4.0 Release Note. 4.0 版本相 ...