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使用正则表达式获取网页中所需要的信息
Jan 29 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
Feb 08 Python
Python如何抓取天猫商品详细信息及交易记录
Feb 23 Python
python绘制立方体的方法
Jul 02 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
Django中提供的6种缓存方式详解
Aug 05 Python
python实现操作文件(文件夹)
Oct 31 Python
flask 使用 flask_apscheduler 做定时循环任务的实现
Dec 10 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
Jan 14 Python
如何基于Python实现word文档重新排版
Sep 29 Python
Python基于callable函数检测对象是否可被调用
Oct 16 Python
Python必备技巧之字符数据操作详解
Mar 23 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 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
2011/07/17 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
JAVASCRIPT下判断IE与FF的比较简单的方式
2008/10/17 Javascript
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
window.onload追加函数使用示例
2014/03/03 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
深入理解JavaScript编程中的同步与异步机制
2015/06/24 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
AngularJS入门教程之更多模板详解
2016/08/19 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
2019/09/11 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
vue实现简易的双向数据绑定
2020/12/29 Vue.js
[01:05:41]EG vs Optic Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python中的魔法方法深入理解
2014/07/09 Python
python获得一个月有多少天的方法
2015/06/04 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
python实现的读取网页并分词功能示例
2019/10/29 Python
在python中做正态性检验示例
2019/12/09 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
HSRP的含义以及如何工作
2014/09/10 面试题
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
大学生专科学习生活的自我评价
2013/12/07 职场文书
学习优秀党员杨宗兴先进事迹材料思想汇报
2014/09/14 职场文书
丧事答谢词
2015/01/05 职场文书
放假通知范文
2015/04/14 职场文书
导游词之神仙居景区
2019/11/15 职场文书
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技