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中使用next()方法操作文件的教程
May 24 Python
python getopt详解及简单实例
Dec 30 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
获取python文件扩展名和文件名方法
Feb 02 Python
利用Python进行数据可视化常见的9种方法!超实用!
Jul 11 Python
Python opencv实现人眼/人脸识别以及实时打码处理
Apr 29 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
python 项目目录结构设置
Feb 14 Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
Feb 26 Python
基于Python绘制美观动态圆环图、饼图
Jun 03 Python
python如何爬取网页中的文字
Jul 28 Python
python安装sklearn模块的方法详解
Nov 28 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四种基础算法代码实例
2013/10/29 PHP
php JWT在web端中的使用方法教程
2018/09/06 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
2011/04/27 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
详解Vue整合axios的实例代码
2017/06/21 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
解决vue attr取不到属性值的问题
2018/09/18 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
layui 富文本赋值,取值,取纯文本值的实例
2019/09/18 Javascript
用pycharm开发django项目示例代码
2018/10/24 Python
Python 实现数组相减示例
2019/12/27 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
2020/07/14 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
YSL圣罗兰美妆俄罗斯官网:Yves Saint Lauret RU
2020/09/23 全球购物
澳大利亚购买太阳镜和眼镜网站:Glamoureyes
2020/09/22 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
this关键字的含义
2015/04/08 面试题
一份软件工程师的面试试题
2016/02/01 面试题
超市创业计划书
2014/09/15 职场文书
领导欢迎词致辞
2015/01/23 职场文书
迎新生欢迎词
2015/01/23 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
七一表彰大会简报
2015/07/20 职场文书
自考生自我评价
2019/06/21 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL