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 相关文章推荐
pycharm 使用心得(六)进行简单的数据库管理
Jun 06 Python
python实现批量监控网站
Sep 09 Python
Python格式化日期时间操作示例
Jun 28 Python
使用python根据端口号关闭进程的方法
Nov 06 Python
Python中的heapq模块源码详析
Jan 08 Python
Python批量删除只保留最近几天table的代码实例
Apr 01 Python
pandas如何处理缺失值
Jul 31 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
Mar 24 Python
基于pandas向csv添加新的行和列
May 25 Python
python实现快速文件格式批量转换的方法
Oct 16 Python
Python 循环读取数据内存不足的解决方案
May 25 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
PHP原生模板引擎 最简单的模板引擎
2012/04/25 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
php绘制圆形的方法
2015/01/24 PHP
php随机抽奖实例分析
2015/03/04 PHP
php无序树实现方法
2015/07/28 PHP
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
微信JSSDK调用微信扫一扫功能的方法
2017/07/25 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
Element-UI踩坑之Pagination组件的使用
2018/10/29 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
2020/09/11 Javascript
在实例中重学JavaScript事件循环
2020/12/03 Javascript
Python学习笔记之os模块使用总结
2014/11/03 Python
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
对python requests的content和text方法的区别详解
2018/10/11 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
Django ORM filter() 的运用详解
2020/05/14 Python
PyQt5实现登录页面
2020/05/30 Python
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
应届生人事助理求职信
2013/11/09 职场文书
工作决心书
2014/03/11 职场文书
银行优秀员工推荐信
2015/03/24 职场文书
利用Python网络爬虫爬取各大音乐评论的代码
2021/04/13 Python
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android
Flask response响应的具体使用
2021/07/15 Python
利用Python多线程实现图片下载器
2022/03/25 Python
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android