RSA加密之分解n攻击(四)
- 本篇博客主要介绍如下分解方法:

对于本次要学习的RSA分解相关的,都利用了关于私钥的一部分信息(这些信息通常假设未知的),来对模数进行分解。例如,攻击者可能已知私钥指数或模数中某个素因子的一部分比特。通过这些攻击可以看出,隐藏私钥比特的重要性。
一般来说,我们关注这样一个情形:私钥指数或模数中的某个素数的最高有效位(MSB)或者最低有效位(LSB)有一部分是已知的。设$0≤\varepsilon≤1$,表示已知比特所占的比例。对于最高有效位泄露的问题有如下定义,而对于最低有效位的情形,主要采用
Boneh、Durfee、Frankel在论文中提出的一种更宽松的定义。- 当已知一个数$x$的$\varepsilon$比例的最高有效位时,我们假设已知的一个近似值为$\hat{x}$使得:$x=\hat{x}+x_0$,其中未知量$x_0$满足:$|x_0|=|x-\hat{x}|<x^{1-\varepsilon}$
- 当已知$x$的$\varepsilon$比例的最低有效位,我们假设已知$\tilde{x}$以及一个满足$r≥|x^{\varepsilon}|$的参数$r$,使得$x=x_0r+\tilde{x}$,其中$|\tilde{x}|<r$,并且未知量$x_0$满足:$|x_0|=|\frac{x-\tilde{x}}{r}|<|\frac{x}{r}|<x^{1-\varepsilon}$。当$r=2^{l}$时,$\tilde{x}$就对应于通常意义下的$l$个最低有效比特。也就是说,在二进制表示中$x$与$\tilde{x}$的最低$l$位是相同的。
对于此类题目,基本上是$p$高位泄露、$p$低位泄露等等,我们都统称为带提示分解这一种分解题型。接下来大致介绍一下这类题型的解决方法以及要用到的相关定理。
Coppersmith在论文中证明:当RSA模数是两个平衡素数时,如果已知其中一个素数的一半MSB,就可以将模数分解。Boneh、Durfee、Frankel发表论文证明:当RSA模数是两个平衡素数时,如果已知其中一个素数的一半LSB同样足以完成分解。接下来给出
定理6.1统一描述一下这个定理:- 设$N=pq$是一个由平衡素数($p\approx q$)构成的RSA模数。如果已知其中一个素数的至少一半最高有效位或最低有效位,那么就可以在关于$log_N$的多项式时间内对$N$进行分解。
关于该定理的证明,我们可以使用
Coppersmith的一元模多项式小根方法,给出该定理的证明。- 设$f(x)$是一个首一的一元一次多项式,$N$是一个未知因子分解的整数,并且存在一个未知因子$b>N^{\beta}$。这样只要满足$|x_0|<cN^{\beta^{2}}$,其中$c$是任意小的常数,那么所以满足$f(x_0)\equiv 0~mod(~b)$的根$x_0$都可以在多项式时间内被恢复出来。
证明MSB的情况:
- 因为生成RSA模数的素数是两个平衡素数,所以就有$\frac{1}{2}N^{\frac{1}{2}}<p,q<2N^{\frac{1}{2}}$(这里放宽了$p$与$q$的大小顺序假设,不考虑$p、q$的大小关系)
- 当已知模数中某个素数的LSB或MSB时,攻击的核心思想是:构造一个一元一次首一多项式,使其具有一个已知界限内的小根,该小根恰好对应于该素数中未知的那部分比特。一旦成功计算出这个小根,模数的因子分解也就被揭示出来。
- 所以我们假设已知素数$p$的至少一半MSB,也就是说我们已知一个近似值$\hat{p}$,使得$p=\hat{p}+p0$,其中未知量$p_0$满足$|p_0|<|p-\hat{p}|<p^{\frac{1}{2}}<\sqrt{2}N^{\frac{1}{4}}$,注意到$p_0$是下面这个首一一元多项式在模意义下的小根$f{msb}(x)=x+\hat{p}$
- 这是因为$f{msb}(p_0)=p_0+\hat{p}=p\equiv0 ~mod(~p)$,事实上由于$f{msb}(x)$是首一且一次的,多项式在模$p$意义下的所有根都可以写成$p_0+\alpha p$,其中$\alpha$是某个整数。因此,在所有的这些根中,只有$p_0$满足界限$|x|<\sqrt{2}N^{\frac{1}{4}}$。令$\beta=\frac{1}{2}-log_N(2),c=2\sqrt{2}$,注意到素数$p$满足$p>\frac{1}{2}N^{\frac{1}{2}}=N^{\frac{1}{2}-log_N(2)}=N^{\beta}$
- 并且我们希望恢复的根满足:
- 由Coppersmith方法中的相关定理,并结合上面所定义的常数$c$和$\beta$,可以推出我们能够计算该根$p_0$。因此由于$p=p_0+\hat{p}$我们就可以在关于$logN$的多项式时间内轻松完成对模数N的因子分解。
证明LSB的情况:
- 接下来,假设我们已知素数$q$的至少一半LSB,也就是说,我们假设已知$\tilde{q}$和一个参数$r$,使得$q=q_0r+\tilde{q}$,其中$q=q_0r+\tilde{q}$以及$q^{\frac{1}{2}}<r<q$,并且未知量$q_0$满足$|q_0|=|\frac{q-\tilde{q}}{r}|≤|\frac{q}{r}|<q^{\frac{1}{2}}<2N^{\frac{1}{4}}$。
- 当$r$是2的幂是,$\tilde{q}$就对应于$q$的真实最低有效位。令$R=r^{-1}~mod(~N)$,于是存在某个整数$k$值得:$rR=1+kN$。
- 那么就可以注意到首一一元多项式:$f_{lsb}(x)=x+\tilde{q}R$有一个$q_0$是在模素数$q$下的根。
- 很显然:$rf_{lsb}(q_0)=q_0r+\tilde{q}Rr=q_0r+\tilde{q}+\tilde{q}kN=q+\tilde{q}kpq\equiv 0~mod(~q)$
- 由于在模数$q$意义下不存在零因子,并且条件$q^{\frac{1}{2}}<r<q$,包含了$r\not\equiv 0~mod(~q)$,因此可以得到$flsb(q_0)\equiv 0~mod(~q)$,与前一个多项式的情形完全类似,由于$f{lsb}(x)$是首一且线性的,所以在多项式模$q$意义1下的所有根中只有$q_0$能满足$|x|<\sqrt{2}N^{\frac{1}{4}}$
- 由于该根的界限以及$N$的因子(即素数q)的大小界限与前一种情况完全相同,因此可以直接应用Coppersmith方法相关的定理,并使用之前完全相同的常数$c$和$\beta$,从而在关于$log(N)$的多项式时间内计算出根$q_0$。
- 又因为$q=q_0r+\tilde{q}$,一旦求得$q_0$就立即得到了模数的因子分解。由于在整个推导过程中并未对素数$p、q$的大小顺序作任何假设,上述论证同样适用于:已知任意一个素数的$\frac{1}{2}$最高有效位和$\frac{1}{2}$最低有效位的情形,因此定理得证。
尽管上述结果要求:已知某个素数至少一半的最高有效位或最低有效位,但是这个界限实际上可以适当放宽,从而允许已知的比特比例略小一些。这一点可以直接从定理中的$|x|<cN^{\frac{1}{4}}$看出。常数$c$的存在,使得我们用可以略少的已知比特数,以增加运行时间为代价来完成攻击。
如果已知$\frac{1}{2}-\varepsilon$比例的比特,并且$\varepsilon\in O(log(logN))$那么整个攻击的运行时间仍然是关于$logN$的多项式时间。
另一种做法就是:对缺失的$\varepsilon$个比特进行穷举搜索,并对每一个关于那$\frac{1}{2}$已知比特的候选值尝试对模数进行分解,直到成功为止。
无论采取上述哪种方法,都可以得出结论:只要已知某个素数的大约一半的最高有效位或最低有效位,就可以高效地对RSA模数进行分解
接下来就直接看题了。
题型1 p高位泄露
p高位泄露 例题1
- 题目附件如下:
1 | from Crypto.Util.number import * |
- 根据上面说明的定理,我们只要已知超过一半的素数为就能分解,此题我们的素数位数是
512位,而泄露p的512-128=384位,远远大于256位,那就可以直接用Coppersmith攻击求解。 - 构造首一一元模多项式:$f_{MSB}(x)=h+x~mod(~n)$,其中根的上界为$|x_0|<2^{128}$,$\beta=\sqrt{\frac{128}{1024}}=\sqrt{\frac{1}{8}}\approx0.3$应该可以求解出小根。
- exp如下:
1 | from Crypto.Util.number import * |
p高位泄露 例题2
- 题目来源:LitCTF 2023 Where is P? | NSSCTF
- 题目附件如下:
1 | from Crypto.Util.number import * |
题型2 p低位泄露
p低位泄露 例题1
刷题
刷题1
题目附件如下:
1 | from Crypto.Util.number import getPrime, bytes_to_long |
1 | from Crypto.Util.number import getStrongPrime |

