python RSA加密、解密、签名
python中用于RSA加解密的库有好久个,本文主要讲解rsa、M2Crypto、Crypto这三个库对于RSA加密、解密、签名、验签的知识点。
知识基础
加密是为了保证传输内容隐私,签名是为了保证消息真实性。
服务器存私钥,客户端存公钥。(服务器和客户端关系可以考虑为 1:N)
客户端往服务器传输内容,更多考虑是隐私性,所以公钥签名、私钥解密。
服务器往客户端传输内容,更多考虑真实性,所以私钥签名,公钥验签。
消息的摘要生的算法常用的是MD5或者SHA1,消息内容不一样,生成的摘要信息一定不一样。
真实性的考虑一方面是内容由私钥拥有者发出,另一方面内容在传输过程中没有改变过,所以签名的对象是传输信息生成的消息摘要(摘要内容短,签名也会快些)。
每次加密的长度需要小于密钥长度-特殊位(128位公钥,最长可加密128-11=117位明文)。
每次解密的长度需要小于密钥的长度(128位私钥解密,解密密文长度需要小于等于128位)。
如果加解密内容过长,就需要分段加密、解密。
PEM格式的密钥为base64位文本格式。
环境配置
环境:MAC
python版本:2.7.15(因为公司用的版本都是这个,建议用python3的)
IED:PyCharm
密钥:PEM文件
rsa
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
|
知识点
- rsa计算密钥长度的方式是 common.byte_size(rsa_key.n)
- rsa加密:rsa.encrypt(message, pub_key)
- rsa解密:rsa.decrypt(crypto, priv_key)
- rsa签名:rsa.sign(message, priv_key, hash)
- rsa验签:rsa.verify(message, signature, pub_key)
- rsa默认没有私钥加密,公钥解密的方法(加解密传入错误的key会报错,如果想实现私钥加密,公钥解密可以自行模拟底层代码实现)
- 签名只能用私钥(用到私钥的n值,公钥没有n值,n、d、e具体什么意思请百度RSA算法原理)
- rsa加载公钥和私钥的方法不同
- rsa私钥签名时,需要传入的是不是具体的摘要信息(字符串),而是签名信息的hash对象(对象)
- 不同版本的rsa验签成功之后返回结果不一样,有的是True,有的是返回生成摘要算法名:如sha1
Crypto
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
|
知识点
- Crypto计算密钥长度的方法是 Crypto.Util.number.size(rsa_key.n) / 8(一个字节8位)
- Crypto导入密钥的方法是同一个 RSA.importKey(self, externKey, passphrase=None),externKey为密钥内容
- Crypto加密方法:Crypto.Cipher.PKCS1_v1_5.new(key).encrypt(self, message)
- Crypto解密方法:Crypto.Cipher.PKCS1_v1_5.new(key).decrypt(self, message)
- Crypto签名方法:Crypto.Signature.PKCS1_v1_5.new(key).sign(self, mhash)
- Crypto验签方法:Crypto.Signature.PKCS1_v1_5_cipper.new(key).verifyverify(self, mhash, S)
- Crypto公钥、私钥都可以互相加解密
- Crypto只能私钥签名,公钥验签,签名传入公钥会报错(底层有key.has_private()判断)
- Crypto私钥签名时,需要传入的是消息的摘要内容,所以摘要可以由不同的实现方式只要验签时摘要算法一致即可。
- Crypto验签之后成功返回结果True(不知道会不会与其他的)
M2Crypto
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
|
知识点
- M2Crypto计算密钥长度的方法是 rsa_key.len() / 8(一个字节8位)
- M2Crypto导入密钥的方法是不同 M2Crypto.RSA.load_pub_key(file),M2Crypto.RSA.load_key(file)//还有其他的,不列举了,使用load_key(file)传入公钥地址会报错。
- M2Crypto加密解密代码:(RSA class下)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
- 公钥和私钥具体实现RSA的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
- M2Crypto签名和验签 sign(self, digest, algo='sha1'):/verify(self, data, signature, algo='sha1'):
- M2Crypto公钥、私钥都可以互相加解密
- M2Crypto只能私钥签名,公钥验签,签名传入公钥会报错(公钥可以调用签名方法,但是IDE崩溃了)
- M2Crypto私钥签名时,需要传入的是消息的摘要内容,所以摘要可以由不同的实现方式只要验签时摘要算法一致即可。
- M2Crypto验签之后成功返回结果1(不知道会不会与其他的)
其他注意事项
- base64位encode和decode时,可以传入编码集,UTF-8会将+转化为u,将/转化为t
- 在和服务器交互时,‘+’、‘=’、‘/’ 等特殊字符可能会被转义,造成客户端和服务器内容细微的不一致而导致验签失败,尤其是两边使用的语言不通,所以要协商好转义方案。
更多资讯或疑问内容添加小编微信, 回复 “Python” ,领取更多资料哦
python RSA加密、解密、签名相关推荐
- python rsa加密解密_RSA加密解密(python版)
RSA的算法涉及三个参数,n.e.d. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质: ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- 前后端加密解密 【JS加密模块(md5 、 crypto 、 crypto-js、jsencrypt) python RSA加密解密(pycryptodome )模块安装与使用】
JS加密模块[js-md5(AES) . crypto (AES). crypto-js().jsencrypt(非对称加密.RSA)] 一.安装 npm install js-md5 npm ins ...
- Java使用RSA加密解密签名及校验
RSA加密解密类: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; i ...
- C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出
差点造了一整个轮子 .Net Framework 4.5 里面的RSA功能,并未提供简单对PEM密钥格式的支持(.Net Core有咩?),差点(还远着)造了一整个轮子,就为了支持PEM PKCS#8 ...
- java rsa 验_Java使用RSA加密解密签名及校验
RSA加密解密类: package com.ihep; import java.io.BufferedReader; import java.io.BufferedWriter; import jav ...
- python rsa加密解密 字符串_python_rsa加密解密
代码: #!/usr/bin/env python #encoding=utf-8 ''' 测试rsa加密解密 ''' from M2Crypto import RSA msg = 'aaaa-aaa ...
- java rsa签名_Java使用RSA加密解密签名及校验
由于项目要用到非对称加密解密签名校验什么的,于是参考<Java加密解密的艺术>写一个RSA进行加密解密签名及校验的Demo,代码很简单,特此分享! 一.项目截图 代码下载后,导入到ecli ...
- Python RSA 加密解密
RSA算法是一种非对称加密算法,可以用于数据的加密和解密.在Python中,我们可以使用Crypto库来实现RSA加密和解密. 要在Python中使用Crypto库进行加密和解密操作,需要先安装Cry ...
- RSA 加密解密签名验签
api package v1// get请求 import "github.com/gogf/gf/v2/frame/g"type GetKeyReq struct {g.Meta ...
最新文章
- 全国大学智能车竞赛完全模型组中的赛道标志
- linux 安装 nodejs
- ant 改变表格数据_学不会这几个操作,面试时千万别说自己精通数据分析
- 14. es 整合springboot
- Java排查问题随笔
- 宇宙人工智能计算机程序,由人工智能推理出:整个宇宙会变成一个玄计算机,宇宙是虚拟的...
- java ora 28040_Oracle 11g与112c中ORA-28040 错误解决
- 远程网络安装RHEL5
- ASP.NET使用Coolite.Ext.Web.dll,显示ext未定义的解决方法
- 计算机院校考研非歧视,2021考研昌吉学院学科教学(语文)045103调剂信息
- Python使用系统聚类方法进行数据分类案例一则
- HSRP+生成树+vlan间路由!
- Mac VLC播放器怎么禁止使用硬件解码?
- centos7下定时重启tomcat
- C++ 合并两个有序链表
- ajax json destoon,destoon框架中的微信自动登陆
- 结课作业:机械设计制造及其自动化文献综述
- golang单元测试:testing包的基本使用
- mysql timestamp 类型_MySQL timestamp类型
- 高速数据存储板资料:6U VPX 存储容量可达128TB,可通过网络(FTP协议)/PCLE 直接访问