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的即时标记项目练习笔记
Sep 18 Python
研究Python的ORM框架中的SQLAlchemy库的映射关系
Apr 25 Python
Python实现统计英文单词个数及字符串分割代码
May 28 Python
python查看微信好友是否删除自己
Dec 19 Python
Python实现扣除个人税后的工资计算器示例
Mar 26 Python
python 处理数字,把大于上限的数字置零实现方法
Jan 28 Python
利用anaconda保证64位和32位的python共存
Mar 09 Python
python线程定时器Timer实现原理解析
Nov 30 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
Python for循环通过序列索引迭代过程解析
Feb 07 Python
Python reversed函数及使用方法解析
Mar 17 Python
Python3+selenium实现cookie免密登录的示例代码
Mar 18 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
解析CI的AJAX分页 另类实现方法
2013/06/27 PHP
php判断正常访问和外部访问的示例
2014/02/10 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
PHP中函数gzuncompress无法使用的解决方法
2017/03/02 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
浅谈PHP进程管理
2019/03/08 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
ajax请求get与post的区别总结
2013/11/04 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
2015/07/27 Javascript
JS随机洗牌算法之数组随机排序
2016/03/23 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
2016/06/20 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
微信小程序版翻牌小游戏
2018/01/26 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
2018/11/01 Python
Python3匿名函数lambda介绍与使用示例
2019/05/18 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
详解python解压压缩包的五种方法
2019/07/05 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
大学毕业生简单自荐信
2013/11/05 职场文书
5s推行计划书
2014/05/06 职场文书
物流专业自荐信
2014/05/23 职场文书
高考标语大全
2014/06/05 职场文书
ktv好的活动方案
2014/08/15 职场文书
反邪教观后感
2015/06/11 职场文书