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 相关文章推荐
python3使用urllib模块制作网络爬虫
Apr 08 Python
django基础之数据库操作方法(详解)
May 24 Python
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
Python wxPython库Core组件BoxSizer用法示例
Sep 03 Python
python实现名片管理系统项目
Apr 26 Python
python自动化工具之pywinauto实例详解
Aug 26 Python
python编写猜数字小游戏
Oct 06 Python
Win下PyInstaller 安装和使用教程
Dec 25 Python
Python使用进程Process模块管理资源
Mar 05 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
如何利用python生成MD5并去重
Dec 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
德劲1103二次变频版的打磨
2021/03/02 无线电
php join函数应用
2011/05/04 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
PHP防止表单重复提交的几种常用方法汇总
2014/08/19 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
php加密解密字符串示例
2016/10/13 PHP
jquery鼠标停止移动事件
2013/12/21 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
Javascript的比较汇总
2016/07/25 Javascript
使用Fullpage插件快速开发整屏翻页的页面
2017/09/13 Javascript
vue里input根据value改变背景色的实例
2018/09/29 Javascript
node之本地服务器图片上传的方法示例
2019/03/26 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
2020/05/14 Javascript
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
Python ATM功能实现代码实例
2020/03/19 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
用HTML5制作数字时钟的教程
2015/05/11 HTML / CSS
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
说明书格式及范文
2014/05/07 职场文书
淘宝客服工作职责
2014/07/11 职场文书
介绍信的格式
2015/01/30 职场文书
会议承办单位欢迎词
2015/09/30 职场文书
使用jpa之动态插入与修改(重写save)
2021/11/23 Java/Android
Mysql中常用的join连接方式
2022/05/11 MySQL
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android
SQL bool盲注和时间盲注详解
2022/07/23 SQL Server