RSA公钥文件解密密文的原理分析

前言

最近在学习 RSA 加解密过程中遇到一个这样的难题:假设已知 publickey 公钥文件和加密后的密文 flag ,如何对其密文进行解密,转换成明文~~

分析

对于 rsa 算法的公钥与私钥的产生,我们可以了解到以下产生原理:

公钥与私钥的产生

消息加密

首先需要将消息 m 以一个双方约定好的格式转化为一个小于 N,且与 N 互质的整数 n。如果消息太长,可以将消息分为几段,这也就是我们所说的块加密,后对于每一部分利用如下公式加密:

消息解密

利用密钥 d 进行解密。

我们可以知道, RSA 公钥主要有两个信息:模数(modulus)和指数(exponent),也就是我们所说的 N 和 e 。只要有了这两个信息,我们便可以生成公钥,然后使用 rsa 库对数据进行加密~

脚本实现如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rsa key = rsa.PublicKey(modulus, exponent)
print key

这时候我们有如下的publickey.pem文件:

-----BEGIN PUBLIC KEY-----
MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMJjauXD2OQ/+5erCQKPGqxsC/bNPXDr
yigb/+l/vjDdAgMBAAE=
-----END PUBLIC KEY-----

现在我们需要做的就是从这段字符串中提出模数和指数。

首先我们得知道 pem 文件是什么?

简单来讲, pem 文件这种格式就是用于 ASCII(Base64) 编码的各种 X.509 v3 证书。

文件开始由一行 -----BEGIN PUBLIC KEY----- 开始,由 -----END PUBLIC KEY----- 结束

pem 类型的数据除去 begin 和 end 之外的内容,要根据 base64 编码解码后,得到的数据需要进行增加或裁剪特殊字符-、 \n 、 \r 、 begin 信息、 end 信息等。

这里有张图片很清楚的解释了这个问题~~

既然我们现在已经知道了 pem 这种文件格式,并且也知道其中的数据内容,我们该如何对这种文件内容进行解密呢?

我们可以做以下尝试 Base64 解码尝试:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import base64 pubkey = "MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMJjauXD2OQ/+5erCQKPGqxsC/bNPXDr
yigb/+l/vjDdAgMBAAE="
b64_str = base64.b64decode(pubkey)
print b64_str
print len(b64_str)

解码以后如下:

很明显,我们解出来一段乱码,我们尝试把这串乱码转换成 16 进制,这里我们用的是 python 自带的 binascii 库进行解码

发现结尾是 \x01\x00\x01 , 10001 ,看多了 rsa 的公钥,就知道这个数,多半是 exponent 了。

再看看解码后的长度为 162 ,我们找到偏移表,发现模数的偏移位置是 159,长度是 3 ,加起来正好162

那么说明这段字符串就是指数和模数加密过后的结果,甚至比一般的 pem 文件中的信息还要简单~

按照这个思路,对照偏移表我们找出指数 e 和模数 N :

# /usr/bin/python
# -*- coding: utf-8 -*- import base64 def str2key(s):
# 对字符串解码
b_str = base64.b64decode(s) if len(b_str) < 162:
return False hex_str = '' # 按位转换成16进制
for x in b_str:
h = hex(ord(x))[2:]
h = h.rjust(2, '0')
hex_str += h # 找到模数和指数的开头结束位置
m_start = 29 * 2
e_start = 159 * 2
m_len = 128 * 2
e_len = 3 * 2 modulus = hex_str[m_start:m_start + m_len]
exponent = hex_str[e_start:e_start + e_len] return modulus,exponent if __name__ == "__main__": pubkey = "MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMJjauXD2OQ/+5erCQKPGqxsC/bNPXDr
yigb/+l/vjDdAgMBAAE="
key = str2key(pubkey)
print key

结果如下:

('C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD', '010001')

这个即为我们求出来模数 N 和指数 e 。

当然我们也可以用一些比较方便的工具, Kali Linux 里面自带了 openssl ,其他版本的 Linux 官方也提供了源码安装:https://github.com/openssl/openssl

而在 Windows 下安装大家可以参考这篇文章:https://bbs.csdn.net/topics/392193545?page=1,当然我还是不建议大家在 Windows下进行操作,安装过程相对麻烦,而且可能安装过程中会出现各种状况~~~

我们使用如下命令对 pubkey.pem 找出指数 e 和模数 N :

openssl rsa -pubin -text -modulus -in warmup -in pubkey.pem

结果如下:

我们可以得到如下参数:

e=65537 (0x10001)

Modulus即为N=C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD

然后我们可以使用 yafu 对 n 进行因数分解,得到 p 、 q

p=275127860351348928173285174381581152299

q=319576316814478949870590164193048041239

解码网站在这里:https://factordb.com/

至此,各个参数已经求得如下,可以编写代码获得私钥,再用私钥解密密文,得到明文信息~

p = 275127860351348928173285174381581152299

q = 319576316814478949870590164193048041239

N = 87924348264132406875276140514499937145050893665602592992418171647042491658461

e = 65537

我们可以开始用 python 写脚本了~

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import gmpy2
import rsa p = 275127860351348928173285174381581152299
q = 319576316814478949870590164193048041239
N = 87924348264132406875276140514499937145050893665602592992418171647042491658461
e = 65537
d = int(gmpy2.invert((e,p - 1) * (q - 1)))
privatekey = rsa.PrivateKey(N,e,d,p,q)
s = open("flag.enc","rb")
print rsa.decrypt(s.read().privatekey).decode()

结果如下:

当然了,我们也可以用之前的公钥对一段信息进行加密操作,具体实现过程如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rsa
import base64 message = 'Angel_Kitty'
key = ('C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD', '010001')
modulus = int(key[0], 16)
exponent = int(key[1], 16)
rsa_pubkey = rsa.PublicKey(modulus, exponent)
crypto = rsa.encrypt(message, rsa_pubkey)
b64str = base64.b64encode(crypto)
print b64str

加密结果如下:

这样子我们就得到一个 rsa 加密, base64编码过的字符串了,我们这个过程主要就是在一串字符串中,对照一个偏移表,提取需要的位置上的数字~~

本文用到的文件我已经上传到博客园,点击下载即可:https://files.cnblogs.com/files/ECJTUACM-873284962/RSA公钥文件解密密文的原理分析实例.rar

作者:Angel_Kitty
链接:https://www.imooc.com/article/80670
来源:慕课网

RSA简单实践的更多相关文章

  1. Thrift简单实践

    0.什么是RPC RPC(Remote Procedure Call - 远程过程调用),是通过网络从远程计算机上请求服务,而不需要了解底层网路技术的细节.简单点说,就是像调用本地服务(方法)一样调用 ...

  2. Java 异步处理简单实践

    Java 异步处理简单实践 http://www.cnblogs.com/fangfan/p/4047932.html 同步与异步 通常同步意味着一个任务的某个处理过程会对多个线程在用串行化处理,而异 ...

  3. Android 设计随便说说之简单实践(合理组合)

    上一篇(Android 设计随便说说之简单实践(模块划分))例举了应用商店设计来说明怎么做模块划分.模块划分主要依赖于第一是业务需求,具体是怎么样的业务.应用商店则包括两个业务,就是向用户展示appl ...

  4. c#中,委托Func的简单实践

    c# 委托Func的简单实践最近才真正的接触委托,所以针对Func类型的委托,做一个实践练习. 首先说一些我对委托的初级理解:"就是把方法当做参数,传进委托方法里". 我平时用到的 ...

  5. kafka原理和实践(二)spring-kafka简单实践

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  6. SQL知识以及SQL语句简单实践

    综述 大家都知道SQL是结构化查询语言,是关系数据库的标准语言,是一个综合的,功能极强的同时又简洁易学的,它集级数据查询(Data Quest),数据操纵(Data Manipulation),数据定 ...

  7. ZooKeeper分布式锁简单实践

    ZooKeeper分布式锁简单实践 在分布式解决方案中,Zookeeper是一个分布式协调工具.当多个JVM客户端,同时在ZooKeeper上创建相同的一个临时节点,因为临时节点路径是保证唯一,只要谁 ...

  8. Spring 学习二-----AOP的原理与简单实践

    一.Spring  AOP的原理 AOP全名Aspect-Oriented Programming,中文直译为面向切面(方面)编程.何为切面,就比如说我们系统中的权限管理,日志,事务等我们都可以将其看 ...

  9. VueRouter爬坑第一篇-简单实践

    VueRouter系列的文章示例编写时,项目是使用vue-cli脚手架搭建. 项目搭建的步骤和项目目录专门写了一篇文章:点击这里进行传送 后续VueRouter系列的文章的示例编写均基于该项目环境. ...

随机推荐

  1. 使用python和numpy实现函数的拟合

    给出一个数组x,然后基于一个二次函数,加上一些噪音数据得到另一组数据y. 将得到的数组x,y,构建一个机器学习模型,采用梯度下降法,通过多次迭代,学习到函数的系数.使用python和numpy进行编程 ...

  2. 【RabbitMQ-7】RabbitMQ—交换机标识符

    死信队列概念 死信队列(Dead Letter Exchange),死信交换器.当业务队列中的消息被拒绝或者过期或者超过队列的最大长度时,消息会被丢弃,但若是配置了死信队列,那么消息可以被重新发布到另 ...

  3. binary hacks读数笔记(readelf基本命令)

    一.首先对readelf常用的参数进行简单说明: readelf命令是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用,下面以ELF格式可执行文件test为例详细介绍: 1. ...

  4. 记最近一次ceph故障修复

    前言 所谓吃一堑长一智,每次面对问题才是最好的学习机会,在面对问题的时候,尽量是能够自己去解决,或者去尝试能够最接近答案,确实无法解决再去寻求他人帮助,这样成长的会更快一些,在学校读书做题的时候,老师 ...

  5. Notepad++安装教程

        1.官网下载 官方网站:https://notepad-plus-plus.org/downloads/ 上面有历史版本,一般就选择最新版下载 2.安装 [3]打开记事本进行设置: 设置--& ...

  6. Python_科学计算库

    说明:若没有训练级联表,则需要相关级联表才能实现功能 文字识别 # -*- coding: utf-8 -*- """ 简介:用样本训练数据,再识别 "&quo ...

  7. Kubernetes K8S之Taints污点与Tolerations容忍详解

    Kubernetes K8S之Taints污点与Tolerations容忍详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master C ...

  8. 回收站都找不到的文件,EasyRecovery帮你找

    "有人相爱,有人看海,有人深夜两点还在找文件."没错,有人正是不才本人. 细数下来,这已经是本人第五六七八次丢文件了,每次丢的原因很奇怪:删错了.保存完找不到了.或者没有原因就那样 ...

  9. MathType如何打出带圆圈的点

    学习了圆的知识后,知道可以用带圆圈的点表示圆,比如"⊙O"表示圆O,即圆心为O的圆.那么要怎么在MathType中打出带圆圈的点? 方法一.直接在工具栏上选择输入 打开MathTy ...

  10. 美食vlog如何剪辑?用什么视频制作软件剪辑比较好?

    是不是发现自己拍摄的美食永远没有美食博主拍出来的好看?那么美食vlog如何剪辑?用什么视频制作软件剪辑比较好呢?下面小编就教大家用视频编辑软件会声会影强大的颜色分级功能就能拯救你的美食vlog. 接下 ...