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 strip lstrip rstrip使用方法
Sep 06 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
Apr 17 Python
Python 列表排序方法reverse、sort、sorted详解
Jan 22 Python
Python使用django框架实现多人在线匿名聊天的小程序
Nov 29 Python
mac PyCharm添加Python解释器及添加package路径的方法
Oct 29 Python
使用TFRecord存取多个数据案例
Feb 17 Python
基于Python的OCR实现示例
Apr 03 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
Apr 15 Python
使用PyQt5实现图片查看器的示例代码
Apr 21 Python
python实现图像外边界跟踪操作
Jul 13 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
Jul 27 Python
python 代码运行时间获取方式详解
Sep 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
PHP XML和数组互相转换详解
2016/10/26 PHP
js静态作用域的功能。
2006/12/25 Javascript
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
MooTools 1.2介绍
2009/09/14 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
js 动态给元素添加、移除事件的实现方法
2016/07/19 Javascript
jQuery简单倒计时效果完整示例
2016/09/20 Javascript
原生js仿jquery一些常用方法(必看篇)
2016/09/20 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
jquery+css3实现的经典弹出层效果示例
2020/05/16 jQuery
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
JS实现无限轮播无倒退效果
2020/09/21 Javascript
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
详解Python如何获取列表(List)的中位数
2016/08/12 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
详解python编译器和解释器的区别
2019/06/24 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
Python爬虫破解登陆哔哩哔哩的方法
2020/11/17 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
什么是静态路由?什么是动态路由?各自的特点是什么?
2015/09/16 面试题
迎接领导欢迎词
2014/01/11 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
公安机关正风肃纪剖析材料
2014/10/10 职场文书
2014年办公室文员工作总结
2014/11/12 职场文书
2015年青年教师工作总结
2015/05/25 职场文书
北京大学中文系教授推荐的10本小说
2019/08/08 职场文书
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
拙作再改《我的收音机情缘》
2022/04/05 无线电