python利用rsa库做公钥解密的方法教程


Posted in Python onDecember 10, 2017

前言

对于RSA的解密,即密文的数字的 D 次方求mod N 即可,即密文和自己做 D 次乘法,再对结果除以 N 求余数即可得到明文。D 和 N 的组合就是私钥(private key)。

算法的加密和解密还是很简单的,可是公钥和私钥的生成算法却不是随意的。使用RSA公钥解密,用openssl命令就是openssl rsautl -verify -in cipher_text -inkey public.pem -pubin -out clear_text,但其python网上还真没有找到有博文去写,只有hash的rsa解签名。

这里使用rsa库,如果没有可以到官方网址https://pypi.python.org/pypi/rsa/3.1.4下载。

具体的安装方法大家可以参考这里:https://3water.com/article/70331.htm

想了想原理,然后到rsa库的python代码里找了找,从verify的代码里提取了出来,又试验了试验,一切OK了。

代码如下:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys
#rsa
from rsa import PublicKey, common, transform, core
def f(cipher, PUBLIC_KEY):
 public_key = PublicKey.load_pkcs1(PUBLIC_KEY)
 encrypted = transform.bytes2int(cipher)
 decrypted = core.decrypt_int(encrypted, public_key.e, public_key.n)
 text = transform.int2bytes(decrypted) 
 if len(text) > 0 and text[0] == '\x01':
  pos = text.find('\x00')
  if pos > 0:
  return text[pos+1:]
  else:
  return None 
fn = sys.stdin.readline()[:-1]
public_key = sys.stdin.readline()[:-1]
x = f(open(fn).read(), open(public_key).read())
print x

用shell验证如下:

$ openssl genrsa -out pri2048.pem 2048
Generating RSA private key, 2048 bit long modulus
..+++
..............................................+++
e is 65537 (0x10001)
 $ openssl rsa -in pri2048.pem -out pub2048.pem -RSAPublicKey_out
writing RSA key
 $ echo -n 'Just a test' >1.txt
 $ openssl rsautl -sign -in 1.txt -inkey pri2048.pem -out 1.bin
 $ { echo 1.bin; echo pub2048.pem; } | ./test_rsa.py
Just a test

一切OK,注意,公钥pem从私钥里析出必须用-RSAPublicKey_out,这样pem文件的第一行和最后一行为以下,这样rsa.PublicKey.load_pkcs1才会认识。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python实现划词翻译
Apr 23 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
python微信公众号之关注公众号自动回复
Oct 25 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
Apr 25 Python
Python3.0中普通方法、类方法和静态方法的比较
May 03 Python
python变量命名的7条建议
Jul 04 Python
python tkinter canvas使用实例
Nov 04 Python
Python continue语句实例用法
Feb 06 Python
使用Django搭建网站实现商品分页功能
May 22 Python
python eventlet绿化和patch原理
Nov 21 Python
Python跨文件全局变量的实现方法示例
Dec 10 #Python
git进行版本控制心得详谈
Dec 10 #Python
Python内置模块turtle绘图详解
Dec 09 #Python
Python程序退出方式小结
Dec 09 #Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 #Python
Python爬取附近餐馆信息代码示例
Dec 09 #Python
Python的地形三维可视化Matplotlib和gdal使用实例
Dec 09 #Python
You might like
Discuz! Passport 通行证整合
2008/03/27 PHP
php中随机显示图片的函数代码
2011/06/23 PHP
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
php 判断页面或图片是否经过gzip压缩的方法
2017/04/05 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
js获得当前系统日期时间的方法
2015/05/06 Javascript
window.onload使用指南
2015/09/13 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
2019/11/25 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
Python的time模块中的常用方法整理
2015/06/18 Python
CentOS安装pillow报错的解决方法
2016/01/27 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
Django表单提交后实现获取相同name的不同value值
2020/05/14 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
Python进行特征提取的示例代码
2020/10/15 Python
CSS3实现圆角、阴影、透明效果并兼容各大浏览器
2014/08/08 HTML / CSS
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
如何实现一个自定义类的序列化
2012/05/22 面试题
水产养殖学应届生求职信
2013/09/29 职场文书
4s店机修工岗位职责
2013/12/20 职场文书
客户表扬信范文
2014/01/10 职场文书
音乐节策划方案
2014/06/09 职场文书
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫