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之通过Python连接数据库
Oct 28 Python
用Python计算三角函数之atan()方法的使用
May 15 Python
微信跳一跳游戏python脚本
Apr 01 Python
Python动态生成多维数组的方法示例
Aug 09 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
Nov 10 Python
Python中的heapq模块源码详析
Jan 08 Python
django表单的Widgets使用详解
Jul 22 Python
python psutil模块使用方法解析
Aug 01 Python
django基于restframework的CBV封装详解
Aug 08 Python
Python一键安装全部依赖包的方法
Aug 12 Python
python使用yield压平嵌套字典的超简单方法
Nov 02 Python
Python实现鼠标自动在屏幕上随机移动功能
Mar 14 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实现保存submit内容之后禁止刷新
2014/03/19 PHP
微信支付开发告警通知实例
2016/07/12 PHP
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
2014/06/16 Javascript
node.js实现逐行读取文件内容的代码
2014/06/27 Javascript
使用jquery.validate自定义方法实现"手机号码或者固话至少填写一个"的逻辑验证
2014/09/01 Javascript
jQuery Html控件基本操作(日常收集整理)
2016/03/11 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
2017/01/18 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
JavaScript设计模式之模板方法模式原理与用法示例
2018/08/07 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
JavaScript对象访问器Getter及Setter原理解析
2020/12/08 Javascript
python数据化运营的重要意义
2019/11/25 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
如何让IE9以下版本(ie6/7/8)认识html5元素
2013/04/01 HTML / CSS
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
自荐信封面
2013/12/04 职场文书
出国留学经济担保书
2014/04/01 职场文书
团日活动总结
2014/04/28 职场文书
冬季安全检查方案
2014/05/23 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
见习报告格式范文
2014/11/08 职场文书
端午节寄语2015
2015/03/23 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
五年级作文之劳动作文
2019/11/12 职场文书
php TP5框架生成二维码链接
2021/04/01 PHP
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android
JavaScript执行机制详细介绍
2021/12/06 Javascript