[CTF实战]低加密指数攻击:从原理到爆破的完整复现

📅 2026/7/16 12:26:33
[CTF实战]低加密指数攻击:从原理到爆破的完整复现
1. 低加密指数攻击原理剖析当RSA加密中的公钥指数e取值过小时比如e3就可能引发低加密指数攻击。这种攻击的核心逻辑其实非常简单当明文的e次方小于模数n时密文就等于明文的e次方。用公式表示就是如果 M^e n那么 C M^e % n 其实就是 C M^e这时候攻击者只需要对密文C开e次方根就能直接还原出明文M。举个生活中的例子就像你把一个小礼物装进大箱子但礼物体积太小箱子里几乎全是空气——这时候根本不需要钥匙掀开盖子就能拿到礼物。但现实情况往往更复杂。当M^e大于n时事情就变成了M^e k*n C 其中k是某个正整数这时候我们需要通过爆破k值来寻找满足条件的M。就像你有一堆外观相同的箱子礼物可能藏在任何一个箱子里只能逐个开箱检查。2. 实战环境搭建我们先来准备靶场环境。以BUUCTF的[Dangerous RSA]题目为例题目给出了以下关键参数e 0x3 # 公钥指数 n 0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793 # 模数 c 0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365 # 密文安装必要的Python库pip install gmpy2 libnum3. 爆破脚本编写详解针对M^e n的情况我们需要编写爆破脚本。核心思路是通过枚举k值检查(k*n C)是否能开e次方from gmpy2 import iroot import libnum e 0x3 n 0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793 c 0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365 k 0 while True: # 尝试计算 (c k*n) 的e次方根 res iroot(c k * n, e) # 如果能开整数次方 if res[1]: print(Found k:, k) print(Plaintext:, libnum.n2s(int(res[0]))) break k 1这个脚本的工作原理就像用试错法开密码锁从k0开始不断尝试直到找到满足条件的k值。我曾在实际比赛中遇到过k值超过100万的情况这时候需要优化算法或耐心等待。4. 攻击效果优化技巧技巧1并行计算加速对于大k值爆破可以使用多线程加速from multiprocessing import Pool def brute_force(start_k): for k in range(start_k, start_k 10000): res iroot(c k * n, e) if res[1]: return k, res[0] return None with Pool(4) as p: # 4个进程并行 results p.map(brute_force, range(0, 100000, 10000))技巧2数学范围预估通过估算明文长度可以缩小k的范围。例如当n是1024位时如果明文M是ASCII字符串每个字符1字节M^3的上限大约是 (2^8)^len(M)通过比较n的位数可以预估k的大致范围常见踩坑点忘记检查iroot返回的布尔值导致误判没有处理大整数转换时的字节序问题在多线程环境中共享变量导致竞争条件5. 防御方案与实战建议开发者防御方案永远不要使用e3作为公钥指数建议使用65537使用OAEP等填充方案代替裸RSA加密对短明文进行随机填充确保M^e nCTF选手建议遇到e3要立即想到低加密指数攻击先尝试直接开方失败后再考虑爆破k值注意flag可能不是直接输出需要转换编码格式记得在某次真实比赛中flag被隐藏在爆破结果的十六进制编码中直接用n2s转换会显示乱码需要先手动处理字节序。这种小陷阱在CTF中非常常见。6. 扩展攻击场景分析场景1广播攻击当同一明文用相同的e3加密但不同n时满足n1,n2,n3互质可以通过中国剩余定理还原M^3然后直接开立方。这就像用三个不同形状的模具来锁定一个物体的真实形状。场景2Related Message攻击如果已知两个明文存在线性关系如M2 a*M1 b且都用e3加密可以通过解多项式方程恢复明文。这需要一定的数学技巧但在CTF中偶尔会出现。最后分享一个实用技巧在Python中处理大整数运算时使用gmpy2库比原生Python整数运算快10倍以上。我曾用原生Python写爆破脚本跑了1小时无果改用gmpy2后10分钟就出了结果。