Python3非对称加密算法RSA实例详解


Posted in Python onDecember 06, 2018

本文实例讲述了Python3非对称加密算法RSA。分享给大家供大家参考,具体如下:

python3 可以使用 Crypto.PublicKey.RSA 和 rsa 生成公钥、私钥。

其中 python3.6 Crypto 库的安装方式请参考前面一篇《Python3对称加密算法AES、DES3》

rsa 加解密的库使用 pip3 install rsa 就行了

C:\WINDOWS\system32>pip3 install rsa
Collecting rsa
  Downloading https://files.pythonhosted.org/packages/e1/ae/baedc9cb175552e95f3395c43055a6a5e125ae4d48a1d7a924baca83e92e/rsa-3.4.2-py2.py3-none-any.whl (46kB)
    100% |????????????????????????????????| 51kB 99kB/s
Collecting pyasn1>=0.1.3 (from rsa)
  Downloading https://files.pythonhosted.org/packages/a0/70/2c27740f08e477499ce19eefe05dbcae6f19fdc49e9e82ce4768be0643b9/pyasn1-0.4.3-py2.py3-none-any.whl (72kB)
    100% |????????????????????????????????| 81kB 289kB/s
Installing collected packages: pyasn1, rsa
Successfully installed pyasn1-0.4.3 rsa-3.4.2

使用 Crypto.PublicKey.RSA 生成公钥、私钥:

import Crypto.PublicKey.RSA
import Crypto.Random
x = Crypto.PublicKey.RSA.generate(2048)
a = x.exportKey("PEM") # 生成私钥
b = x.publickey().exportKey()  # 生成公钥
with open("a.pem", "wb") as x:
  x.write(a)
with open("b.pem", "wb") as x:
  x.write(b)
y = Crypto.PublicKey.RSA.generate(2048, Crypto.Random.new().read)  # 使用 Crypto.Random.new().read 伪随机数生成器
c = y.exportKey()  # 生成私钥
d = y.publickey().exportKey()  #生成公钥
with open("c.pem", "wb") as x:
  x.write(c)
with open("d.pem", "wb") as x:
  x.write(d)

使用 Crypto.PublicKey.RSA.importKey(private_key) 生成公钥和证书:

import Crypto.PublicKey.RSA
with open("a.pem", "rb") as x:
  xx = Crypto.PublicKey.RSA.importKey(x.read())
b = xx.publickey().exportKey()  # 生成公钥
with open("b.pem", "wb") as x:
  x.write(b)
a = xx.exportKey("DER")  # 生成 DER 格式的证书
with open("a.der", "wb") as x:
  x.write(a)

使用 rsa 生成公钥、私钥:

import rsa
f, e = rsa.newkeys(2048)  # 生成公钥、私钥
e = e.save_pkcs1() # 保存为 .pem 格式
with open("e.pem", "wb") as x: # 保存私钥
  x.write(e)
f = f.save_pkcs1() # 保存为 .pem 格式
with open("f.pem", "wb") as x: # 保存公钥
  x.write(f)

RSA非对称加密算法实现:

使用Crypto模块:

import Crypto.PublicKey.RSA
import Crypto.Cipher.PKCS1_v1_5
import Crypto.Random
import Crypto.Signature.PKCS1_v1_5
import Crypto.Hash
y = b"abcdefg1234567"
with open("b.pem", "rb") as x:
  b = x.read()
  cipher_public = Crypto.Cipher.PKCS1_v1_5.new(Crypto.PublicKey.RSA.importKey(b))
  cipher_text = cipher_public.encrypt(y) # 使用公钥进行加密
with open("a.pem", "rb") as x:
  a = x.read()
  cipher_private = Crypto.Cipher.PKCS1_v1_5.new(Crypto.PublicKey.RSA.importKey(a))
  text = cipher_private.decrypt(cipher_text, Crypto.Random.new().read)  # 使用私钥进行解密
assert text == y  # 断言验证
with open("c.pem", "rb") as x:
  c = x.read()
  c_rsa = Crypto.PublicKey.RSA.importKey(c)
  signer = Crypto.Signature.PKCS1_v1_5.new(c_rsa)
  msg_hash = Crypto.Hash.SHA256.new()
  msg_hash.update(y)
  sign = signer.sign(msg_hash)  # 使用私钥进行'sha256'签名
with open("d.pem", "rb") as x:
  d = x.read()
  d_rsa = Crypto.PublicKey.RSA.importKey(d)
  verifer = Crypto.Signature.PKCS1_v1_5.new(d_rsa)
  msg_hash = Crypto.Hash.SHA256.new()
  msg_hash.update(y)
  verify = verifer.verify(msg_hash, sign) # 使用公钥验证签名
  print(verify)

运行结果:

True

使用 rsa 模块:

import rsa
y = b"abcdefg1234567"
with open("e.pem", "rb") as x:
  e = x.read()
  e = rsa.PrivateKey.load_pkcs1(e)  # load 私钥
with open("f.pem", "rb") as x:
  f = x.read()
  f = rsa.PublicKey.load_pkcs1(f) # load 公钥,由于之前生成的私钥缺少'RSA'字段,故无法 load
cipher_text = rsa.encrypt(y, f) # 使用公钥加密
text = rsa.decrypt(cipher_text, e)  # 使用私钥解密
assert text == y  # 断言验证
sign = rsa.sign(y, e, "SHA-256") # 使用私钥进行'sha256'签名
verify = rsa.verify(y, sign, f) # 使用公钥验证签名
print(verify)

运行结果:

True

Python 相关文章推荐
详解Python list 与 NumPy.ndarry 切片之间的对比
Jul 24 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
python邮件发送smtplib使用详解
Jun 16 Python
使用numba对Python运算加速的方法
Oct 15 Python
对Python+opencv将图片生成视频的实例详解
Jan 08 Python
Django项目中添加ldap登陆认证功能的实现
Apr 04 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
Feb 05 Python
关于Python字符串显示u...的解决方式
Mar 06 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 Python
Python实现猜年龄游戏代码实例
Mar 25 Python
python3实现飞机大战
Nov 29 Python
python开发制作好看的时钟效果
May 02 Python
Python3对称加密算法AES、DES3实例详解
Dec 06 #Python
Python http接口自动化测试框架实现方法示例
Dec 06 #Python
python的常用模块之collections模块详解
Dec 06 #Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 #Python
Python操作json的方法实例分析
Dec 06 #Python
Python多线程应用于自动化测试操作示例
Dec 06 #Python
Python实现多属性排序的方法
Dec 05 #Python
You might like
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
PHP生成月历代码
2007/06/14 PHP
隐性调用php程序的方法
2009/03/09 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
比较详细的关于javascript中void(0)的具体含义解释
2007/08/02 Javascript
JavaScript基本编码模式小结
2012/05/23 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
详解能在多种前端框架下使用的表格控件
2017/01/11 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
2018/10/17 Python
3分钟学会一个Python小技巧
2018/11/23 Python
Python实现加密接口测试方法步骤详解
2020/06/05 Python
python中的yield from语法快速学习
2020/11/06 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
外贸业务员的岗位职责
2013/11/23 职场文书
纠纷协议书
2014/04/16 职场文书
捐资助学感谢信
2015/01/21 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
行政诉讼答辩状
2015/05/21 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers