Python下实现的RSA加密/解密及签名/验证功能示例


Posted in Python onJuly 17, 2017

本文实例讲述了Python下实现的RSA加密/解密及签名/验证功能。分享给大家供大家参考,具体如下:

原文是py2环境,而我的环境是py3,所以对原代码做了修改:decode(), encode()

import rsa
# 生成密钥
(pubkey, privkey) = rsa.newkeys(1024)
# 保存密钥
with open('public.pem','w+') as f:
  f.write(pubkey.save_pkcs1().decode())
with open('private.pem','w+') as f:
  f.write(privkey.save_pkcs1().decode())
# 导入密钥
with open('public.pem','r') as f:
  pubkey = rsa.PublicKey.load_pkcs1(f.read().encode())
with open('private.pem','r') as f:
  privkey = rsa.PrivateKey.load_pkcs1(f.read().encode())
# 明文
message = 'hello'
# 公钥加密
crypto = rsa.encrypt(message.encode(), pubkey)
# 私钥解密
message = rsa.decrypt(crypto, privkey).decode()
print(message)
# 私钥签名
signature = rsa.sign(message.encode(), privkey, 'SHA-1')
# 公钥验证
rsa.verify(message.encode(), signature, pubkey)

改进版:

import rsa
# 生成密钥
(pubkey, privkey) = rsa.newkeys(1024)
# =================================
# 场景?:密钥保存导入
# =================================
# 保存密钥
with open('public.pem','w+') as f:
  f.write(pubkey.save_pkcs1().decode())
with open('private.pem','w+') as f:
  f.write(privkey.save_pkcs1().decode())
# 导入密钥
with open('public.pem','r') as f:
  pubkey = rsa.PublicKey.load_pkcs1(f.read().encode())
with open('private.pem','r') as f:
  privkey = rsa.PrivateKey.load_pkcs1(f.read().encode())
# =================================
# 场景一:数据泄密问题
# 为了开拓市场,公司经理分派了一群业务员到世界各地考察商机。
# 业务员们都很精明强干,很快就各自发现了很好的商机。
# 时间就是金钱!他们必须马上用email向经理汇报。
# 这就麻烦来了:网络是及其不安全的!
# 各种数据被抓包、邮箱密码泄露...太可怕了!商业竞争对手的各种手段太可怕了!
# 如何让业务员的email安全地送到公司经理的手里?(即使数据被抓包、邮箱密码泄露...)
# 太不安全了,怎么办?
# 
# 没错!聪明的您一定想到了:加密。
# =================================
# 明文:业务员发现的商机
message = '这是商机:...'
# 业务员用公司经理事先给的公钥对明文加密,得到密文
crypto_email_text = rsa.encrypt(message.encode(), pubkey)
# 然后,业务员用email发送密文
# 。。。
# email在网络传输中 。。。(各种数据被抓包、邮箱密码泄露)
# 没办法,还是被有心人看到了这封email:
print(crypto_email_text) # 什么鬼?看不懂啊!
# 最后,公司经理也收到了业务员们发了的email。打开,也只看到一堆奇怪的字符!
# 没问题,公司经理用自己的私钥对收到的密文进行解密,就可得到明文
message = rsa.decrypt(crypto_email_text, privkey).decode()
# 然后,就可以看到重要的商机信息了
print(message)
# =================================
# 场景二:身份确认问题
# 为了开拓市场,公司经理分派了一群业务员到各地考察商机。
# 在这过程中,公司经理常常通过email向业务员下达重要指令
# 然而,网络是及其不安全的!譬如:数据包被修改、邮箱密码泄露...
# 商业竞争对手可以通过各种手段伪造/修改公司经理的重要指令!
# 
# 话说这天早上,业务员照常打开邮箱,发现公司经理的一封email:命令他马上回国。
# 不对啊。昨天说要在这边扩大业务,怎么今天就变了?
# 这封email是公司经理本人发的吗?
# 怎么办?
# 
# 没错!聪明的您一定也想到了:签名。
# =================================
# 明文:公司经理的指令
message = '这是重要指令:...'
# 公司经理私钥签名
crypto_email_text = rsa.sign(message.encode(), privkey, 'SHA-1')
# 业务员同时收到指令明文、密文,然后用公钥验证,进行身份确认
rsa.verify(message.encode(), crypto_email_text, pubkey)
Python 相关文章推荐
Python用GET方法上传文件
Mar 10 Python
Python减少循环层次和缩进的技巧分析
Mar 15 Python
pandas中Timestamp类用法详解
Dec 11 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
flask框架json数据的拿取和返回操作示例
Nov 28 Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 Python
Python实现疫情通定时自动填写功能(附代码)
May 27 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
Jan 23 Python
python re模块常见用法例举
Mar 01 Python
python 定义函数 返回值只取其中一个的实现
May 21 Python
浅谈pytorch中的dropout的概率p
May 27 Python
Python绘制散点图之可视化神器pyecharts
Jul 07 Python
Python 的类、继承和多态详解
Jul 16 #Python
PyQt 线程类 QThread使用详解
Jul 16 #Python
Pycharm技巧之代码跳转该如何回退
Jul 16 #Python
Python基础教程之浅拷贝和深拷贝实例详解
Jul 15 #Python
Python利用flask sqlalchemy实现分页效果
Aug 02 #Python
Python实现发送QQ邮件的封装
Jul 14 #Python
python记录程序运行时间的三种方法
Jul 14 #Python
You might like
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
JavaScript 全面解析各种浏览器网页中的JS 执行顺序
2009/02/17 Javascript
我的javascript 函数链之演变
2011/04/07 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
再谈javascript原型继承
2014/11/10 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
为什么我们要做三份 Webpack 配置文件
2017/09/18 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
2018/07/23 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
简单介绍Python中的floor()方法
2015/05/15 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
python实现网站用户名密码自动登录功能
2019/08/09 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
戴尔英国翻新电脑和电子产品:Dell UK Refurbished Computers
2019/07/30 全球购物
西班牙在线光学:Visual-Click
2020/06/22 全球购物
可靠的数据流传输TCP
2016/03/15 面试题
护理学中专毕业生求职信
2013/11/11 职场文书
董事长岗位职责
2013/11/30 职场文书
团支书竞选演讲稿
2014/04/28 职场文书
教师年度考核评语
2014/04/28 职场文书
红领巾广播站广播稿
2014/10/19 职场文书
Python WSGI 规范简介
2021/04/11 Python
Navicat for MySQL的使用教程详解
2021/05/27 MySQL
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL