RSA加密之小私钥攻击
- RSA加密对私钥的攻击比对公钥的攻击难多了,这篇博客主要讲解的就是RSA小私钥攻击,主要讲解如下内容,可能会分成两三篇博客进行记录,也可能只用一篇博客进行记录。

- 使用小私钥指数的RSA具有一定的风险。尽管在某些场景下,尽可能降低解密成本可能是比较有吸引力的,但如果私钥指数选择得过小,就会存在非常现实且有效的攻击,使得整个密码系统完全不安全。
- 在任何密码系统中,如果私钥(或秘密密钥)是从一个较小的集合中选取的,那么总是可以通过简单的穷举法搜索出来密钥从而破坏该系统。对RSA而言所有满足的私钥指数都可以直接通过猜测得到,其中取决于当前技术的发展水平。例如,在目前的计算能力下,恢复所有满足的私钥指数是可行的,而对所有满足的私钥指数则是不可行的。
- 然而,接下来介绍的攻击方法,都能够恢复原大于简单穷举搜索所能覆盖范围的私钥指数。事实上,所有这些攻击都可以有效地攻破私钥指数大小达到(其中)的RSA实例。对于一个
1024比特的模数,即便是这些攻击中最弱的一种,也已经可以破解私钥指数满足的RSA实例。 - 与前面几个攻击不太相同的是,那些攻击通常是在给定公钥以及一个或多个密文的情况下恢复一个或多个明文,然而针对小私钥指数RSA的所有攻击,都是利用密钥等式,仅凭借公钥就通过分解模数来彻底攻破RSA实例。
- 在以下攻击中,除非另有说明,我们将假设公钥指数和私钥指数都是在模意义下定义的,并且二者都小于。
- 由如下密钥等式:
- 我们可以推出如下一个不等式关系:
- 特别地,由于本章关注的是小私钥指数RSA,因此有。当指数是模定义时,同样的论证也依然成立。
维纳连分数攻击
维纳攻击 推导
-
第一个具有重大意义的RSA小私钥指数攻击就是维纳连分数攻击。仅仅只有公钥,这个攻击可以使用的连分数展开某个渐进分数所活动信息来分解模数。
-
这里还要介绍一个定理,该定理是勒让德连分数定理:
- 设,若有既约分数
- 那么必然是的某一个连分数收敛子。
-
下面的定理最一般的形式重新描述了维纳连分数攻击,记该定理为
定理5.1,定理内容如下:- 设是一个RSA的模数,设是一个有效的公钥指数,并且是定义在模下与之对应的私钥指数。
- 设是一个满足密钥等式的整数,,,以及
- 如果私钥指数满足,那么能在关于和的多项式时间内被分解。
- 证明如下:
- 从新回顾一下
RSA模数,,其中 - 因此密钥等式可以重新写为,其中,也最终其实就是这样的形式
- 接下来等式两边都同乘一个,就有。
- 接下来再移项一下,就会出现,记为式子①
- 假设私钥指数满足不等式
- 使用假设私钥指数满足的不等式带入到式子①就会有,记为式子②,这其实就满足了勒让德连分数定理的条件。
- 有是的一个收敛子,设是连分数的第个收敛子,这下我们就知道。
- 这样就有。
- 进而得到
- 因此如果我们知道正确的连分数,并且可以猜到,那不就可以得到了,当知道了,并且,那就可以直接列方程解出了。所以维纳攻击实际上是一种完全攻击手段,可以间接分解出RSA的两个大素数。
- 从新回顾一下
- 为了找到正确的连分数从而计算出,我们需要做如下操作:
- 从开始,我们通过迭代的连分数收敛子来计算出的候选值,并计算
- 对于每一个的候选值,我们尝试分解模数。如果没有任何候选值得到,我们就将的值增加
1,重新进行上面过程。 - 通过这种方式,我们可以保证最终计算出候选的,从而实现对模数的因式分解。
- 每一次测试(尝试使用和的候选值来进行因式分解)是关于的多项式级别。由于的连分数收敛子数量也是关于的多项式级别,并且对于每个收敛子我们最多测试个候选值,最终结果得以实现。
- 在证明中,获取正确的候选值的方法不是最优的。例如,当太大,我们可以根据式子②忽略它。事实上,之后会讲到候选的连分数收敛子可以缩小到一个非常小的集合。
- 此外,当RSA的质数是随机选择时,预期的会非常小,因此,预期,实际上只需要对候选连分数的收敛子进行一次迭代。在几乎所有的
Wiener攻击的推导中,都假设在某个时刻,或者。 - 上面定理
5.1中的充分条件并不是通常与Wiener攻击相关的条件,更常见的条件是:
- 对于某个小常数,它是通过假设公钥指数大致与模数相同,并且生成的素数满足平衡素数,并且很小得出的。在一个典型的
RSA实例中,当质数是随机生成并且私钥指数较小的时候,这些假设是有效的,这个界限大致上就是是Wiener攻击的参考点(有时会被称为Wiener界限)
-
接下来举一个例子,在说明典型的小私钥指数RSA实例上进行攻击的过程:
- 有公钥对,那么的连分数为
- 先计算出一些收敛子
- 测试上面的每一个目标收敛子,并且令,前三个收敛子不能分解
- 到第四个收敛子,就有
- 通过已知分解就可以得到和,这两个都是素数,因此,并且我们分解了模数。
- 使用这个分解我们计算出,,因此私钥对为。
- 此时就满足定理5.1的攻击条件,满足
-
在一些非典型的RSA实例中,维纳攻击的效果可能比更弱也可能更强,这个时候我们要牢牢抓住定理5.1的这个式子,有以下三种方式可以减小私钥指数的界限从而削弱攻击:
- 使用不平衡的素数,使得变得更大。
- 使用具有大的质数,从而假定也变得更大。
- 使用的公钥指数,使得(并假定)变得更大。一个比更大的公钥指数可以通过简单地将的倍数加到现有的正常公钥指数上来实现。事实上,当时,维纳攻击完全无效。
- 较大的公钥指数削弱攻击,而较小的公钥指数则强化攻击。考虑使用平衡指数、小、小私钥指数和公钥指数的RSA,其中。由于,我们有。将这些带入
Wiener攻击的通用条件,并忽略小常数。就可以得到,或者更简单地,其中是一个小常数,表示任何被忽略的小因子。 - 在典型情况下,当时,我们有以及,这是预期的结果,对于较大的公钥指数,界限上的会减小,直到在时消失,此时攻击无法保证任何结果,而对于较小的公钥指数,界限会增加,直到在时达到
- 较大的公钥指数削弱攻击,而较小的公钥指数则强化攻击。考虑使用平衡指数、小、小私钥指数和公钥指数的RSA,其中。由于,我们有。将这些带入
维纳攻击 例题1
- 题目来源:RSA入门 | DexterJie’Blog
- 题目附件如下:
1 | import libnum |
维纳攻击 例题2
- 题目来源:
XYCTF2024 - 题目附件如下:
1 | import gmpy2 |
维纳攻击 板子
- 收集一下板子,通过解读板子所写的代码,对维纳攻击会有更深的体会。
维纳攻击 Python实现
1 | import gmpy2 |
维纳攻击 sagemath实现
1 | 1 |
拓展维纳攻击
- 拓展维纳攻击,需要比较扎实的连分数基础和格攻击的基础。
Boneh and Durfee攻击
- 前面介绍了维纳攻击和拓展维纳攻击,维纳攻击可以看作是尝试在模下简化的密钥方程。而
Boneh和Durfee证明了一种更强大的攻击方法,即通过尝试在模公钥指数下解决密钥方程。 - 具体而言,就是解如下同余方程:
- 通过解这个方程中的未知数和,可以对私钥指数的RSA进行启发式攻击。这是目前已知最强大的正对小私钥指数的RSA攻击之一,适用于平衡素数的情况,并且不需要是部分密钥泄露攻击或不需要素数的特殊性质。
- 在这部分攻击中展示的所有基于格的攻击,我们假设素数是平衡的,且公钥指数和私钥指数都是模下定义的。接下来要了解
Boneh和Durfee对任意大小公钥指数的攻击完整的推导,并且简要介绍Blömer和May的变种。
Boneh and Durfee 攻击
Boneh and Durfee 攻击 推导
-
先重新陈述
Boneh和Durfee针对小私钥指数RSA基于格的攻击,适用于任意公共指数。由于该结果依赖尚未证明的假设,我们只能将其表述为一种攻击方法,描述如下:- 对于任意的,都存在一个,使得当时如下结论成立
- 设是一个
n位的RSA模数,并且是平衡素数;设是有效的公钥对,设是其对应的定义在模下的私钥指数 - 设,在给定公钥的情况下,如果私钥满足,那么只要满足两个假设,就可以在关于的多项式时间内对模数进行分解。
- 假设1:在或上具有已知小解的多项式,只存在唯一的一个小解。
- 假设2:由
LLL规约后的基向量所得到的这些多项式代数意义上彼此独立。
-
对于
Boneh和Durfee攻击的说明:- 考虑密钥等式,将这个密钥等式模就可以得到:,其中和是未知量。
- 这就启发我们寻找这个二元多项式的小根:,其中是模下的根。
- 设和,注意期望得到的根满足:
- 其中我们使用的并且因为加密使用的素数是平衡素数。
- 因此就可以将这两个变量的界限分别定为:和,使用多项式和界限和就可以构造一个格,使得该格中的每个元素都对应于一个多项式,并且该多项式在模的某个幂意义下都以为根。
- 对某个固定的整数,定义如下多项式:
- 其中被称为
x-移位,被称为y-移位。因为他们分别通过乘或的幂,对基础多项式进行位移。
- 在这种构造下可以注意到:对于任意以及,如果是模在模意义下的一个根,那么它同样也是和在模意义下的一个根。也就是如下式子,下面这个式子是后续造格利用Coppersmith方法的关键基础:
- 接下来,利用多项式和的系数向量(其中和是前面定义的和的界),我们可以造出一个格的基矩阵。该格中的每个向量,都是多项式和的系数向量,而这个多项式正是由和整数线性组合得到的。
- 于是由式子①就可以推出这些多项式中的每一个都满足如下性质:
- 因此每一个在格中的向量都是相应的一个在模下有根的多项式,因此
Boneh和Durfee所使用的基矩阵具体构造我们将其记为是由如下多项式的系数向量所组成的,其中下面的整数,并且具有如下特征:
- 对于造出来的基矩阵从行的角度看:
- 有总数个基向量并且它们都是线性无关的。
- 因此这个格的维数为:,并且行和列被重新排列使得这个基矩阵是下三角矩阵。
- 对于行来说,自顶向下,首先是放置
x-位移多项式,按照的值递增排列,其中;对于固定的,这写多项式按照的递增顺序排列 - 接下来放置的是
y-位移多项式,按照的递增顺序排列;对于每个固定的,这些多项式再按照 - 在这种向量的递增顺序排列下,每一个新的基向量都会恰好引入一个此前所以基向量都没有出现过的单项式。
- 从列的角度看:
- 对列从左到右进行排序,使得第列对应的正是第行所引入的那个单项式。具体来说就是前列对应的单项式,它们按照递增排列,对于每个固定的再按照排列。这些对应的就是
x-移位多项式中的单项式 - 剩下的列对应的单项式,它们按照递增排列,对于每个固定的,再按照递增排列。这些列对应的是只出现在
y-移位多项式中的单项式。
- 对列从左到右进行排序,使得第列对应的正是第行所引入的那个单项式。具体来说就是前列对应的单项式,它们按照递增排列,对于每个固定的再按照排列。这些对应的就是
- 在下图中,当时,给出了这种排序下的基矩阵,在这种基矩阵的排序方式下,其对角线元素为
- 对于
x-位移多项式对角线的元素是: - 对于
y-位移多项式对角线的元素是: - 由于,而的行列式在这里仅仅等于其对角线元素的乘积,因此格的体积很容易计算出来。
- 计算结果为:
- 其中第一个双重乘积对应于来自
x-位移多项式的贡献(这样的多项式有个),第二个双重乘积对应于y-位移多项式的贡献(这样的多项式有个)。
- 对于

- 对格使用LLL算法计算出规约后的基向量,由Coppersmith方法以及对应的多项式结论就可以得到,规约后的基向量最小的两个向量对应于线性无关的多项式,它们满足:
- 如果这两个多项式中较大的哪个也满足,那么根据
Howgrave-Graham的结果,并将其应用到二元多项式的情形,我们知道是多项式和在整数环上的一个公共根。满足这个公共根的一个充分条件就是: - 或者更简单地写成:,该式记为③式,其中:,是一个常数(当m和t固定的时候),这是该攻击能够成功的条件
-
只要格的体积满足上述不等式,多项式和就都以作为其整数意义下的一个根。如果这两个多项式在代数上相互独立,那么我们就可以对和关于变量x计算它们的结式,从而得到一个多项式:该多项式在整数上以作为根。
-
接着,可以使用标准的一元整数多项式求根技术来求出,当已知之后,我们就可以计算:,并且很容易地对模数进行因数分解。
-
需要注意的是,上述结论对于所有满足以及的、使得的根都成立。我们假设只存在唯一的解(上面描述过的假设)
-
尽管这个使能条件在理论上是完全正确的,但是它并没有针对和等输入参数,提供关于该攻击成功性的太多直观认识。为了推导出一个更有用的使用条件,尤其是攻击结论所给出的条件,我们需要做出一些假设并进行简化。
- 首先我们忽略③式中,因为一但和被选定,这个因子就是一个固定常数,通常考虑足够大的,也就是会比较大,这个固定常数就可以被认为是很小,可以忽略不计
- 接下来将,代入到使能条件中,并设:其中为某个实数,与处理的方式相同,我们忽略和中的小常数因子。
- 得出忽略后有不等式:,其中我们只保留了来自项的贡献。对于足够大的(这可能需要考虑更大的,以保证仍然可以忽略),我们可以使所以级别的贡献变得任意小。忽略这些低阶项,我们只关注项的系数,关于指数的条件就可以被简化:
- 注意对于任意的和,当时,该不等式的左端取得最小值。将这一取值代回不等式并重新整理后,可以得到
- 解出这个不等式就会得到新的使用条件:,其中加入了一个用来补偿前面被忽略的常数因子以及被舍弃的低阶项。通过取足够大的和,这个修正项可以被做的任意接近于零
- 因此对于足够大的,如果私钥指数,满足使用条件那么就可以找到两个以为根的多项式。如果这两个多项式在代数上相互独立,那么就可以计算出,并利用它对模数进行分解,由于所以计算都可以在关于的多项式时间内完成,因此结论成立。
- 在一个典型的小私钥指数RSA实例中,公钥指数的大小通常与模数的大小大致相同,使用近似的上述攻击中的条件就可以转换为,因此,对于足够大的模数,如果所使用的私钥指数满足上述界限,RSA将被认为是不安全的。
Boneh and Durfee 攻击 例题1
Boneh and Durfee 攻击 例题2
Boneh and Durfee 攻击 板子
- sagemath板子如下:
1 | import time |
Boneh and Durfee 子格攻击
Blömer and May攻击
共模攻击
共模攻击 推导
共模攻击 例题1
共私钥攻击
- 共私钥攻击这里我们只介绍正常的RSA加密的共私钥攻击,对于多模数和多幂的RSA情况之后再学习。
共私钥攻击 推导
共私钥攻击 例题1
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!

