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

相关推荐
清酒难咽1 天前
算法案例之递归
c++·经验分享·算法
Rabbit_QL1 天前
【水印添加工具】从零设计一个工程级 Python 图片水印工具:WaterMask 架构与实现
开发语言·python
天“码”行空1 天前
简化Lambda——方法引用
java·开发语言
让我上个超影吧1 天前
【力扣26&80】删除有序数组中的重复项
算法·leetcode
z20348315201 天前
C++对象布局
开发语言·c++
Beginner x_u1 天前
如何解释JavaScript 中 this 的值?
开发语言·前端·javascript·this 指针
java1234_小锋1 天前
Java线程之间是如何通信的?
java·开发语言
张张努力变强1 天前
C++ Date日期类的设计与实现全解析
java·开发语言·c++·算法
沉默-_-1 天前
力扣hot100滑动窗口(C++)
数据结构·c++·学习·算法·滑动窗口
钱彬 (Qian Bin)1 天前
项目实践19—全球证件智能识别系统(优化检索算法:从MobileNet转EfficientNet)
算法·全球证件识别