CTF中RSA攻击的常见思路有哪些?
Crypto中RSA常用工具及python库说明
刚接触CTF密码学,很多人会觉得RSA像个黑盒,公钥加密,私钥解密,似乎坚不可摧。直到你第一次在赛题里看到被故意“玩坏”了的参数,才会恍然大悟,原来安全的不是算法本身,而是那些被忽略的实现细节。在CTF的竞技场上,RSA攻击更像是一场针对“错误用法”的全面审计。
模数分解:一切攻击的起点
最直白,也最根本的思路。RSA的安全性建立在大整数分解的困难性之上。如果攻击者能分解公钥中的模数N,得到素数p和q,那么整个密码体系便瞬间崩塌。CTF出题人常常在这里设下陷阱:使用过小的N(比如512位),让你能直接用yafu或在线数据库factordb.com在几秒内分解;或者,在题目中故意给出多个使用相同模数N加密的密文,这直接违反了RSA的基本使用准则,通过计算最大公约数(gcd)就能轻易恢复出共享的素数因子。
当公钥指数e变得危险
教科书告诉我们e通常取65537,既安全又高效。但e的大小一旦失控,就会打开新的攻击面。如果e非常小(比如3),而加密的明文m也很小,使得m^e < N,那么加密过程实际上没有取模,直接对密文c开e次方根就能恢复明文。另一种极端是e和d都很小,这可能触发Wiener攻击或Boneh-Durfee攻击,利用连分数展开从e/N的分数表示中逼近出私钥d。我见过一道题,e长得离谱,和N几乎一样大,心里一咯噔,就知道该去翻Boneh-Durfee的脚本了。
侧信道与错误注入:现实世界的幽灵
这类攻击不正面硬刚数学难题,而是利用实现时的物理缺陷或逻辑漏洞。最经典的是共模攻击:同一明文用相同的N但不同的e加密,如果这两个e互素,就能利用扩展欧几里得算法恢复明文,根本不需要分解N。这感觉就像拿到了两把不同的锁,却意外地找到了开同一扇门的钥匙。
更精妙的是选择密文攻击及其变种,比如Bleichenbacher攻击。服务器如果对解密结果有特定的错误反馈(如“PKCS#1填充错误”),攻击者就能像医生叩诊一样,通过发送大量精心构造的“探针”密文,并根据服务器的反应逐步推断出原始明文。这类题目往往模拟一个提供解密Oracle的脆弱服务,考验你对协议交互的理解。
填充与格式:魔鬼在细节里
直接使用教科书式的RSA加密(即RSA加密原始整数)是极不安全的。因此,实际应用中必须对明文进行填充,如OAEP或PKCS#1 v1.5。但填充方案本身也可能被攻破。对PKCS#1 v1.5的填充Oracle攻击就是一个典型。如果攻击者能判断解密后的消息是否具有合法的PKCS#1 v1.5填充格式,他就能利用这个信息泄露逐步解密任意密文。在CTF中,这常被简化为一个“服务器会告诉你解密后填充是否正确”的场景。
广播攻击与相关消息
想象一下,同一条消息被发送给三个不同的接收者,使用了不同的公钥(N1, e1), (N2, e2), (N3, e3),但巧了,加密指数e都是3。这就是广播攻击的完美场景。利用中国剩余定理,我们可以从三个密文中组合出一个在模N1*N2*N3下的方程,从而直接恢复明文。还有一种情况是,两条明文存在某种确定的线性关系(比如m2 = a*m1 + b),这为相关消息攻击创造了条件,通过求解多项式公约数来破解。
说到底,CTF中的RSA题目像是一系列精心设计的“反面教材”。它们存在的意义,就是让你在破解的过程中,深刻理解“为什么不能那样用”。下次再看到一组RSA参数,不妨先问自己:N够大吗?e正常吗?有多个密文或密钥吗?系统有反馈吗?问完这几个问题,攻击的路径图,往往就在脑海里浮现出来了。

参与讨论
模数太小真的秒破,上次512位直接factordb查出来了
e=3还加密短消息,这不是送分题嘛🤔
共模攻击那块讲得挺清楚,不过实际做题时还是懵了半天