RSA-CRT参数在密码学攻击中的作用
Crypto中RSA常用工具及python库说明
在实际的渗透测试或 CTF 赛场上,攻击者常常把注意力集中在 RSA 私钥的细节上,尤其是 CRT(Chinese Remainder Theorem)加速参数 dp、dq 与 qInv。这三个数看似只是为了提升解密速度,却恰恰为密码分析提供了多条破绽。
CRT 参数背后的数学结构
标准 RSA 私钥由 (n, d) 组成,其中 n = p·q。使用 CRT 时,私钥会额外携带 dp = d mod (p‑1)、dq = d mod (q‑1) 以及 qInv = q‑1 mod p。解密过程改写为两次小模运算,再通过 Garner 合并,理论上把 O(log n) 的乘法降低到 O(log p) 与 O(log q)。
参数泄露如何导致因式分解
如果攻击者得到任意一个 CRT 参数,就能逆向求出对应的素数。举例来说,已知 dp 与 d,可计算出 p 的候选集合:
- 利用方程 d ≡ dp (mod p‑1) 推导出 p‑1 必然整除 (d‑dp),从而枚举 p 的可能值。
- 当 dp 与 e(公钥指数)同时泄露时,
gcd(e·dp‑1, n)直接返回 p。
这类“单点泄露”在实际中并不少见:某些硬件令牌在导出 PEM 时会默认包含 CRT 参数,或者调试日志里不经意打印出 dq。
故障注入攻击对 CRT 的利用
故障注入(Fault Attack)往往针对 CRT 合并步骤。攻击者在解密时强行扰动一次模运算,使得得到的中间结果 r 与真实值 r′ 不一致。通过比较 r 与 r′,可以构造出 gcd(r‑r′, n),瞬间得到 p 或 q。该技巧在 1997 年的 Bellcore 实验中被首次演示,随后在智能卡、TPM 中屡见不鲜。
时序侧信道与 CRT 参数的关联
CRT 让解密过程分为两段时间不同的模幂运算。精细的时序采集能够分辨出哪段运算更耗时,从而推断出 p 与 q 的大小比例。若进一步结合缓存侧信道(Cache‑Timing),攻击者甚至可以恢复完整的 dp 与 dq,进而完成完整的私钥重建。
实战案例简析
2022 年某知名 CTF 赛题提供了一个受损的 OpenSSL 私钥文件,文件中明文泄露了 qInv。选手利用 qInv·q ≡ 1 (mod p),快速求出 p,再配合 n 直接算出 q,最终在几分钟内完成因式分解并解密出隐藏的 flag。该案例凸显了即使是“辅助”参数,也足以把完整的 RSA 防线撕开。
防御思路与最佳实践
- 在对外发布的 PEM/DER 中剔除 CRT 参数,只保留 (n, e, d)。
- 使用常数时间实现 CRT 合并,避免时序泄露。
- 对关键硬件加入随机故障检测,一旦检测到异常运算立即中止。

参与讨论
之前做CTF就遇到过泄露dp的题,直接秒了
这玩意儿在硬件里是不是更容易出问题?