NSSCTF_crypto_[LitCTF 2024]common_primes

题目:

python 复制代码
from Crypto.Util.number import *
from secret import flag

m = bytes_to_long(flag)
e = 65537
p = getPrime(512)
q1 = getPrime(512)
q2 = getPrime(512)
n1 = p * q1
n2 = p * q2
c1 = pow(m, e, n1)
c2 = pow(m, e, n2)

print(f"n1 = {n1}")
print(f"n2 = {n2}")
print(f"c1 = {c1}")
print(f"c2 = {c2}")

'''
n1 = 63306931765261881888912008095340470978772999620205174857271016152744820165330787864800482852578992473814976781143226630412780924144266471891939661312715157811674817013479316983665960087664430205713509995750877665395721635625035356901765881750073584848176491668327836527294900831898083545883834181689919776769
n2 = 73890412251808619164803968217212494551414786402702497903464017254263780569629065810640215252722102084753519255771619560056118922616964068426636691565703046691711267156442562144139650728482437040380743352597966331370286795249123105338283013032779352474246753386108510685224781299865560425114568893879804036573
c1 = 11273036722994861938281568979042367628277071611591846129102291159440871997302324919023708593105900105417528793646809809850626919594099479505740175853342947734943586940152981298688146019253712344529086852083823837309492466840942593843720630113494974454498664328412122979195932862028821524725158358036734514252
c2 = 42478690444030101869094906005321968598060849172551382502632480617775125215522908666432583017311390935937075283150967678500354031213909256982757457592610576392121713817693171520657833496635639026791597219755461854281419207606460025156812307819350960182028395013278964809309982264879773316952047848608898562420
'''

题目提供了两组 RSA 加密参数:

  • n1 = p * q1

  • n2 = p * q2

  • c1 = m^e mod n1

  • c2 = m^e mod n2

  • e = 65537

这里的关键漏洞是:两个不同的模数 n1 和 n2 共享了同一个素数 p。这是一种常见的 RSA 实现错误,会导致严重的安全问题。

攻击原理

数学基础

  1. 模数分解

    python 复制代码
    n1 = p * q1
    n2 = p * q2

    由于 n1 和 n2 共享素数 p,我们可以通过计算最大公约数(GCD)来恢复 p:

    python 复制代码
    p = gcd(n1, n2)
  2. 恢复其他参数

    python 复制代码
    q1 = n1 // p
    q2 = n2 // p
  3. 计算私钥

    欧拉函数:

    python 复制代码
    φ(n1) = (p-1) * (q1-1)
    φ(n2) = (p-1) * (q2-1)

    私钥指数:

    python 复制代码
    d1 = e^(-1) mod φ(n1)
    d2 = e^(-1) mod φ(n2)

完整代码

python 复制代码
# 导入我们需要的库
from Crypto.Util.number import *
import gmpy2

#已知
n1 = 63306931765261881888912008095340470978772999620205174857271016152744820165330787864800482852578992473814976781143226630412780924144266471891939661312715157811674817013479316983665960087664430205713509995750877665395721635625035356901765881750073584848176491668327836527294900831898083545883834181689919776769
n2 = 73890412251808619164803968217212494551414786402702497903464017254263780569629065810640215252722102084753519255771619560056118922616964068426636691565703046691711267156442562144139650728482437040380743352597966331370286795249123105338283013032779352474246753386108510685224781299865560425114568893879804036573
c1 = 11273036722994861938281568979042367628277071611591846129102291159440871997302324919023708593105900105417528793646809809850626919594099479505740175853342947734943586940152981298688146019253712344529086852083823837309492466840942593843720630113494974454498664328412122979195932862028821524725158358036734514252
c2 = 42478690444030101869094906005321968598060849172551382502632480617775125215522908666432583017311390935937075283150967678500354031213909256982757457592610576392121713817693171520657833496635639026791597219755461854281419207606460025156812307819350960182028395013278964809309982264879773316952047848608898562420
e = 65537

# 共享素数得到p
p = gmpy2.gcd(n1,n2)
print(p)
q1 = n1 // p
q2 = n2 // p

# 计算模n
phi1 = (p - 1)*(q1 - 1)
phi2 = (p - 1)*(q2 - 1)

# 计算私钥d
d1 = inverse(e,phi1)
d2 = inverse(e,phi2)

#计算密文m
m1 = long_to_bytes(pow(c1,d1,n1))
m2 = long_to_bytes(pow(c2,d2,c2))

#输出得到flag
print(m1)
print(m2)

最后flag为

LitCTF{c0mmunity_w1th_two_ciphert3xt}

总结

本题展示了 RSA 中一个经典漏洞:共享素数攻击。当不同的 RSA 模数共享同一个素数时,攻击者可以通过简单的 GCD 计算分解模数,从而完全破解加密系统。这种漏洞强调了在密码学实现中严格遵循安全实践的重要性

相关推荐
冷雨夜中漫步7 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
郝学胜-神的一滴7 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
百锦再7 小时前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
颜酱8 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_736919109 小时前
C++代码风格检查工具
开发语言·c++·算法
yugi9878389 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
喵手9 小时前
Python爬虫实战:旅游数据采集实战 - 携程&去哪儿酒店机票价格监控完整方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集结果csv导出·旅游数据采集·携程/去哪儿酒店机票价格监控
2501_944934739 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy9 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
DuHz9 小时前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理