news 2026/4/20 12:23:30

当RSA遇上‘坏’e:从一道CTF题看AMM算法如何破解e与φ不互素难题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
当RSA遇上‘坏’e:从一道CTF题看AMM算法如何破解e与φ不互素难题

当RSA遭遇特殊指数:AMM算法破解e与φ(n)不互素难题的深度解析

在CTF密码学挑战中,RSA问题往往被设计成需要突破常规思维才能解决的形态。其中,当公钥指数e与欧拉函数φ(n)不互素时,传统的解密方法将完全失效——这正是NCTF2019 easyRSA赛题设置的巧妙之处。本文将从一个密码学实践者的视角,系统剖析这类问题的数学本质与工程化解法,重点解读AMM算法在有限域开高次方根的核心原理,以及如何通过中国剩余定理(CRT)组合局部解。

1. 问题场景与数学困境

1.1 经典RSA解密的先决条件

标准RSA解密依赖于一个基本前提:必须存在整数d使得ed ≡ 1 mod φ(n)。这要求e与φ(n)互质,否则模反元素d将不存在。但在某些特殊场景下:

  • 出题人故意选择不满足互质条件的e(如本题的e=0x1337)
  • 实际系统中因参数生成错误导致非互质
  • 基于特殊数学构造的变种RSA方案

此时解密过程会遇到根本性障碍。以NCTF2019 easyRSA为例:

p = 199138677823743837339927520157607820029746574557746549094921488292877226509198315016018919385259781238148402833316033634968163276198999279327827901879426429664674358844084491830543271625147280950273934405879341438429171453002453838897458102128836690385604150324972907981960626767679153125735677417397078196059 q = 112213695905472142415221444515326532320352429478341683352811183503269676555434601229013679319423878238944956830244386653674413411658696751173844443394608246716053086226910581400528167848306119179879115809778793093611381764939789057524575349501163689452810148280625226541609383166347879832134495444706697124741 e = 0x1337 # 与φ(n)有公因子19

1.2 数学本质分析

当gcd(e,φ(n))=g>1时,方程m^e ≡ c mod n的解法需要分情况讨论:

  1. g与明文无关:可通过升幂法求解,即寻找k使得m^(e/g) ≡ c^k mod n
  2. g与明文相关:必须直接在有限域内求解高次方根

AMM算法针对的是第二种情况,其核心是将问题拆解为:

  • 在GF(p)和GF(q)上分别求解m^e ≡ c mod p和m^e ≡ c mod q
  • 通过CRT合并两个有限域的解

关键突破点:将模n的大数域问题转化为两个素数域上的可计算问题

2. AMM算法原理深度剖析

2.1 有限域中的方根问题

对于素数p和整数e,求解x^e ≡ a mod p需要满足:

  1. a是模p的e次剩余
  2. e | (p-1)或通过变形满足可解条件

AMM算法的创新在于处理**e不整除(p-1)**的情况。其数学基础是:

  • 将p-1分解为s*r^t,其中r不整除s
  • 通过随机搜索找到非r次剩余的生成元
  • 构造递推关系逐步降低方根次数

2.2 算法步骤详解

以下是AMM算法的关键步骤实现(基于SageMath):

def AMM(o, r, q): g = GF(q) o = g(o) # 步骤1:寻找非r次剩余 p = g.random_element() while p^((q-1)//r) == 1: p = g.random_element() # 步骤2:分解q-1 = s*r^t t, s = 0, q-1 while s % r == 0: t += 1 s = s // r # 步骤3:求解k满足r | k*s +1 k = 1 while (k*s +1) % r != 0: k += 1 alp = (k*s +1) // r # 步骤4:初始化变量 a = p^(r^(t-1)*s) b = o^(r*alp -1) c = p^s h = 1 # 步骤5:递推求解 for i in range(1, t): d = b^(r^(t-1-i)) j = -discrete_log(a, d) if d !=1 else 0 b = b * (c^r)^j h = h * c^j c = c^r return o^alp * h

算法各阶段的时间复杂度对比:

步骤计算内容时间复杂度
1寻找非r次剩余O(r)随机尝试
2分解q-1O(log(q))
3求解kO(r)
4-5递推求解O(t^2*log(r))

2.3 算法适用条件验证

AMM算法并非万能钥匙,需要满足两个关键条件:

  1. 可分解性:r必须整除q-1(即t>0)
  2. 可解性:存在整数k使得r | k*s +1

在NCTF2019 easyRSA中,对于p=19913...6059:

  • p-1 = 2 * 19 * 524...4237 * 1337^1
  • r=1337正好整除p-1,满足条件

实践提示:在实际CTF比赛中,可先用factor(p-1)检查是否满足算法前提条件

3. 完整攻击链构建

3.1 分而治之策略

将原问题分解为三个层次:

  1. 有限域分解:在GF(p)和GF(q)上分别求解
  2. 本原根扩展:找到所有可能的e次方根
  3. CRT组合:筛选符合条件的有效解

关键代码结构:

# 在GF(p)上求解 cp = c % p mp = AMM(cp, e, p) # 寻找所有本原根 p_proot = findAllPRoot(p, e) mps = findAllSolutions(mp, p_proot, cp, p) # 同理处理GF(q) ... # CRT组合验证 for mpp in mps: for mqq in mqs: solution = CRT_list([int(mpp), int(mqq)], [p, q]) if check_NCTF_prefix(solution): print(bytes.fromhex(solution.hex()))

3.2 解的空间分析

由于e与φ(n)不互素,解的数量会显著增加:

  • 在GF(p)中最多有gcd(e,p-1)个解
  • 在GF(q)中最多有gcd(e,q-1)个解
  • 组合后解的总数为gcd(e,p-1)*gcd(e,q-1)

在本题中:

  • gcd(0x1337, p-1) = 1337
  • gcd(0x1337, q-1) = 1337
  • 理论最大解数达1,787,689种组合

优化技巧:通过flag格式前缀(如'NCTF')快速过滤无效解

4. 实战优化与边界情况

4.1 性能优化策略

AMM算法在大型素数上的计算成本较高,可采用:

  1. 并行计算:同时处理p和q的求解
  2. 预计算加速:缓存本原根计算结果
  3. 早期终止:发现有效解立即停止

实测性能对比(i7-11800H):

方法p计算时间q计算时间CRT验证时间总时间
原始实现142s85s16min~18min
优化并行版98s98s2min~4min

4.2 特殊场景处理

当遇到更复杂的情况时:

  1. e与φ(n)有多个公因子:需分层应用AMM算法
  2. 高次方根(如e=10):可能需要扩展到扩域求解
  3. 多素数RSA(n=pqr):增加CRT组合维度

典型错误处理模式:

try: mp = AMM(cp, e, p) except Exception as e: print(f"AMM failed on p: {str(e)}") if 'no solution' in str(e): try_alternative_approach(p)

在Hackergame 2019的十次方根题中,就需要在扩域GF(y^3)而非GF(y)中求解:

R.<b> = PolynomialRing(GF(y^3)) g = b^10 - z # 在三次扩域中求解

5. 密码学启示与防御建议

从工程实践角度,这类攻击给密码系统设计者带来重要启示:

  1. 参数验证:强制检查gcd(e,φ(n))=1
  2. 错误处理:对异常参数给出明确警告
  3. 系统监控:检测异常解密请求

对于CTF选手,建议建立如下知识体系:

  • 基础工具:SageMath的有限域运算
  • 算法模板:AMM、CRT等现成实现
  • 调试技巧:中间结果验证方法
# 参数安全检查示例 def validate_rsa_params(p, q, e): phi = (p-1)*(q-1) if gcd(e, phi) != 1: raise ValueError("e must be coprime with φ(n)") if e <= 2 or e >= phi: raise ValueError("e out of safe range")

在真实密码系统中,这类问题通常通过严格的参数生成算法避免。但对于安全研究人员,理解这些边界情况的处理方法,既能提升CTF竞赛能力,也能加深对密码系统脆弱性的认知。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 12:21:17

实战教程:Elasticsearch 数据索引与搜索全流程

实战教程&#xff1a;Elasticsearch 数据索引与搜索全流程一、前置说明&#xff1a;基础概念与环境1.1 核心概念1.2 环境要求二、操作流程总览&#xff1a;索引搜索标准流程图三、索引操作&#xff1a;创建索引 插入数据&#xff08;核心步骤&#xff09;3.1 操作1&#xff1a…

作者头像 李华
网站建设 2026/4/20 12:20:16

Wifi-Hacking高级技巧:绕过MAC过滤和隐藏SSID的无线网络

Wifi-Hacking高级技巧&#xff1a;绕过MAC过滤和隐藏SSID的无线网络 【免费下载链接】Wifi-Hacking Cyber Security Tool For Hacking Wireless Connections Using Built-In Kali Tools. Supports All Securities (WEP, WPS, WPA, WPA2/TKIP/IES) 项目地址: https://gitcode.…

作者头像 李华
网站建设 2026/4/20 12:16:14

高性能开源PLC编程平台:OpenPLC Editor工业自动化开发完整解决方案

高性能开源PLC编程平台&#xff1a;OpenPLC Editor工业自动化开发完整解决方案 【免费下载链接】OpenPLC_Editor 项目地址: https://gitcode.com/gh_mirrors/ope/OpenPLC_Editor OpenPLC Editor作为一款基于PLCopen国际标准的开源工业自动化编程平台&#xff0c;为工业…

作者头像 李华
网站建设 2026/4/20 12:14:15

Cursor Pro限制突破终极指南:免费畅享AI编程助手的完整方案

Cursor Pro限制突破终极指南&#xff1a;免费畅享AI编程助手的完整方案 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached you…

作者头像 李华
网站建设 2026/4/20 12:13:14

Qt信号管理三板斧:connect、disconnect、blockSignals实战场景全解析

Qt信号管理三板斧&#xff1a;connect、disconnect、blockSignals实战场景全解析 在Qt开发中&#xff0c;信号与槽机制是构建响应式应用的核心支柱。但真正掌握这项技术的关键&#xff0c;不在于简单的语法使用&#xff0c;而在于如何根据不同的场景需求&#xff0c;灵活组合c…

作者头像 李华