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笔记(叁)继续学习
Oct 24 Python
Python内置数据结构与操作符的练习题集锦
Jul 01 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
Python递归实现汉诺塔算法示例
Mar 19 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
利用Python如何生成便签图片详解
Jul 09 Python
python3判断url链接是否为404的方法
Aug 10 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
Jan 16 Python
Tensorflow:转置函数 transpose的使用详解
Feb 11 Python
keras得到每层的系数方式
Jun 15 Python
python 获取字典键值对的实现
Nov 12 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 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中的stdClass类
2014/04/18 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
javascript动画浅析
2012/08/30 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
js实现的二级横向菜单条实例
2015/08/22 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
详解nodejs 文本操作模块-fs模块(五)
2016/12/23 NodeJs
关于jQuery中fade(),show()起始位置的一点小发现
2017/04/25 jQuery
详解用vue编写弹出框组件
2017/07/04 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
在vue中使用jsx语法的使用方法
2019/09/30 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
iview实现图片上传功能
2020/06/29 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
使用python os模块复制文件到指定文件夹的方法
2019/08/22 Python
python requests证书问题解决
2019/09/05 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
伦敦新晋轻奢耳饰潮牌:Tada & Toy
2020/05/25 全球购物
优秀村官事迹材料
2014/01/10 职场文书
捐赠仪式主持词
2014/03/19 职场文书
会议开幕词
2015/01/28 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
冰雪公主观后感
2015/06/16 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
2019 入党申请书范文
2019/07/10 职场文书
Django程序的优化技巧
2021/04/29 Python
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS
python内置模块之上下文管理contextlib
2022/06/14 Python