RSA加密之dp与dq泄露
- 继续介绍RSA加密中关于私钥
d的攻击,在本篇博客中,只会说明dp泄露与dq泄露的各种题型,而不会详细介绍dp、dq部分位泄露的题型,部分泄露的题型我将其分类为部分私钥泄露攻击这一类别中。 - 下面一张图片就是本篇博客要介绍的攻击类型:

首先来介绍一下
dp和dq指的是什么,首先d通常指的就是私钥d,而p、q通常指的就是模数n的两个素数p、q。dp指的就是$d_p\equiv d~mod(~p-1)$dq指的就是$d_q\equiv d~mod(~q-1)$
对于
dp或dq泄露的核心推导公式,也是与之前的小私钥攻击的核心公式一样,都使用的是密钥等式这一核心式子。
- 接下来就直接进入正题,这类题型还是比较简单的,大部分都只用到数论,没有什么高深的数学知识。
dp泄露
方法一
这里的
dp泄露并不是单指dp泄露,而是dp或dq其中之一泄露。- 当加密指数比较小的时候,在小私钥攻击的时候就有讲过一个式子。
- 此时$k$就比较小,这样就可以在有限的时间遍历求出$k$。从而泄露出密钥等式的一些信息。
接下来我们回到密钥等式来看看$dp$泄露的推导过程:
- 首先由于$dp$泄露,所以我们知道了这个同余关系$d_p\equiv d~mod(~p-1)$
- 接下来我们先考虑$dp$泄露的这个同余式,并且密钥等式是关于$\phi(N)$的
- 对于$dp$泄露我们有:$d_p\equiv d~mod(~p-1)$
- 两边同时乘个$e$就有:$d_p*e\equiv ed~mod(~p-1)$记为①式
- 接下来我们就考虑密钥等式:$ed\equiv 1~mod(~\phi(N))$
- 根据同余的性质就可以变成这样:$ed\equiv 1~mod(~p-1)$
- 这样①式就可以将$ed$转换为$1$:$d_p*e\equiv 1~mod(~p-1)$
- 将同余式转换成等式:$d_p*e= 1 + k(p-1)$
- 此时就有$0<k=\frac{ed_p-1}{p-1}<\frac{ed_p}{p-1}<min{e,d_p}$
- 当$e$是小指数加密的情况就可以直接遍历求解了。
- 遍历$k\in (0,e)$,计算$p=\frac{d_p*e-1}{k}-1$
- 判断$p$是否能整除$n$,如果能整除$n$就可以将$n$分解出来了。
上面的推导过程就是方法一的$d_p$泄露的处理方法。做几道例题就行了。
方法二
- 参考博客:RSA中dp泄露的广义解法 | Tover’s Blog
- 对于方法一中的遍历的方法还是比较特殊情况的,但是当$d_p$和$e$都很大的时候就会导致方法一失效。
- 这样我们就要来介绍一个方法二,方法二需要用上Coppersmith攻击。但是这个方法本质上还是求$k$
- 对于方法一中的$d_p$泄露推导,这里就不多介绍了:
- 方法一的$d_p$泄露的推导,我们就需要使用这样的一个式子:$d_p*e= 1 + k(p-1)$
- 我们对这个式子变形一下就会得到:$ed_p-1+k=kp$
- 我们再对这个变形的式子模上$p$:$ed_p-1+k\equiv 0~mod(~p)$
- 由于$ed_p-1$的值我们是知道的,$k$的值我们不知道,不妨可以设$x=k,b=ed_p-1$
- 那么我们的同余式就可以列出方程:$x+b\equiv 0~mod(~p)$
- 这个时候我们就可以转到模$N$下求小根(构造思路与$p$部分位泄露一样):$x+b\equiv 0~mod(~N)$
- 当这个式子的未知数(小根)$x$满足Coppersmith攻击的界限的时候,就可以求解成功。
- 对于该情况的Coppersmith攻击的界限,就直接照抄
Tover的图片了,界限$e<n^{\frac{1}{4}-\epsilon}$,其中$\epsilon$是误差。

- 对于$k$的界限,我们可以由如下这个式子确定:
方法三
- 参考博客:RSA中dp泄露的广义解法 | Tover’s Blog
- 方法一的条件比较特殊,方法二需要用上Coppersmith,需要
sage,并且当界限不满足的时候也没办法求出,而方法三是针对一般情况,一般的$d_p$泄露最好都使用这种方法来做会更好一点。 - 在这个博客中发现只要$d_p$泄露出来,用
gcd()就可以直接分解$n$了,接下来我们推到一下:- 这个方法其实是运用费马定理分解(一开始的时候没想到,看了风二西的视频后才想起来的,这个分解方法在
KPCTF2024的密码题有一题) - 首先我们要用上这个式子:$ed_p\equiv 1~mod(~p-1)$与$ed_p=1+k(p-1)$
- 这个是我们要引入一个数$a$,这个$a$其实需要满足$(a,p)=1$,也就是满足使用费马定理的条件。
- 接下来就有这个式子:$a^{ed_p}\equiv a^{1+k(p-1)}~mod(~p)$
- 通过费马小定理就可以得到:$a^{1+k(p-1)}\equiv a*a^{(p-1)^k}~mod(~p)\equiv a~mod(~p)$
- 所以我们就可以得到:$a^{ed_p}\equiv a~mod(~p)$,这样就得到:$a^{ed_p}=a+kp$这个记为①式,但是此时我们$p$是未知的。
- 这个时候就要用上$n$,我们假设:$a^{ed_p}\equiv x~mod(~n)$,其中这个$x$是我们是可以算出来的。
- 根据同余的性质,其实就有:$a^{ed_p}\equiv x~mod(~p)$,一般来说$x>p$,这样也可以得到:$a^{ed_p}=x+k’p$这个记为②式。
- 此时我们用
①式-②式,就可以得到这样的式子:$0=a-x+(k-k’)p$ - 所以我们就得到了这个整除关系:$x-a=(k-k’)p\Rightarrow p|(x-a)$
- 这样我们就可以直接用$gcd(x-a,n)=p$
- 这个方法其实是运用费马定理分解(一开始的时候没想到,看了风二西的视频后才想起来的,这个分解方法在
- 这个算是$d_p$泄露的通解了,本质上是费马分解。
题型一 方法一
题型1 题目1
- 题目来源:LitCTF 2023P_Leak | NSSCTF
- 题目附件如下:
1 | from Crypto.Util.number import * |
- 这个就是一个常规的$d_p$泄露的题型:
- 其中有公钥对$(e,n)$,并且$n=pq$
- 并且还泄露了$d_p\equiv d~mod(~p-1)$
- 那我们就可以根据$d_p*e=1+k(p-1)$这个式子爆破出这个$k$
- 最终达到分解$n$的目的
- exp如下:
1 | import gmpy2 |
题型二 方法二
题型2 题目1
题目来源:
Sloth的选拔赛题目附件如下:
1 |
|
- 这题没啥好说的了,就直接Coppersmith攻击即可,只需要理由下面这个式子确定未知数$k$的界限就行:
- 直接贴上exp:
1 | import gmpy2 |
题型三 方法三
题型3 题目1
题目来源:
Sloth的选拔赛(同题型2题目1的题目)题目附件如下:
1 | from secret import flag |
- 常规的$d_p$泄露,除了使用爆破求解$k$,从而分解$n$,接下来便使用$gcd$的方式分解$n$
- 首先选取$m=111$,并计算$c_1\equiv m^{e}~mod(~n)$
- 其次计算$m’=c^{d_p}~mod(~n)$
- 接下来分解$p=gcd(m’-m,n)$
- exp如下:
1 | import gmpy2 |
题型3 题目2
- 题目来源:LitCTF 2023P_Leak | NSSCTF
- 题目附件如下:
1 | from Crypto.Util.number import * |
- 常规的$d_p$泄露,除了使用爆破求解$k$,从而分解$n$,接下来便使用$gcd$的方式分解$n$
- 首先选取$m=111$,并计算$c_1\equiv m^{e}~mod(~n)$
- 其次计算$m’=c^{d_p}~mod(~n)$
- 接下来分解$p=gcd(m’-m,n)$
- exp如下:
1 | import gmpy2 |
dp和dq泄露
推导
参考博客:RSA侧信道攻击-CSDN博客
当$d_p$和$d_q$都已经泄露出来后,其实没有必要像上面$d_p$泄露那样做,直接进行解密然后用$CRT$求解正确的
flag就行了。对于$d_p$与$d_q$都泄露的理由$CRT$求解,这其实是RSA变种之一CRT-RSA核心解密原理。- 设$(e,N)$是有效的RSA加密实例,其对应的私钥为$(d,p,q)$,已知$d_p$、$d_q$以及$p、q$和对应的密文$c$,目标是求出$m$。
- 首先我们考虑密钥等式:
- 已知$d_p,d_q$就可以将密钥等式转换为如下形式:
- 所以就有如下的式子,这个式子其实就是
CRT等式:
- 由$d_p$和$d_q$定义,我们可以得到两个同余方程,也就式子$①、②$,回顾一下中国剩余定理如果$p-1$与$q-1$互素的话,那可以很容易恢复$d$,但是非常遗憾$p-1$和$q-1$至少都有一个公因数$2$,所以
CRT的方法恢复$d$就失效了。 - 此时我们就需要使用$p、q$来进行求解,我们考虑如下式子:
- 那么由费马小定理就可以得到如下同余式子:
- 由于$p,q$是互素的那么我们就可以直接使用$m_p$和$m_q$通过
CRT恢复出明文$m$,这个就是不直接恢复私钥$d$,而是通过恢复$m_p$和$m_q$利用CRT恢复明文$m$
上面是使用
CRT恢复明文m,但是这个效率还是稍微低了点,为了更高的解密效率,还可以优化一下这个计算过程,优化如下:- 首先我们考虑这个式子:
- 将这个同余式子转换为等式:
- 将这两个式子相减:
- 将相减的式子同时模上$q$:
- 那么我们就可以求得$k_1$:
- 那么就可以得到:
- 注意:此时的$m_1$和$m_2$由于私钥$d$是没办法求出的,但是我们可以使用如下式子代替:
通过对比,我们可以得到,使用加速后的方法求解明文可以少进行一次逆元计算,这样就可以提高计算效率。
例题1
- 题目附件如下:
1 | p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 |
- 根据上面的公式,我们可以使用
CRT求解m,exp如下:
1 | from Crypto.Util.number import * |
- 或者是根据加速运算的计算方法求得
m,exp如下:
1 | from Crypto.Util.number import * |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!

