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 计算分解模数,从而完全破解加密系统。这种漏洞强调了在密码学实现中严格遵循安全实践的重要性

相关推荐
bIo7lyA8v8 小时前
算法稳定性分析中的输入扰动建模的技术9
算法
炸炸鱼.8 小时前
Python 操作 MySQL 数据库
android·数据库·python·adb
CoderCodingNo8 小时前
【GESP】C++三级真题 luogu-B4499, [GESP202603 三级] 二进制回文串
数据结构·c++·算法
sinat_286945198 小时前
AI Coding 时代的 TDD:从理念到工程落地
人工智能·深度学习·算法·tdd
ASKED_20198 小时前
从排序到生成:腾讯广告算法大赛 2025 baseline解读
人工智能·算法
田梓燊8 小时前
leetcode 160
算法·leetcode·职场和发展
_深海凉_8 小时前
LeetCode热题100-颜色分类
python·算法·leetcode
cmpxr_8 小时前
【C】局部变量和全局变量及同名情况
c语言·开发语言
AC赳赳老秦9 小时前
OpenClaw email技能:批量发送邮件、自动回复,高效处理工作邮件
运维·人工智能·python·django·自动化·deepseek·openclaw
zhaoshuzhaoshu9 小时前
Python 语法之数据结构详细解析
python