【CTF-CRYPTO-教学-RSA】第二节:共模攻击(gcd(e1, e2)=1且使用相同模数n时,无需私钥即可恢复明文m)
什么是共模攻击当同一个明文 m被用相同的模数 n、不同的公钥指数 e1 和 e2加密两次得到两个密文 c1 和 c2 时攻击者可以在不知道私钥的情况下恢复出明文 m。加密原理假设我们有模数 n 15p3, q5公钥指数 e1 3e2 5gcd(3,5) 1同一个明文 m 2 被加密两次加密第一次c1 me1mod n 23mod 15 8加密第二次c2 me2mod n 25mod 15 2解密原理现在我们只知道 n15, e13, e25, c18, c22要恢复 m。第一步检查 gcd(e1, e2)gcd(3, 5) 1 ✓ 互质可以攻击代码importmath gmath.gcd(e1,e2)第二步找 a, b 使得 a×e1 b×e2 1即找 a, b 使得 3a 5b 1a 和 b 叫什么在数学上a 和 b 称为贝祖系数Bezout Coefficients因为它们是贝祖定理的产物对于任意两个整数 e1 和 e2一定存在整数 a、b 使得 a×e1 b×e2 gcd(e1, e2)当 e1 和 e2 互质gcd1时a×e1 b×e2 1a 和 b 是随便选的吗不是随便选的它们必须严格满足 a×e1 b×e2 1。但满足条件的 a、b 不是唯一的如果 (a, b) 是一组解那么 (ak×e2, b-k×e1) 也是一组解k 为任意整数。不过无论选哪组解最终 m c1a× c2bmod n 的结果都是一样的。怎么求 a 和 b方法一扩展欧几里得算法通用方法defexgcd(a,b):扩展欧几里得算法迭代版返回 (gcd, x, y) 使得 a*x b*y gcdold_r,ra,b old_s,s1,0old_t,t0,1whiler!0:quotientold_r//r old_r,rr,old_r-quotient*r old_s,ss,old_s-quotient*s old_t,tt,old_t-quotient*treturnold_r,old_s,old_t g,a,bexgcd(e1,e2)方法二当 gcd(e1, e2) 1 时可以用 pow() 快速求fromsympyimportmod_inverse# 方法二用 sympy.mod_inverse 快速求仅当 gcd1 时可用amod_inverse(e1,e2)# a e1^(-1) mod e2b(1-a2*e1)//e2# 由 a*e1 b*e2 1 推出print(f方法二 sympy:{a2}*{e1}{b2}*{e2}{a2*e1b2*e2})方法三手算逐一尝试比赛过程不可能的3×1 5×0 3 ≠ 13×2 5×(-1) 6 - 5 1✓所以 a 2b -1第三步带入m ( c 1 a ⋅ c 2 b ) m o d n m \big(c_1^a \cdot c_2^b\big)\bmod nm(c1a​⋅c2b​)modn分别计算A c 1 a ( m o d n ) A c_1^a \pmod nAc1a​(modn)分别计算B c 2 b ( m o d n ) B c_2^b \pmod nBc2b​(modn)KaTeX parse error: Cant use function \( in math mode at position 1: \̲(̲b0\)→ 先求逆元结果m ( A × B ) ( m o d n ) m(A\times B)\pmod nm(A×B)(modn)代码实现part1pow(c1,b,n)part2pow(c2,b,n)m(part1*part2)%n第四步处理负数指数在模运算里不能直接当成普通实数分数1 c 2 k \dfrac{1}{c_2^k}c2k​1​一定要区分普通除法 ≠ 模逆元。只有互质条件满足“模意义下的除法”才有意义。b -1 为负数c2(-1)就是 c2 在模 n 下的逆元。c2 2求 inv(2) mod 152 × ? ≡ 1 (mod 15)2 × 8 16 ≡ 1 (mod 15)所以 inv(2) 8代码fromsympyimportmod_inverseifb0:inv_c2mod_inverse(c2,n)part2pow(inv_c2,-b,n)第五步计算 mm c12× inv(c2) mod 15m 82× 8 mod 15m 64 × 8 mod 15m 512 mod 15m 2✓ 恢复出明文作业题目https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tabchallengeschallenge922c513e-e335-4f3c-b8a8-abc66773bb89c1 22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361 n 22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801 e1 11187289 c2 18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397 e2 9647291解题过程第一步检查 gcd(e1, e2)gcd(11187289, 9647291) 1互质可以攻击第二步用扩展欧几里得算法求 a, b找到 a -3421980, b 3968231使得-3421980 × 11187289 3968231 × 9647291 1第三步计算 m c1^a × c2^b mod na 为负数所以 c1^a 需要先求逆元c1(-1)mod n pow(c1, -1, n)c1(-3421980)mod n pow(inv_c1, 3421980, n)最终m c1(-3421980)× c23968231mod n第四步将明文整数转为字节串明文整数13040004482819947212936436796507286940525898188874967465457845309271472287032383337801279101转为字节串flag{49d91077a1abcb14f1a9d546c80be9ef}具体实现代码importmathfromsympyimportmod_inverse# ---- 迭代版扩展欧几里得算法 ----defexgcd(a,b):old_r,ra,b old_s,s1,0old_t,t0,1whiler!0:qold_r//r old_r,rr,old_r-q*r old_s,ss,old_s-q*s old_t,tt,old_t-q*treturnold_r,old_s,old_t# ---- 题目参数 ----c122322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361n22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801e111187289c218702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397e29647291# ---- 检查 gcd ----gmath.gcd(e1,e2)print(fgcd(e1, e2) math.gcd({e1},{e2}) {g})# ---- 扩展欧几里得算法求贝祖系数 a, b----# 注意Python 标准库没有 exgcd()需要自己实现# 当 gcd1 时也可以用 sympy.mod_inverse 快速替代g,a,bexgcd(e1,e2)print(f{a}*{e1}{b}*{e2}{g})# ---- 计算 m^g mod n ----ifa0:inv_c1mod_inverse(c1,n)part1pow(inv_c1,-a,n)else:part1pow(c1,a,n)ifb0:inv_c2mod_inverse(c2,n)part2pow(inv_c2,-b,n)else:part2pow(c2,b,n)m(part1*part2)%n# ---- 转换为字节串 ----m_bytesm.to_bytes((m.bit_length()7)//8,big)print(f明文:{m_bytes.decode(utf-8)})运行结果gcd(e1, e2) 1 -3421980*11187289 3968231*9647291 1 明文: flag{49d91077a1abcb14f1a9d546c80be9ef}答案flag{49d91077a1abcb14f1a9d546c80be9ef}

相关新闻

MCX N236微控制器开发实战:从时钟配置到低功耗调试全解析

MCX N236微控制器开发实战:从时钟配置到低功耗调试全解析

1. 从MCU选型到MCX N236:为什么是它? 如果你最近在关注微控制器领域,尤其是那些面向工业和消费电子边缘应用的场景,大概率会听到“恩智浦MCX”这个名字。它不是某个单一型号,而是一个全新的、模块化的MCU产品组合系列。…

2026/10/11 13:59:02 阅读更多 →
SpringBoot校园二手交易系统:完整项目部署与二次开发指南

SpringBoot校园二手交易系统:完整项目部署与二次开发指南

这次我们来看一个基于SpringBoot的校园二手交易系统。这个项目不是一个概念演示,而是一个可以直接部署、带完整前后端、数据库和文档的实战项目。对于计算机相关专业的同学来说,无论是作为毕业设计、课程设计,还是想学习一个完整的Web应用开发…

2026/10/4 19:09:51 阅读更多 →
终极网盘直链下载助手完整教程:告别限速,一键获取真实下载链接

终极网盘直链下载助手完整教程:告别限速,一键获取真实下载链接

终极网盘直链下载助手完整教程:告别限速,一键获取真实下载链接 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / …

2026/10/4 23:14:27 阅读更多 →

最新新闻

向量数据库与图数据库协同检索:突破多跳关联推理瓶颈

向量数据库与图数据库协同检索:突破多跳关联推理瓶颈

做知识类应用的开发者,大概都经历过这样的场景:一开始把文档切片、做embedding、灌进向量数据库,接上大模型做检索增强生成,demo跑起来挺顺,问什么答什么。可一旦问题从"某功能怎么用"变成"A出问题会不…

2026/10/11 13:58:14 阅读更多 →
NodePy节点式自动化:从脚本到可视化数据流的办公提效实践

NodePy节点式自动化:从脚本到可视化数据流的办公提效实践

1. 为什么我放弃了"万能脚本",转向NodePy这类节点方案先说说我自己的情况。过去几年里,我的日常工作中有一大半是和数据打交道——不是那种需要建模型的高深数据,而是最朴素的:把几个Excel表合并、按某种规则给文件重新…

2026/10/11 13:58:14 阅读更多 →
视频分析算法60讲实战拆解:从数学公式到MATLAB源码落地

视频分析算法60讲实战拆解:从数学公式到MATLAB源码落地

简介:《视频分析算法60讲》配套PDF教程与MATLAB实现源码,面向图像与视频处理学习者、计算机视觉研究者及算法工程师,可用于系统掌握视频分析各环节核心算法。内容从去噪、增强、帧间插值等预处理展开,深入讲解光流法、卡尔曼滤波器…

2026/10/11 13:58:14 阅读更多 →
校园互助平台Java毕设:全栈开发与部署避坑指南

校园互助平台Java毕设:全栈开发与部署避坑指南

1. 选题与整体方案设计:这个题目为什么值得做 每年到毕设季,Java方向的同学问得最多的就是“做什么题能保证过且工作量合适”。校园互助平台这个题目,我的评价是:看着不起眼,实际是个标准的“小闭环、深纵向”题目&…

2026/10/11 13:58:14 阅读更多 →
棉花病害目标检测实战:YOLO格式数据训练与避坑指南

棉花病害目标检测实战:YOLO格式数据训练与避坑指南

简介:这份数据集聚焦棉花主要病害图像的目标检测任务,已标注约4,600张现场图像,采用YOLO标注格式,类别涵盖枯萎病、卷曲、灰霉、健康、叶斑病等6类,可直接用于YOLOv5等模型训练与农业病害识别研究。包体共2000个文件&a…

2026/10/11 13:58:14 阅读更多 →
广工操作系统实验:Linux内核模块实操指南

广工操作系统实验:Linux内核模块实操指南

简介:本资源是广东工业大学操作系统课程配套的完整实验实践包,面向计算机专业本科生及操作系统初学者,聚焦进程调度、作业调度、主存管理与文件系统四大核心模块,助力理解内核级机制并提升系统编程能力。压缩包共12个文件&#xf…

2026/10/11 13:57:13 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →