news 2026/6/12 22:51:52

从‘共享素数’到‘共模’:一次搞懂RSA在CTF中的两种‘非典型’攻击套路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从‘共享素数’到‘共模’:一次搞懂RSA在CTF中的两种‘非典型’攻击套路

从‘共享素数’到‘共模’:RSA在CTF中的两种非典型攻击模式深度解析

当你已经能够熟练完成RSA的基础加解密,却在CTF赛题中反复遭遇那些看似"违反常规"的题目时,是否曾感到困惑?本文将带你深入剖析两种常令参赛者头疼的攻击方式——共模攻击与模不互素攻击(共享素数攻击)。不同于教科书式的并列讲解,我们将从攻击逻辑的本质差异出发,构建一套完整的"攻击模式识别"框架。

1. 攻击模式的核心差异图谱

在CTF的Crypto类题目中,这两种攻击常被混淆,但它们的触发条件和数学原理截然不同。让我们先通过一个对比表格建立直观认知:

特征维度共模攻击模不互素攻击
触发条件相同N,不同e不同N之间存在非1公约数
数学基础扩展欧几里得算法最大公约数(GCD)分解
攻击目标直接恢复明文m分解N获取私钥
典型题目特征提供两组(e,c)对相同m加密提供两个不同N的公钥
防御措施避免重复使用模数确保不同密钥对的素数完全独立

关键洞察:共模攻击利用的是加密指数的线性组合,而模不互素攻击则利用素数生成过程中的缺陷。

2. 共模攻击的数学原理与实战

2.1 攻击成立的条件链

共模攻击需要满足以下条件闭环:

  1. 同一明文m使用相同模数N加密
  2. 两组加密指数e₁和e₂互质(gcd(e₁,e₂)=1)
  3. 攻击者能够获取两组密文c₁和c₂

攻击的核心在于利用扩展欧几里得算法重构明文。具体推导过程如下:

# 数学推导关键步骤伪代码 给定: c₁ ≡ m^e₁ mod N, c₂ ≡ m^e₂ mod N 通过扩展欧几里得找到s,t使得: e₁*s + e₂*t = 1 则: m ≡ c₁^s * c₂^t mod N

2.2 实战中的边界处理

在实际解题时,需要注意两个技术细节:

  1. 负数指数处理:当s或t为负数时,需要先计算模逆元
  2. 大数运算优化:使用gmpy2库提升计算效率

以下是一个典型题目的完整解题脚本:

from Crypto.Util.number import long_to_bytes import gmpy2 def common_modulus_attack(c1, c2, e1, e2, n): gcd, s, t = gmpy2.gcdext(e1, e2) if s < 0: c1 = gmpy2.invert(c1, n) s = -s if t < 0: c2 = gmpy2.invert(c2, n) t = -t m = (pow(c1, s, n) * pow(c2, t, n)) % n return long_to_bytes(m) # [SWPUCTF 2021 新生赛]crypto2 实例 c1 = 100156221476910922393504870369139942732039899485715044553913743347065883159136513788649486841774544271396690778274591792200052614669235485675534653358596366535073802301361391007325520975043321423979924560272762579823233787671688669418622502663507796640233829689484044539829008058686075845762979657345727814280 c2 = 86203582128388484129915298832227259690596162850520078142152482846864345432564143608324463705492416009896246993950991615005717737886323630334871790740288140033046061512799892371429864110237909925611745163785768204802056985016447086450491884472899152778839120484475953828199840871689380584162839244393022471075 e1, e2 = 3247473589, 3698409173 n = 103606706829811720151309965777670519601112877713318435398103278099344725459597221064867089950867125892545997503531556048610968847926307322033117328614701432100084574953706259773711412853364463950703468142791390129671097834871371125741564434710151190962389213898270025272913761067078391308880995594218009110313 print(common_modulus_attack(c1, c2, e1, e2, n))

3. 模不互素攻击的深入剖析

3.1 素数共享的脆弱性

当两个RSA模数N₁和N₂共享同一个素数因子时,系统安全性将彻底崩溃。攻击流程可分为三个关键步骤:

  1. 素数提取:计算gcd(N₁,N₂)得到公共素数q
  2. 模数分解:p₁ = N₁/q,p₂ = N₂/q
  3. 私钥重构:分别计算φ(N₁)和φ(N₂)后求私钥d

3.2 典型攻击场景还原

以[羊城杯 2021]Bigrsa为例,题目设置了双重加密的陷阱:

m → c₁ = m^e mod N₁ → c₂ = c₁^e mod N₂

解题时需要逆向操作:

from math import gcd from Crypto.Util.number import inverse, long_to_bytes def shared_prime_attack(n1, n2, e, c): q = gcd(n1, n2) p1 = n1 // q p2 = n2 // q d1 = inverse(e, (p1-1)*(q-1)) d2 = inverse(e, (p2-1)*(q-1)) m = pow(pow(c, d2, n2), d1, n1) return long_to_bytes(m) # 题目数据 n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061 n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073 e = 65537 c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264 print(shared_prime_attack(n1, n2, e, c))

4. 防御方案与出题套路识别

4.1 出题者的常见陷阱设置

  • 共模攻击题目特征

    • 提供多组加密结果
    • 强调"相同消息不同加密"
    • 可能隐藏模数N相同的信息
  • 模不互素攻击题目特征

    • 提供多个公钥
    • 出现"双重加密"描述
    • 模数N具有相似位数

4.2 实际应用中的防护建议

对于开发者而言,需要建立以下安全实践:

  1. 密钥生成规范
    • 确保每次加密使用独立随机数
    • 使用强随机数生成素数
  2. 系统架构检查
    • 禁止模数重复使用
    • 定期检查密钥对之间的gcd关系
  3. 加密方案选择
    • 对相同消息采用OAEP等填充方案
    • 考虑结合AES的混合加密方案

在CTF比赛中遇到RSA异常情况时,建议按照以下流程快速诊断:

  1. 检查所有可用模数N之间的关系
  2. 验证是否存在相同模数不同指数的情况
  3. 计算关键参数之间的gcd
  4. 尝试标准攻击脚本的变种
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 22:49:00

联想平板 ZUI 日历深度玩法!不止看日期,时间管理全靠它

拿到联想平板后&#xff0c;大家常会下载各类娱乐、学习软件&#xff0c;却很少留意系统自带的日历 App。在不少人的认知里&#xff0c;日历就只能看看日期、节气&#xff0c;功能单一没必要深究。但实际上联想 ZUI 系统搭载的日历远不止于此&#xff0c;你可以用它记录亲友生日…

作者头像 李华
网站建设 2026/6/12 22:48:57

041、FOC速度环与位置环设计

041、FOC速度环与位置环设计 一、从一次电机“鬼畜”抖动说起 去年调试一个六轴协作机器人,第三关节在低速运行时出现周期性抖动,示波器抓电流波形发现q轴电流在目标值附近来回震荡,频率大约8Hz。当时第一反应是速度环PI参数没调好,但反复调整Kp和Ki后抖动依然存在,甚至…

作者头像 李华
网站建设 2026/6/12 22:48:03

深入解析Storybook与Ag-Grid的集成

引言 在现代Web开发中,组件化和可视化测试工具的使用变得越来越普遍。Storybook作为一个独立的UI开发环境,允许开发者以一种隔离的方式构建和测试组件。而Ag-Grid则是一个功能强大的数据表格库,广泛应用于需要展示大量数据的场景。本文将深入探讨如何将Storybook与Ag-Grid结…

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

如何在Google Ads投放广告|对手抢你生意?只花200块买他的品牌词截流

每天有几十个本地居民在谷歌搜索框输入“大华搬家公司”。屏幕上方跳出一条广告&#xff0c;写着“小李搬家——首单减免50元&#xff0c;30分钟上门”。大华的老板看到屏幕上的文字非常生气。小李每天分配200元预算专门投放“大华搬家”四个字&#xff0c;每次有人点击&#x…

作者头像 李华
网站建设 2026/6/12 22:45:35

数字信号控制器DSC:融合DSP与MCU优势的嵌入式实时控制解决方案

1. 项目概述&#xff1a;为什么我们需要DSC&#xff1f;在嵌入式开发领域&#xff0c;尤其是工业控制、电机驱动这类对实时性和计算能力都有严苛要求的场景&#xff0c;工程师们长期面临一个经典的选择题&#xff1a;是选一颗性能强劲的数字信号处理器&#xff08;DSP&#xff…

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

视觉隐喻理解:AI跨域映射与文化背景挑战

1. 视觉隐喻理解的挑战与现状视觉隐喻理解是AI领域长期存在的难题。当我们看到一幅描绘"政府如同失舵船只"的政治漫画时&#xff0c;人类能立即领会其隐喻含义&#xff0c;而现有AI系统往往只能识别画面中的船只、海浪等具体元素。这种差距源于隐喻理解的三个核心挑战…

作者头像 李华