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程序实例(通讯录)
Nov 29 Python
Python中使用ConfigParser解析ini配置文件实例
Aug 30 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
Apr 19 Python
python中scikit-learn机器代码实例
Aug 05 Python
解决PyCharm import torch包失败的问题
Oct 13 Python
对python 调用类属性的方法详解
Jul 02 Python
python logging日志模块原理及操作解析
Oct 12 Python
在pandas中遍历DataFrame行的实现方法
Oct 23 Python
Python的对象传递与Copy函数使用详解
Dec 26 Python
Python字符串函数strip()原理及用法详解
Jul 23 Python
详解python中的闭包
Sep 07 Python
Pycharm学生免费专业版安装教程的方法步骤
Sep 24 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
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
[原创]php实现数组按拼音顺序排序的方法
2017/05/03 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
js正确获取元素样式详解
2009/08/07 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
javascript实现获取浏览器版本、浏览器类型
2015/12/02 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
2016/10/31 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
vue cli 全面解析
2018/02/28 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
微信小程序之数据绑定原理解析
2019/08/14 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
pytorch下大型数据集(大型图片)的导入方式
2020/01/08 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
python如何提升爬虫效率
2020/09/27 Python
Python 随机按键模拟2小时
2020/12/30 Python
网吧收银员岗位职责
2013/12/14 职场文书
预备党员入党思想汇报
2014/01/04 职场文书
关于青春的演讲稿
2014/05/05 职场文书
安全生产专项整治方案
2014/05/06 职场文书
高中同学会活动方案
2014/08/14 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
会计求职信怎么写
2015/03/20 职场文书
2015公司年度工作总结
2015/05/14 职场文书
2015年后备干部工作总结
2015/05/15 职场文书
大学生安全教育主题班会
2015/08/12 职场文书
校园安全主题班会
2015/08/12 职场文书
运动会200米广播稿
2015/08/19 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书
比较node.js和Deno
2021/04/27 Javascript