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

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

