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中使用socket发送HTTP请求数据接收不完整问题解决方法
Feb 04 Python
Python中的index()方法使用教程
May 18 Python
Python3读取UTF-8文件及统计文件行数的方法
May 22 Python
解读Python编程中的命名空间与作用域
Oct 16 Python
Python实现线程状态监测简单示例
Mar 28 Python
Python面向对象实现一个对象调用另一个对象操作示例
Apr 08 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
python 上下文管理器及自定义原理解析
Nov 19 Python
Python如何使用Gitlab API实现批量的合并分支
Nov 27 Python
Django使用rest_framework写出API
May 21 Python
Django中ORM的基本使用教程
Dec 22 Python
Python 随机按键模拟2小时
Dec 30 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
PHP 读取文件的正确方法
2009/04/29 PHP
浅谈COOKIE和SESSION区别
2015/07/19 PHP
php文件扩展名判断及获取文件扩展名的N种方法
2015/09/12 PHP
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
Jquery实现带动画效果的经典二级导航菜单
2013/03/22 Javascript
jquery实现弹出层效果实例
2015/05/19 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
JS封装cookie操作函数实例(设置、读取、删除)
2015/11/17 Javascript
BootStrap按钮标签及基本样式
2016/11/23 Javascript
js操作浏览器的参数方法
2017/01/21 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
python计算最小优先级队列代码分享
2013/12/18 Python
Python入门篇之面向对象
2014/10/20 Python
python检测远程端口是否打开的方法
2015/03/14 Python
Python类定义和类继承详解
2015/05/08 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
spyder 在控制台(console)执行python文件,debug python程序方式
2020/04/20 Python
python接口自动化框架实战
2020/12/23 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
2021/02/18 Python
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
联想台湾官网:Lenovo TW
2018/05/09 全球购物
小学生自我评价范例
2013/09/24 职场文书
民事上诉状范文
2015/05/22 职场文书
北京青年观后感
2015/06/15 职场文书
贷款收入证明格式
2015/06/24 职场文书
校长新学期致辞
2015/07/30 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js
Moment的feature导致线上bug解决分析
2022/09/23 Javascript