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 相关文章推荐
17个Python小技巧分享
Jan 23 Python
在MAC上搭建python数据分析开发环境
Jan 26 Python
tensorflow实现简单的卷积神经网络
May 24 Python
详解python爬虫系列之初识爬虫
Apr 06 Python
Python应用领域和就业形势分析总结
May 14 Python
对Python中小整数对象池和大整数对象池的使用详解
Jul 09 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
Aug 20 Python
python字符串判断密码强弱
Mar 18 Python
Django使用rest_framework写出API
May 21 Python
Python 爬取淘宝商品信息栏目的实现
Feb 06 Python
Python OpenCV实现图像模板匹配详解
Apr 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
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
php smarty模版引擎中的缓存应用
2009/12/11 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
PHP实现利用MySQL保存session的方法
2014/08/23 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
四个PHP非常实用的功能
2015/09/29 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
PHP CURL使用详解
2019/03/21 PHP
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
ES6生成器用法实例分析
2017/04/10 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
WebStorm ES6 语法支持设置&babel使用及自动编译(详解)
2017/09/08 Javascript
vue两个组件间值的传递或修改方式
2018/07/04 Javascript
JavaScript面向对象继承原理与实现方法分析
2018/08/09 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
2018/02/13 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
Python matplotlib绘制饼状图功能示例
2019/09/10 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
Python绘制组合图的示例
2020/09/18 Python
python装饰器代码深入讲解
2021/03/01 Python
金融专业应届生求职信
2013/11/02 职场文书
九月份红领巾广播稿
2014/01/22 职场文书
高一英语教学反思
2014/01/22 职场文书
绿化先进工作者事迹材料
2014/01/30 职场文书
运动会入场词50字
2014/02/20 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
教师师德表现自我评价
2015/03/05 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python