AI摘要

本文整理RSA dp/dq泄露攻击,涵盖仅dp泄露分解n、dp部分泄露结合已知p恢复明文、dp与dq联合泄露重构私钥d三种场景,包含推导原理、脚本与防御建议。

RSA dp/dq 泄露攻击

本文整理自 CTF 密码学题目,涵盖 dp 泄露、dp 部分泄露、dp+dq 联合恢复三种典型攻击场景,附完整脚本与推导。

1. 背景:CRT-RSA 与 dp/dq

在标准 CRT-RSA 中,私钥操作通过中国剩余定理加速:

$$ \begin{aligned} dp &\equiv d \pmod{p-1} \\ dq &\equiv d \pmod{q-1} \end{aligned} $$

解密时分别计算 $m_p = c^{dp} \bmod p$ 与 $m_q = c^{dq} \bmod q$,再 CRT 合并得出 $m$。

当 $dp$ 或 $dq$ 泄露时,无需 $d$ 即可恢复明文,或直接分解 $n$。以下是三种实战脚本。


2. 场景一:dp 泄露 → 分解 n(nec dp)

脚本来源

nec dp.py

已知条件

参数含义
$n$模数
$e$公钥指数
$dp$CRT 参数$d \bmod (p-1)$
$c$密文

核心原理

由 $dp \equiv d \pmod{p-1}$,得:

$$ dp \cdot e \equiv 1 \pmod{p-1} $$

即存在整数 $k$ 使得:

$$ dp \cdot e = 1 + k(p-1) $$

整理:

$$ p = \frac{dp \cdot e - 1}{k} + 1 $$

因为 $dp < p-1$,所以 $k < e$。从 $1$ 到 $e-1$ 穷举 $k$,满足 $n \bmod p = 0$ 即得 $p$。

攻击流程

  1. 枚举 $k \in [1, e)$
  2. 检查 $(e \cdot dp - 1) \bmod k == 0$
  3. 计算 $p = (e \cdot dp - 1)//k + 1$
  4. 若 $n \bmod p == 0$,得到分解
  5. 计算 $q = n // p$,$\varphi(n) = (p-1)(q-1)$
  6. 求 $d = e^{-1} \bmod \varphi(n)$,解密 $m = c^d \bmod n$

完整脚本

此处内容需要评论回复后(审核通过)方可阅读。

复杂度分析

枚举 $k \in [1, 65537)$,每次一次取模和除法,毫秒级完成。$e$ 越小攻击越快,这也是为何生产环境常用 $e=65537$ ——攻击仍线性但常数较大。


3. 场景二:dp 部分信息 + 已知 p → 逐位恢复明文(pcbe dp)

脚本来源

pcbe dp.py

已知条件

参数含义
$p$已分解出的素因子
$dp$部分泄露的 d mod (p-1)
$c$密文
$b$与指数相关的边界参数
$e$公钥指数

核心原理

该场景比较特殊:已知 $p$ 但 $dp$ 信息不全,需要利用 Hensel 提升逐位恢复 $m_p = c^{dp} \bmod p$。

算法思路:

  1. 初始猜测 $m_{p}^{(0)} = c^{dp} \bmod p$
  2. 利用 $e$ 次幂验证:如果 $m_{p}^{(i)}$ 是正确部分解,那么 $c \equiv (m_{p}^{(i)})^e \pmod{p^{i+1}}$
  3. 设 $x = c - (m_{p}^{(i)})^e \pmod{p^{i+1}}$
  4. 修正项 $y = x \cdot m_{p}^{(i-1)} \cdot (e^{-1} \bmod p) \pmod{p^{i+1}}$
  5. 更新 $m_{p}^{(i+1)} = m_{p}^{(i)} + y$
  6. 迭代至收敛

完整脚本

此处内容需要评论回复后(审核通过)方可阅读。

适用场景

  • $dp$ 被截断(低位缺失若干比特)
  • $p$ 已通过侧信道或其它方式泄露
  • 需要 Hensel 提升思想恢复模 $p^t$ 下的解

4. 场景三:dp 与 dq 双泄露 → 重构私钥 d(pqc dp dq)

脚本来源

pqc dp dq.py

已知条件

参数含义
$p, q$两个素因子
$dp$$d \bmod (p-1)$
$dq$$d \bmod (q-1)$
$c$密文

核心原理

当 $p, q, dp, dq$ 全泄露时,可直接重构 $d$ 而无需分解 $n$。

设 $g = \gcd(p-1, q-1)$,由中国剩余定理构造:

$$ d \equiv \left[ \frac{dp - dq}{g} \cdot \left(\frac{q-1}{g}\right)^{-1} \bmod \frac{p-1}{g} \right] \cdot (q-1) + dq $$

验证:该 $d$ 满足 $d \equiv dp \pmod{p-1}$ 与 $d \equiv dq \pmod{q-1}$。

完整脚本

此处内容需要评论回复后(审核通过)方可阅读。

公式推导

由同余方程组:

$$ \begin{cases} d \equiv dp \pmod{p-1} \\ d \equiv dq \pmod{q-1} \end{cases} $$

设 $g = \gcd(p-1, q-1)$。将 $d$ 表示为 $d = dq + k(q-1)$,代入第一式:

$$ dq + k(q-1) \equiv dp \pmod{p-1} \\ k(q-1) \equiv dp - dq \pmod{p-1} $$

两侧除以 $g$:

$$ k \cdot \frac{q-1}{g} \equiv \frac{dp - dq}{g} \pmod{\frac{p-1}{g}} $$

因此:

$$ k \equiv \frac{dp - dq}{g} \cdot \left(\frac{q-1}{g}\right)^{-1} \pmod{\frac{p-1}{g}} $$

代回 $d = dq + k(q-1)$ 即得最终公式。

备注

  • 若 $dp > dq$,差值为正,自然执行整除
  • 需确保 $\gcd(p-1, q-1) \mid (dp - dq)$,否则泄露数据不一致
  • 该公式在 CTF 中非常常见,建议熟记

5. 攻击总结与对比

场景泄露量关键技巧复杂度
dp only$dp$穷举$k \in [1,e)$ 恢复 $p$$O(e)$,毫秒级
dp + p partial$dp$(不全) + $p$Hensel 提升逐位恢复$O(b)$ 次模幂
dp + dq + p + q$dp, dq, p, q$CRT 解同余方程组$O(1)$

6. 防御建议

  1. 避免侧信道泄露:在 CRT 解密中计算 $m_p = c^{dp} \bmod p$ 时,若出错返回不同结果会泄露 $p$
  2. 使用 Blinding:对输入 $c$ 做随机盲化后再解密
  3. 清除中间变量:$dp, dq$ 使用后立即从内存擦除
  4. 密钥生成隔离:$d$ 本身不必在每次签名/解密时加载

7. 参考文献

  1. D. Boneh, R. A. DeMillo, R. J. Lipton, "On the Importance of Checking Cryptographic Protocols for Faults", EUROCRYPT 1997.
  2. D. Bleichenbacher, "Chosen Ciphertext Attacks Against Protocols Based on the RSA Encryption Standard PKCS #1", CRYPTO 1998.
  3. PKCS #1 v2.2: RSA Cryptography Standard, RFC 8017.
  4. M. Joye, C. Paar, "RSA Exponent Reconstruction from CRT Parameters", 2003.
  5. CTF Wiki — RSA 题目整理:常见攻击面与防御.
  6. gmpy2 文档: https://gmpy2.readthedocs.io/
投币支持一下吧
END