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 ...
随机推荐
- Linux:Day7(上) find、文件特殊权限、if语句
文件查找: 在文件系统上查找符合条件的文件: 文件查找工具:locate,find locate:非实时查找(数据库查找) find:实时查找: locate: 依赖于事先 构建的索引:索引的构建是在 ...
- solaris下安装oracle 11g与11g rac
1.To Find Swap, RAM, and OS Version 对于 Solaris 操作系统,查看 Swap, RAM, and OS Version 的方法: swap -l /usr/s ...
- Ubuntu 14.04 安装配置备忘录
完全在 Linux 下工作,大概有3年时间了. 之前都是用 Windows, 而把 Linux 装在虚拟机里,现在反过来,把 Windows 装在了虚拟机里,只是因为偶尔还要用网银的缘故. 以我这几年 ...
- 重置 Mac 上的 NVRAM 或 PRAM
https://support.apple.com/zh-cn/HT204063 如果 Mac 出现了与 NVRAM 或 PRAM 中储存的设置有关的问题,那么进行重置可能会有帮助. NVRAM( ...
- 【Codeforces 212E】Restaurants
Codeforces 212 E 题意:给一棵树,其中删去一个点,剩余的联通块们同一个联通块都得涂同一个颜色(黑或白),问黑色涂的个数有可能是哪些. 思路:肯定是背包. 假设现在删掉\(u\)这个节点 ...
- Nginx服务器的使用与反向代理负载均衡
目录 Nginx服务器 一:什么是Nginx? 什么是Nginx - Nginx与其他服努器的性能比较 二:如何在Linux中搭建Nginx服务器? 常见的错误 三:Nginx的反向代理和负载均衡 什 ...
- 网络拓扑自动发掘之三层设备惯用的SNMP OID的含义
原文地址:https://blog.csdn.net/maty_wang/article/details/81305070 1. ipNetToMediaIfIndex Name/OID: ipNet ...
- OO博客作业4:第13-14周作业总结
一.论述测试与正确性论证的效果差异,比较其优缺点 测试是设计若干组测试用例,运行程序并检验其是否完成预期功能.测试是一种直接发现BUG的方法,可以准确断定什么样的BUG会发生,并通过辅助调试进一步确定 ...
- 接口自动化框架(Pytest+request+Allure)
前言: 接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱. 接口自动化包含2个部分,功能性的接口自动化测试和并发接口自动化测试. 本次文章着重介绍第一种, ...
- javaMail发邮件,激活用户账号
用javamail实现注册用户验证邮箱功能.用户注册后随机生成一个uuid作为用户的标识,传递给用户然后作为路径参数.发送html的内容到用户注册的邮箱里,若用户点击后去往的页面提交username和 ...