【CTF-CRYPTO-教学-RSA】第四节:dp泄露攻击(已知dp、e、n,无需私钥即可解密)

发布时间:2026/11/14 7:59:07

【CTF-CRYPTO-教学-RSA】第四节:dp泄露攻击(已知dp、e、n,无需私钥即可解密) 什么是 dp 泄露攻击如果攻击者获取了dp或 dq、e、n和c就可以在不知道完整私钥的情况下分解 n恢复出 p 和 q计算出完整的私钥 d解密密文 c攻击原理关键数学推导e × dp - 1 m × (p-1)根据 RSA 性质私钥指数 d 满足e × d ≡ 1 (mod φ(n))因为 φ(n) (p-1)(q-1)所以 d 也满足e × d ≡ 1 (mod p-1)即e × d 1 k × (p-1)其中 k 为某个整数。而 dp d mod (p-1)意味着 d 可以写成d dp m × (p-1)其中 m 为某个整数。将 d 的表达式代入 e × d ≡ 1 (mod p-1)e × (dp m × (p-1)) ≡ 1 (mod p-1)展开后e × dp e × m × (p-1) ≡ 1 (mod p-1)因为 e × m × (p-1) 一定是 (p-1) 的倍数所以e × dp ≡ 1 (mod p-1)即e × dp - 1 m × (p-1)其中 m 是某个整数。m 的取值范围1 ≤ m e由于 0 dp p-1且 e 1我们有e × dp e × (p-1)e × dp - 1 e × (p-1) - 1所以 m e又因为 e × dp 1dp ≥ 1, e ≥ 2所以 m ≥ 1。结论m 的取值范围是 1 ≤ m e攻击步骤枚举 m 从 1 到 e-1对每个 m计算p (e × dp - 1) / m 1验证 n mod p 0如果成立则找到了 p计算 q n / p计算 φ(n) (p-1)(q-1)计算 d e^(-1) mod φ(n)解密密文m c^d mod n简单例子我们用p13, q17来演示整个过程。前置知识已知p 13, q 17n p × q 13 × 17 221φ(n) (p-1)(q-1) 12 × 16 192e 5公钥指数计算私钥d e^(-1) mod φ(n) 5^(-1) mod 192找 5 × ? ≡ 1 (mod 192)5 × 77 385 2 × 192 1所以 d 77计算 dpdp d mod (p-1) 77 mod 12 5加密明文 m2c m^e mod n 2^5 mod 221 32攻击过程现在假设攻击者只知道n221, e5, dp5, c32要恢复明文。第一步计算 e×dp - 1e × dp - 1 5 × 5 - 1 24所以 24 m × (p-1)其中 1 ≤ m 5代码实现edp_minus1e*dp-1第二步枚举 mm1p 24/1 1 25n mod 25 221 mod 25 21 ≠ 0 ✗m2p 24/2 1 13n mod 13 221 mod 13 0 ✓ 找到了代码实现# ---- 第二步: 枚举 m 求 p ----foundFalseform_valinrange(1,e):ifedp_minus1%m_val0:candidate_pedp_minus1//m_val1ifn%candidate_p0:p_recoveredcandidate_p q_recoveredn//p_recovered m_foundm_val foundTrueprint(fm{m_val}: p (e*dp-1)/{m_val} 1 {edp_minus1}/{m_val} 1 {candidate_p})print(f n mod{candidate_p}{n%candidate_p}✓ 找到因子!)breakelse:print(fm{m_val}: p {candidate_p}, n mod p {n%candidate_p}✗)else:candidate_pedp_minus1//m_val1print(fm{m_val}: e*dp-1 不能被{m_val}整除, p {candidate_p}✗)ifnotfound:print(未找到正确的因子)return第三步恢复 qq n / p 221 / 13 17第四步计算 φ(n) 和 dφ(n) (p-1)(q-1) (13-1)(17-1) 12 × 16 192d e(-1)mod φ(n) 5(-1)mod 192 77第五步解密m cdmod n 3277mod 221 2验证加密时 m2解密后 m2闭环成功代码实现# # RSA dp 泄露攻击# ## 已知: n, e, dp, c# 目标: 恢复 p, q, d解密密文 c## 原理:# e*dp ≡ 1 (mod p-1)# e*dp - 1 m*(p-1), 其中 1 m e# 枚举 m 即可求出 p# defexgcd(a,b):扩展欧几里得算法返回 (gcd, x, y) 使得 a*x b*y gcdold_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_tdefmod_inverse(a,m):计算 a 在模 m 下的逆元g,x,_exgcd(a%m,m)ifg!1:raiseValueError(f{a}和{m}不互质逆元不存在)returnx%mdefmain():# ---- 题目参数 ----e5n221dp5c32print( RSA dp 泄露攻击 )print(f已知: e{e}, n{n}, dp{dp}, c{c})print()# ---- 第一步: 计算 e*dp - 1 ----edp_minus1e*dp-1print(fe*dp - 1 {e}*{dp}- 1 {edp_minus1})print(f需要枚举 m 从 1 到{e-1}(因为 1 m e))print()# ---- 第二步: 枚举 m 求 p ----foundFalseform_valinrange(1,e):ifedp_minus1%m_val0:candidate_pedp_minus1//m_val1ifn%candidate_p0:p_recoveredcandidate_p q_recoveredn//p_recovered m_foundm_val foundTrueprint(fm{m_val}: p (e*dp-1)/{m_val} 1 {edp_minus1}/{m_val} 1 {candidate_p})print(f n mod{candidate_p}{n%candidate_p}✓ 找到因子!)breakelse:print(fm{m_val}: p {candidate_p}, n mod p {n%candidate_p}✗)else:candidate_pedp_minus1//m_val1print(fm{m_val}: e*dp-1 不能被{m_val}整除, p {candidate_p}✗)ifnotfound:print(未找到正确的因子)return# ---- 第三步: 恢复 q ----print(f\np {p_recovered})print(fq n/p {q_recovered})print(f验证: p*q n?{p_recovered*q_recoveredn})# ---- 第四步: 计算 φ(n) 和 d ----phi(p_recovered-1)*(q_recovered-1)dmod_inverse(e,phi)print(f\nφ(n) (p-1)(q-1) ({p_recovered}-1)({q_recovered}-1) {phi})print(fd e^(-1) mod φ {d})# ---- 第五步: 解密 ----m_decpow(c,d,n)print(f\n解密: m c^d mod n {c}^{d}mod{n}{m_dec})# ---- 转换为字节串 ----m_bytesm_dec.to_bytes((m_dec.bit_length()7)//8,big)print(f\n明文:{m_bytes})if__name____main__:main()运行结果RSA dp 泄露攻击已知:e5,n221,dp5,c32e*dp -15*5 -124需要枚举 m 从1到4(因为1me)m1: p25, n mod p21✗m2: p(e*dp-1)/2 124/2 113n mod130✓ 找到因子!p13qn/p17验证: p*qn? True φ(n)(p-1)(q-1)(13-1)(17-1)192de^(-1)mod φ77解密: mc^d mod n32^77 mod2212明文: b\x02作业dp泄露攻击题目https://ctf2.dasctf.com/dashboard/practice/b9bbb32f-f186-458f-b90b-12440c0f6aea?tabchallengeschallenge22420fad-675d-48a7-adb7-2ab894c932bfe 65537 n 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113 dp 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657 c 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751 求明文作为 flag 提交解题过程第一步分析已知条件已知 e65537, n, dp, c这是一个 dp 泄露攻击的典型场景需要通过枚举 m1 ≤ m e来分解 n第二步计算 e×dp - 1 并枚举 medp_minus1e*dp-1# 枚举 m 从 1 到 65536form_valinrange(1,e):ifedp_minus1%m_val0:candidate_pedp_minus1//m_val1ifn%candidate_p0:pcandidate_p qn//pbreak找到 m 4404成功分解 np 13468634736343473907717969603434376212206335187555458742257940406618189481177835992217885676243155145465521141546915941147336786447889325606555333350540003q 18432009829596386103558375461387837845170621179295293289126504231317130550979989727125205467379713835047300158256398009229511746203459540859429194971855371第三步计算私钥 d 并解密phi(p-1)*(q-1)dmod_inverse(e,phi)mpow(c,d,n)具体实现代码# # dp泄露攻击# defexgcd(a,b):扩展欧几里得算法返回 (gcd, x, y) 使得 a*x b*y gcdold_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_tdefmod_inverse(a,m):计算 a 在模 m 下的逆元g,x,_exgcd(a%m,m)ifg!1:raiseValueError(f{a}和{m}不互质逆元不存在)returnx%mdefmain():# ---- 题目参数 ----e65537n248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113dp905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657c140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751print( 作业3: dp泄露攻击 )print(f已知: e{e})print(fn{n})print(fdp{dp})print(fc{c})print()# ---- 第一步: 计算 e*dp - 1 ----edp_minus1e*dp-1print(fe*dp - 1 {e}*{dp}- 1)print(f{edp_minus1})print(f需要枚举 m 从 1 到{e-1})print()# ---- 第二步: 枚举 m 求 p ----foundFalseform_valinrange(1,e):ifedp_minus1%m_val0:candidate_pedp_minus1//m_val1ifn%candidate_p0:pcandidate_p qn//p m_foundm_val foundTrueprint(f找到 m {m_found})print(fp (e*dp-1)/m 1)print(f ({edp_minus1})/{m_found} 1)print(f {p})print(fq n/p {q})print(f验证: p*q n?{p*qn})breakifnotfound:print(未找到正确的因子)return# ---- 第三步: 计算 φ(n) 和 d ----phi(p-1)*(q-1)dmod_inverse(e,phi)print(f\nφ(n) (p-1)(q-1))print(f {phi})print(fd {e}^(-1) mod φ)print(f {d})# ---- 第四步: 解密 ----m_decpow(c,d,n)print(f\n解密: m c^d mod n)print(f {m_dec})# ---- 第五步: 转换为字节串 ----m_bytesm_dec.to_bytes((m_dec.bit_length()7)//8,big)print(f\n明文(字节串):{m_bytes})try:decodedm_bytes.decode(utf-8)print(f明文(字符串):{decoded})exceptUnicodeDecodeError:print(f明文(hex):{m_bytes.hex()})if__name____main__:main()运行结果作业3: dp泄露攻击已知:e65537n248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113dp905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657c140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751e*dp -165537*905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657 -159315867378856659089589938133524992838556700165994240300903969550746506475107189709727568518174855260630155107372617804812871207516504589971269688075778168808需要枚举 m 从1到65536找到 m4404p(e*dp-1)/m 113468634736343473907717969603434376212206335187555458742257940406618189481177835992217885676243155145465521141546915941147336786447889325606555333350540003qn/p18432009829596386103558375461387837845170621179295293289126504231317130550979989727125205467379713835047300158256398009229511746203459540859429194971855371验证: p*qn? True φ(n)(p-1)(q-1)248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670446536428489604864269408388233229385110283347278332394130113040720698361459971843083058974654167036569976726345315473316225080897072784301302480781343510740d65537^(-1)mod φ63183802294329275109394617778318843917232869063572889334764759976175767511604500261826320177778480001780606046979134286524100781096232758191739978884872103517518763547448555987181526927783445069597824169314037723507625024774847068531404022517009193374276930768809067581593826912268843157943539151615618807073解密: mc^d mod n3670434958110785066911905751469631231338751225710158680692616521935747246580688484040488309932916523151997明文(字节串): bflag{wow_leaking_dp_breaks_rsa?_98924743502}明文(字符串): flag{wow_leaking_dp_breaks_rsa?_98924743502}答案flag{wow_leaking_dp_breaks_rsa?_98924743502}
延伸阅读

更多相关文章

2026/11/14 7:59:07

富瀚微MC632X嵌入式AI视觉开发实战:从环境搭建到模型部署

1. 项目概述:为什么MC632X值得你投入时间?如果你正在嵌入式视觉领域寻找一颗兼具性价比和性能的SoC,或者你手头恰好有一块基于富瀚微MC632X的开发板,那么这篇实践指南可能就是为你准备的。MC632X系列,作为富瀚微在智能…

2026/11/9 15:14:18

DNS BP-0168A-S 面板开关板

DNS BP-0168A-S 面板开关板是一款用于工业设备操作控制的信号输入组件,以下为其核心特点与应用领域概述。产品特点 采用金属坚固外壳设计,耐用且抗冲击。 面板具备防油防水特性,适应恶劣生产环境。 采用数字编码式开关技术,节省PL…

2026/11/14 7:57:26

广州花都区电工证过期了不知道怎么复审?考前押题帮你轻松搞定

广州花都区电工证过期了不知道怎么复审?考前押题帮你轻松搞定 证书过期了不知道怎么复审延期?别急,广州花都区电工证的复审流程其实没你想的那么复杂。尤其在当前政策收紧、岗位需求提升的背景下,拥有一个合规、有效的电工证,不仅能保住你的工作,还可能…

2026/11/14 7:57:26

瑞昌市电工证报名中心内部消息:外省电工证怎么转?别再走弯路

瑞昌市电工证报名中心内部消息:外省电工证怎么转?别再走弯路 之前考的证在外省能不能转过来?这个问题,其实很多在瑞昌市电工证报名中心附近准备报考或正在备考的学员都问过。特别是那些在外地打工、换过工作地的朋友,担心自己的证书“白费了”。今天,我…

2026/11/14 7:57:26

浠水电工证复审在哪考?外省证怎么转?一文讲清

浠水电工证复审在哪考?外省证怎么转?一文讲清 之前考的证在外省能不能转过来?这个是很多在外地打工的朋友最关心的问题,特别是像我在鹤壁工地上的工友,手里拿着外地考的电工证,担心回老家后能不能用,或者能不能直接在本地复审。今天我就来聊聊…

2026/11/14 7:57:26

工地电工证在哪里报考内部消息全公开,跨省转证流程不踩坑

工地电工证在哪里报考内部消息全公开,跨省转证流程不踩坑 之前考的证在外省能不能转过来?这几乎是所有在工地干过电工作业的老手都会问的问题。特别是像我们南阳卧龙区这类需要频繁流动的从业者,手里拿着的可能是外地的电工证,想在本地继续干下去却碰了壁…

2026/11/14 7:57:26

外省电工证能转回来吗?千万别踩坑的电工证样.避坑指南

外省电工证能转回来吗?千万别踩坑的电工证样.避坑指南 之前考的证在外省能不能转过来?这个问题困扰着很多在外地打工的电工,尤其是像焦作劳务班组负责人这样的从业者。很多电工证是外地考的,回来后却无法使用,或者被认定为“无效证书”,这不仅耽误了工…

2026/11/14 7:52:25

电工证现在变了吗?2026河南最新政策怎么应对

电工证现在变了吗?2026河南最新政策怎么应对 证书过期了不知道怎么复审延期?别慌,2026年河南最新政策已经明确,只要操作得当,电工证的复审和延期并不难。尤其是对于像濮阳劳务班组负责人这样的从业者来说,掌握最新的流程和规定,能帮你少走弯路…

2026/11/13 22:33:32

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/14 0:06:39

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来

土木特种工考证官方报名入口怎么找 之前考的证在外省能不能转过来 之前考的证在外省能不能转过来?这个问题我太熟悉了,作为一名干了十几年的特种作业证书办理从业者,每年都会遇到不少像你一样在外地考了证,回来却发现无法直接使用的学员。别急,今天我就…

2026/11/14 0:06:39

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试

电工证要多久多钱保姆级教程:工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,你不是一个人。在信阳浉河区,很多刚进入工地的电工都面临这样的困境:工作强度大,时间碎片化,根本没有系统复习考试的机会。但电工证是上岗的硬门槛,…

2026/11/13 22:32:11

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/13 12:14:39

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑