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的三目运算符和not in运算符使用示例
Mar 03 Python
Python连接phoenix的方法示例
Sep 29 Python
Python实现加载及解析properties配置文件的方法
Mar 29 Python
Python 字符串与数字输出方法
Jul 16 Python
python中的不可变数据类型与可变数据类型详解
Sep 16 Python
Python实现查找数组中任意第k大的数字算法示例
Jan 23 Python
对python中list的拷贝与numpy的array的拷贝详解
Jan 29 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
Nov 29 Python
Pycharm调试程序技巧小结
Aug 08 Python
详解Python中Pyyaml模块的使用
Oct 08 Python
python字典与json转换的方法总结
Dec 28 Python
Django一小时写出账号密码管理系统
Apr 29 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文件上传实例详解!!!
2007/01/02 PHP
Ajax PHP简单入门教程代码
2008/04/25 PHP
Laravel5中防止XSS跨站攻击的方法
2016/10/10 PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
2017/01/20 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
THINKPHP3.2使用soap连接webservice的解决方法
2017/12/13 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
javascript函数以及基础写法100多条实用整理
2013/01/13 Javascript
js使用递归解析xml
2014/12/12 Javascript
jQuery中用dom操作替代正则表达式
2014/12/29 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
JavaScript各类型的关系图解
2015/10/16 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
javascript实现消灭星星小游戏简单版
2016/11/15 Javascript
JS之if语句对接事件动作逻辑(详解)
2017/06/28 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
vue-cli扩展多模块打包的示例代码
2018/04/09 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
python多线程socket编程之多客户端接入
2017/09/12 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
Python中os模块功能与用法详解
2020/02/26 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
Python如何输出警告信息
2020/07/30 Python
Python日志器使用方法及原理解析
2020/09/27 Python
如何在网站上添加谷歌定位信息
2016/04/16 HTML / CSS
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
博士生导师推荐信
2014/07/08 职场文书
2014年安全员工作总结
2014/11/13 职场文书
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis