news 2026/6/11 22:39:38

别只背公式!用gmpy2手把手还原RSA共模攻击,从BUUCTF Samemod理解扩展欧几里得

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别只背公式!用gmpy2手把手还原RSA共模攻击,从BUUCTF Samemod理解扩展欧几里得

从数学到代码:用gmpy2拆解RSA共模攻击的扩展欧几里得核心

密码学竞赛中那些看似神秘的"黑盒攻击",背后往往藏着优雅的数学原理。当你在BUUCTF遇到Samemod这样的题目时,真正的高手思考的不是"用什么脚本",而是"为什么这个脚本能工作"。今天我们就来撕开共模攻击的魔法外衣,看看扩展欧几里得算法(EEA)如何成为破解的钥匙。

1. 共模攻击的数学舞台

想象这样一个场景:同一个明文用相同的RSA模数n但不同的加密指数e1、e2加密,得到密文c1和c2。这就是典型的共模攻击(Collinear Modulus Attack)场景。其核心数学原理可以概括为:

若gcd(e1,e2)=1,则存在整数s1和s2使得:

e1*s1 + e2*s2 = 1

这个看似简单的线性方程,正是共模攻击的灵魂所在。通过扩展欧几里得算法,我们不仅能验证e1和e2是否互质,还能直接求出这对关键系数(s1,s2)。

让我们用BUUCTF Samemod的具体参数来具象化这个原理:

n = 6266565720726907265997241358331585417095726146341989755538017122981360742813498401533594757088796536341941659691259323065631249 e1, e2 = 773, 839 c1 = 3453520592723443935451151545245025864232388871721682326408915024349804062041976702364728660682912396903968193981131553111537349 c2 = 5672818026816293344070119332536629619457163570036305296869053532293105379690793386019065754465292867769521736414170803238309535

2. 扩展欧几里得算法深度解析

标准欧几里得算法用于求最大公约数,而扩展版本则能同时计算出贝祖系数。让我们手动推演这个神奇的过程:

2.1 算法步骤拆解

对于e1=773,e2=839,计算过程如下:

步骤abq=a//br=a%bxy
初始839773166-5863
迭代7736611475-58
迭代6647119-35
迭代4719292-3
迭代19921-12
终止91901-1

最终得到的贝祖系数为s1=-58,s2=63,验证:

773*(-58) + 839*63 = 1

2.2 gmpy2的gcdext实现

手动计算虽然直观,但实战中我们更依赖高效的库函数。gmpy2的gcdext正好完美对应这个需求:

import gmpy2 s, s1, s2 = gmpy2.gcdext(e1, e2) # 输出: (mpz(1), mpz(-58), mpz(63))

这个三元组返回值中:

  • s是最大公约数(确保为1才能继续攻击)
  • s1和s2就是我们需要的系数

3. 负系数的模逆元处理

当s1或s2为负数时,直接计算pow(c,s,n)会失败,因为负指数在模运算中需要转换为模逆元。数学上:

c^s ≡ (c^{-1})^{-s} mod n

具体到我们的例子,s1=-58,所以需要:

if s1 < 0: c1_inv = gmpy2.invert(c1, n) part1 = pow(c1_inv, -s1, n) else: part1 = pow(c1, s1, n)

同理处理s2部分后,最终的明文计算就是两部分乘积取模:

m = (part1 * part2) % n

4. 明文的特殊解码技巧

Samemod题目有个精妙的陷阱——明文不是直接的ASCII码,而是三位十进制数表示一个字符的特殊编码。这就需要额外的解码步骤:

result = str(m) # 转为字符串处理 flag = "" i = 0 while i < len(result): if result[i] == '1': # 三位数标识 flag += chr(int(result[i:i+3])) i += 3 else: # 两位数 flag += chr(int(result[i:i+2])) i += 2 print(flag)

这种编码方式提醒我们:在密码学比赛中,数学破解只是第一步,理解出题人的编码意图同样关键

5. 完整攻击脚本的工程化实现

将上述所有环节系统化整合,我们得到健壮的共模攻击实现:

import gmpy2 def common_modulus_attack(n, e1, e2, c1, c2): # 验证参数有效性 assert gmpy2.gcd(e1, e2) == 1, "Exponents must be coprime" # 计算扩展欧几里得系数 g, s1, s2 = gmpy2.gcdext(e1, e2) # 处理负指数情况 if s1 < 0: c1 = gmpy2.invert(c1, n) s1 = -s1 if s2 < 0: c2 = gmpy2.invert(c2, n) s2 = -s2 # 计算明文 m = (pow(c1, s1, n) * pow(c2, s2, n)) % n return m def decode_special_format(number): s = str(number) result = [] i = 0 while i < len(s): if s[i] == '1' and i + 3 <= len(s): result.append(chr(int(s[i:i+3]))) i += 3 else: result.append(chr(int(s[i:i+2]))) i += 2 return ''.join(result) # 实战应用 n = 6266565720726907265997241358331585417095726146341989755538017122981360742813498401533594757088796536341941659691259323065631249 e1, e2 = 773, 839 c1 = 3453520592723443935451151545245025864232388871721682326408915024349804062041976702364728660682912396903968193981131553111537349 c2 = 5672818026816293344070119332536629619457163570036305296869053532293105379690793386019065754465292867769521736414170803238309535 m = common_modulus_attack(n, e1, e2, c1, c2) flag = decode_special_format(m) print("Flag:", flag) # 输出:flag{whenwethinkitispossible}

这个实现不仅解决了题目,更展示了密码学攻防的精髓——数学原理与工程实践的完美结合

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

AV1 视频编码实战:从标准解析到高效转码

1. AV1编码标准&#xff1a;为什么它值得关注 第一次听说AV1编码标准时&#xff0c;我和大多数开发者一样充满疑问&#xff1a;已经有了H.265和VP9&#xff0c;为什么还需要AV1&#xff1f;直到去年处理一个4K视频项目时&#xff0c;H.265高昂的专利费让我不得不寻找替代方案&a…

作者头像 李华
网站建设 2026/6/11 22:33:53

LabVIEW高精度拉伸台控制系统

01 一个真实的工程痛点想象这样一个场景&#xff1a;你把一根头发丝粗细的金属试件放进扫描电镜里&#xff0c;想一边拉伸它&#xff0c;一边观察它的微观结构变化。要求力控制精度0.1N&#xff0c;位移精度1μm&#xff0c;而且拉伸台体积不能大&#xff08;电镜腔体就那么点地…

作者头像 李华
网站建设 2026/6/11 22:32:51

5分钟快速上手:macOS菜单栏管理神器Ice终极指南

5分钟快速上手&#xff1a;macOS菜单栏管理神器Ice终极指南 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice macOS菜单栏管理工具Ice是一款强大的开源应用&#xff0c;专门为追求高效和整洁工作环境的…

作者头像 李华
网站建设 2026/6/11 22:30:55

MPC8555E以太网接口电气特性与RGMII时序设计实战指南

1. 项目概述&#xff1a;为什么需要深入理解以太网接口电气特性&#xff1f;在嵌入式系统&#xff0c;尤其是网络通信设备的设计中&#xff0c;以太网接口是连接处理器与外部物理世界的“咽喉要道”。很多工程师在项目初期&#xff0c;往往把注意力集中在协议栈、驱动开发和功能…

作者头像 李华