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

相关推荐
地平线开发者5 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮6 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者6 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考6 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
孟健8 小时前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
HXhlx10 小时前
CART决策树基本原理
算法·机器学习
码路飞10 小时前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
Wect10 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱11 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
曲幽12 小时前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers