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 相关文章推荐
在Django框架中设置语言偏好的教程
Jul 27 Python
python学习之面向对象【入门初级篇】
Jan 21 Python
理解python中生成器用法
Dec 20 Python
浅析Python四种数据类型
Sep 26 Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 Python
python标识符命名规范原理解析
Jan 10 Python
Python实现计算长方形面积(带参数函数demo)
Jan 18 Python
Python使用Socket实现简单聊天程序
Feb 28 Python
Python Matplotlib简易教程(小白教程)
Jul 28 Python
python 基于opencv 绘制图像轮廓
Dec 11 Python
linux系统下pip升级报错的解决方法
Jan 31 Python
Python docx库删除复制paragraph及行高设置图片插入示例
Jul 23 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
php.ini中文版
2006/10/09 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
基于Swoole实现PHP与websocket聊天室
2016/08/03 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
jQuery 1.5最新版本的改进细节分析
2011/01/19 Javascript
关于js类的定义
2011/06/28 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
js获取字符串最后一位方法汇总
2014/11/13 Javascript
jQuery中[attribute!=value]选择器用法实例
2014/12/31 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
jQuery无刷新切换主题皮肤实例讲解
2015/10/21 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
JS中的三个循环小结
2017/06/20 Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
2017/07/09 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
vue实现带复选框的树形菜单
2019/05/27 Javascript
Python计算三角函数之asin()方法的使用
2015/05/15 Python
Python实现代码统计工具(终极篇)
2016/07/04 Python
浅析Python中yield关键词的作用与用法
2016/11/29 Python
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
python中itertools模块zip_longest函数详解
2018/06/12 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
python通过微信发送邮件实现电脑关机
2018/06/20 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
django框架模板中定义变量(set variable in django template)的方法分析
2019/06/24 Python
python实现人工蜂群算法
2020/09/18 Python
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
个人自我评价范文
2014/02/05 职场文书
药品开票员岗位职责
2015/04/15 职场文书
python flask框架快速入门
2021/05/14 Python
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript