文章总结: 本文档是一道CTF中RSA加密题目的WriteUp,题目来源于SWPU2020。文档详细分析了如何利用已知的两个代数关系式推导RSA算法中的素数因子p和q。核心解题思路包括代数方程化简与最大公约数法,通过提取公因子快速分解大整数。文中给出了具体的数学推导过程及Python解题脚本,最终成功解密获得flag,具有较高的实操参考价值,适合密码学初学者学习RSA相关攻击技巧。 综合评分: 88 文章分类: CTF,解决方案,数据安全
WriteUp | 【NSS每日一题】[SWPU 2020]happy
原创
特别顾问 BINGCHN 特别顾问 BINGCHN
凌日网络与信息安全团队
2026年3月11日 12:00 重庆
免责声明:由于传播、利用本公众号凌日网络与信息安全团队所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号凌日网络与信息安全团队及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
题目附件:
1. ('c=','0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9eL')
2. ('e=','0x872a335')
3. #q + q*p^3 =1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586
4. #qp + q *p^2 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594
题目分析:
第一步:提取公因子简化方程
方程 1 提取 q:q(1 + p³) = A(记大数 A 为方程 1 右侧值) 方程 2 提取 qp:qp(1 + p) = B(记大数 B 为方程 2 右侧值) 第二步:利用代数公式化简 1+p³代数公式:1 + p³ = (1 + p)(p² – p + 1),代入方程 1:q(1 + p)(p² – p + 1) = A
第三步:用方程 1 除以方程 2,消去公共项将化简后的方程 1 ÷ 方程 2:[q(1+p)(p²-p+1)] / [qp(1+p)] = A / B约去 q(1+p)(q、p 是素数,不为 0),得到:(p² – p + 1) / p = A / B进一步整理:p² – p + 1 = (A/B)pp² – p(1 + A/B) + 1 = 0(或更简单的形式:B(p² – p + 1) = Ap → Bp² – (A+B)*p + B = 0)
步骤 2:求解一元二次方程得到 p
上述整理后得到关于 p 的一元二次方程:Bp² – (A+B)p + B = 0根据一元二次方程求根公式 p = [ (A+B) ± √((A+B)² – 4BB) ] / (2*B),计算关键点:
计算判别式 Δ = (A+B)² – 4*B² = (A+B-2B)(A+B+2B) = (A-B)(A+3B); 计算 Δ 的平方根(因 p 是整数,Δ 必为完全平方数); 代入求根公式得到 p(取正整数解,且为素数)。 步骤 3:由 p 求 q
得到 p 后,代入方程 2 qp(1+p) = B,直接解出 q:q = B / [p*(1+p)](验证:q 需为素数,且代入方程 1 需成立)
步骤 4:计算私钥 d 并解密
计算欧拉函数 φ(n) = (p-1)(q-1)(n = pq); 求 e 关于 φ(n) 的模逆元 d(即满足 e*d ≡ 1 mod φ(n)),可通过扩展欧几里得算法实现; 解密:m = pow(c, d, n)(c 是给定的密文,pow 函数高效计算大数模幂)。
三、基础注意事项
大数计算:所有数值都是极大整数,需用支持大整数的语言(如 Python)计算,Python 天然支持任意精度大整数,无需担心溢出; 素数验证:求解出的 p、q 需验证是否为素数(可通过简单的素性测试,如米勒 – 拉宾测试); 模逆元求解:若 e 和 φ(n) 不互质,说明计算有误(RSA 中 e 需与 φ(n) 互质)。
解题:
根据附件可知需要求出p,q,一看就是需要求公约数的,用到的原理
1. hint1 = q + qp^3=(1+p^3)q = q(1+p)(p^2-p+1)
2. hint2 = qp + qp^2= q(1+p)p
3. gcd(hint1,hint2)= q(1+p)
4. p = hint2 / q(1+p)
5. q = gift // (p+1)
得到p,q后根据欧拉定理,解题代码如下:
1. fromCrypto.Util.number import*
2. from gmpy2 import*
4. c=0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9e
5. e=0x872a335
6. #q + q*p^3 =1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586
7. #qp + q *p^2 = 1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594
9. hint1 =1285367317452089980789441829580397855321901891350429414413655782431779727560841427444135440068248152908241981758331600586
10. hint2 =1109691832903289208389283296592510864729403914873734836011311325874120780079555500202475594
12. gift = gcd(hint1,hint2)
14. p = hint2//gift
15. q = gift // (p+1)
16. n= p*q
17. phi =(p-1)*(q-1)
19. d = invert(e, phi)
21. flag = pow(c, d, n)
22. print(long_to_bytes(flag))
Flag
1. flag{happy_rsa_1}
免责声明:由于传播、利用本公众号凌日网络与信息安全团队所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号凌日网络与信息安全团队及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:凌日网络与信息安全团队 特别顾问 BINGCHN 特别顾问 BINGCHN《WriteUp | 【NSS每日一题】[SWPU 2020]happy》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。


![WriteUp|【NSS每日一题】[SWPU2020]happy](/images/random/titlepic/14.jpg)






评论