RSA加密之分解n攻击(一)
- 本篇文章主要讲讲基础的RSA中一些重要数据泄露之后如何对n进行分解(主要讨论的是正常RSA加密,也就是模数是两个素数相乘的RSA加密)
- 本篇文章主要讲解的是如下两个部分:

已知phi分解n
已知phi分解n 原理
- 对于两个素数的RSA加密来说,已知的条件下分解是很容易的,其实就相当于解方程,接下来就简单描述一下:
- 首先已知,还已知
- 此时就可以将带入到中
- 带入后得到的式子为:
- 展开化简就可以得到
- 最终得到一个元二次方程:,解这个方程就行了
已知phi分解n 脚本
- python解方程如下:
1 | import math |
- sagemath解方程如下:
1 | def know_phi_factor(n,phi): |
已知ed分解n
- 参加文章:rsa中已知 n,e,d 来分解n_ed - 1 = k * (p-1)(q-1) 已知e,d 求k,p,q-CSDN博客
- 参考文章:RSA已知e,d和n,分解N - MeanCoder - 博客园
- 参考文章:已知N,e,d分解N的研究 - Mirai_haN - 博客园
已知ed分解n 原理
-
对于两个素数的RSA加密来说,已知分解算是比较简单的一部分,接下来推导一下,首先要明确一点已知的情况,一般都是要使用上密钥等式的,也就是这个等式,这里我们先讨论这个形式。
- 下面这个推导是错误的思路
- 设是一个有效的RSA加密公钥对,对应的私钥对为。
- 我们已知,接下来需要对进行分解,从而完全破解出
RSA加密的私钥对。 - 首先我们考虑密钥等式:
- 接下来我们其稍微变形:
- 接下来我们将使用费马分解的思想,引入一个已知数(在算法的实现中一般采用随机生成)
- 这样就有一个关系:
- 那么我们模将这个式子模一个转换为同余式,并设结果为就有:,此时大部分情况都是满足,只有少部分情况是的情况。错误的具体原因在这一步,这一步由欧拉定理可以得到
x始终为1,所以下面的推导就不行了 - 根据同余的性质:如果,那么就有
- 所以就有:
- 由费马小定理可以得到:
- 这个时候就出现了一个整除关系:
- 当满足这一条件的时候就能使用
gcd(x-1,n)这一方法将分解了。
-
接下来我们仍然进行一个推导操作,首先我们就可以进行这样的操作:
- 这种操作有点类似于
rabin素性检测以及AMM算法的其中一部分(有相当一部分算法都是利用这种模式) - 设是一个有效的RSA加密公钥对,对应的私钥对为。
- 我们已知,接下来需要对进行分解,从而完全破解出
RSA加密的私钥对。 - 首先我们考虑密钥等式:
- 接下来我们其稍微变形:
- 接下来我们将使用费马分解的思想,引入一个已知数(在算法的实现中一般采用随机生成)
- 这样就有一个关系:,我们记,所以就有:
- 同时在模的情况下会有
- 那么对于利用平方差就可以这样:
\begin{align} g^{2^tr}-1&=(g^{2^{t-1}r}-1)(g^{2^{t-1}r}+1) \\&=(g^{2^{t-2}r}-1)(g^{2^{t-2}r}+1)(g^{2^{t-1}}+1) \\&=~...... \\&=(g^{r}-1)(g^{r}+1)(g^{2r}+1)...(g^{2^t-1}+1) \end{align}
- 此时我们计算出,此时有可能就是或中的其中一个。可以使用计算。(目前这个正确性证明还是有点不明白)
- 如果就可以直接出现了;如果,那就重新选取一个随机数。
- 这种操作有点类似于
-
以上就是推导过程,接下来概括一下算法流程:
- 首先随机选取一个底数,计算出
- 计算
- 如果重新选取一个,如果就分解出来了
已知ed分解n 脚本
- Python脚本1如下,这个分解比较简单,就只实现Python脚本了:
1 | import random |
- Python脚本2如下,由的时候直接给的结果:
1 | import random |
例题
- 题目来源:MRCTF2020Easy_RSA
- 题目附件如下:
1 | import sympy |
- 很显然此题是考两个知识点,已知分解,已知分解:
- 对于的生成来说主要考察的是已知分解
- 对于的生成来说主要考察的是已知分解
- 直接套脚本就行:
1 | import random |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!

