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 struct.unpack
Sep 06 Python
Python2.x中str与unicode相关问题的解决方法
Mar 30 Python
Python判断文件和文件夹是否存在的方法
May 21 Python
运动检测ViBe算法python实现代码
Jan 09 Python
Python面向对象之继承代码详解
Jan 29 Python
python psutil库安装教程
Mar 19 Python
Python 25行代码实现的RSA算法详解
Apr 10 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
Python 3.8新特征之asyncio REPL
May 28 Python
python切片的步进、添加、连接简单操作示例
Jul 11 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
Mar 06 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 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将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
防止浏览器记住用户名及密码的简单实用方法
2013/04/22 Javascript
Javascript实现简单二级下拉菜单实例
2014/06/15 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
2017/08/12 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
pyqt4教程之widget使用示例分享
2014/03/07 Python
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
Python实现栈的方法
2015/05/26 Python
在类Unix系统上开始Python3编程入门
2015/08/20 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
python扫描proxy并获取可用代理ip的实例
2017/08/07 Python
python实现大文件分割与合并
2019/07/22 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
PyTorch里面的torch.nn.Parameter()详解
2020/01/03 Python
利用 Python ElementTree 生成 xml的实例
2020/03/06 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
CSS3实现内凹圆角的实例代码
2017/05/04 HTML / CSS
《两个铁球同时着地》教学反思
2014/02/13 职场文书
2014年社区庆元旦活动方案
2014/03/08 职场文书
经济信息系毕业生自荐信范文
2014/03/15 职场文书
设计师求职信模板
2014/05/06 职场文书
2014年小学生迎国庆65周年演讲稿
2014/09/27 职场文书
写给导师的自荐信
2015/03/06 职场文书
离婚纠纷代理词
2015/05/23 职场文书
springboot入门 之profile设置方式
2022/04/04 Java/Android