
题目:
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 实现错误,会导致严重的安全问题。
攻击原理
数学基础
-
模数分解:
pythonn1 = p * q1 n2 = p * q2由于 n1 和 n2 共享素数 p,我们可以通过计算最大公约数(GCD)来恢复 p:
pythonp = gcd(n1, n2) -
恢复其他参数:
pythonq1 = n1 // p q2 = n2 // p -
计算私钥 :
欧拉函数:
pythonφ(n1) = (p-1) * (q1-1) φ(n2) = (p-1) * (q2-1)私钥指数:
pythond1 = 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 计算分解模数,从而完全破解加密系统。这种漏洞强调了在密码学实现中严格遵循安全实践的重要性