金融密码杯 The Art of War
题目
n1 = 10701477790084498989413533650561239395023844887644043402387997310580104611016132026459880612664097865046773793250706602418730116731694537504307568711653515438359007916940042491867334336248954653419039695865131324606127958573172580407126361853427242419771815472375053460650918984699560092415380807138590525353950139997385964802197155269197629450868739092880295705955306914462783835944991448947941271049805125298281211773928312408654255254587819580318811900089953250160924501610055484006593572069514047906235437359858075651123563864799048912682798190470437822327582638831737963821357247588537734292877974007121427367961
n2 = 26096834714914821312897565285686544303470590098305010000699237540576921278424197577817115433214305181622765272782306435942542884331975980878867468337006073665666470331515741489870987500881392613818917044112707748305184313033084867211563294179285080289578433333062521447250484846746116563352091188260016503263340001326262578976048256327461539265649629775320490275600783172165897411177117006403395837047903934777758417197809122729131550807270313626027818497072016495585778799284106046206841965584736753748390861768198330144109008058230539884779723842375965489145918990902621430912755566752661425233182006350065500605651
n3 = 13355953971767957445996241641199024588197369087921438691995673666107664158669025830052723923044639623251339177797065163044233831487146683987017992960645051362539939780685117564321664666717787952029541663705087026094722562196963267703423602203906689936551239741585902270254104769009554334533342083402301435510979542238984329867464428486142191998672474935540731243639400950666572726209206973557503072744521054555004018006853174675899262612646472797614684552211840199866686919664949673710849737600172696550595222442541414537507497930244676158047693825938709200830378594857045555886085261620058675729967274138908496040609
c1 = 9346975241740794835082437345141412761578210069410936603841112821138700067492625101256885444872639323198785002342546162634228810682653346044396571355291008711409246757463440621616101977311504519661517014547389297691635870062316769585638418550337023869899881536550320199077581939777993864871824223035058360970225861449375431178467249043111638995169925534502033431587471423971871016343630882274792770406249433070420085582084877973357095370678058782995968442796690845562260821615564144108752593824658937576500609814031601405781037335980641263144335547971654202995028794931656610126936379072884681332394397238982715294042
c2 = 25858569076696293272858288772802119642638601211367320460744463639746968960470821612631592096138719791263538096832076485291041175557068452804323551517265605174078543867683498922996993265955468368195686770575721950588502481962663160297613566760006448646218347688332284249979683100894672092167539936395294045998768084164940977166031673436851732889445737800820050739583396895511634304328187527173682675849918085244923298401771162474994011185120752311840846792529989223096464375307380091082326889220310109498490049899407015672408356573965199415807770478689208480142340483049344849407234265265721381057726039925510181041078
c3 = 3315717807038438227823719711411060594292161365963539225186453556090497026239526298466849500284906400061879297707675692825116796434140358439874431337532622988513648461926320080652127601627926694853380760656512170461948093613933980731952619002653193664480600847721383680412150275132715024886188493461575677722090679152683779248832452742199908155428051035007775424233605005243530361724023258086288584674278761227202296467456083771348131169033960158380938657754764236283215931702037558315531942498970253315138116407917022885585820322285844401189804619670908195042281023634323988005961890486964473202296135439836065632096
分析与求解
- 题目给了多组n,c的值,根据RSA相关知识点,可以通过中国剩余定理或者找n之间的最大公因数,经尝试是前者。
- 参考中的解法类似。只不过e的值需要进行遍历,在字节流中找到包含ctf或者flag的那一条并输出即可。
- 另外遍历时,有的e会不满足条件而报错,需要添加异常处理。
from Crypto.Util.number import *
from gmpy2 import *
from functools import reduce
n1 = 10701477790084498989413533650561239395023844887644043402387997310580104611016132026459880612664097865046773793250706602418730116731694537504307568711653515438359007916940042491867334336248954653419039695865131324606127958573172580407126361853427242419771815472375053460650918984699560092415380807138590525353950139997385964802197155269197629450868739092880295705955306914462783835944991448947941271049805125298281211773928312408654255254587819580318811900089953250160924501610055484006593572069514047906235437359858075651123563864799048912682798190470437822327582638831737963821357247588537734292877974007121427367961
n2 = 26096834714914821312897565285686544303470590098305010000699237540576921278424197577817115433214305181622765272782306435942542884331975980878867468337006073665666470331515741489870987500881392613818917044112707748305184313033084867211563294179285080289578433333062521447250484846746116563352091188260016503263340001326262578976048256327461539265649629775320490275600783172165897411177117006403395837047903934777758417197809122729131550807270313626027818497072016495585778799284106046206841965584736753748390861768198330144109008058230539884779723842375965489145918990902621430912755566752661425233182006350065500605651
n3 = 13355953971767957445996241641199024588197369087921438691995673666107664158669025830052723923044639623251339177797065163044233831487146683987017992960645051362539939780685117564321664666717787952029541663705087026094722562196963267703423602203906689936551239741585902270254104769009554334533342083402301435510979542238984329867464428486142191998672474935540731243639400950666572726209206973557503072744521054555004018006853174675899262612646472797614684552211840199866686919664949673710849737600172696550595222442541414537507497930244676158047693825938709200830378594857045555886085261620058675729967274138908496040609
c1 = 9346975241740794835082437345141412761578210069410936603841112821138700067492625101256885444872639323198785002342546162634228810682653346044396571355291008711409246757463440621616101977311504519661517014547389297691635870062316769585638418550337023869899881536550320199077581939777993864871824223035058360970225861449375431178467249043111638995169925534502033431587471423971871016343630882274792770406249433070420085582084877973357095370678058782995968442796690845562260821615564144108752593824658937576500609814031601405781037335980641263144335547971654202995028794931656610126936379072884681332394397238982715294042
c2 = 25858569076696293272858288772802119642638601211367320460744463639746968960470821612631592096138719791263538096832076485291041175557068452804323551517265605174078543867683498922996993265955468368195686770575721950588502481962663160297613566760006448646218347688332284249979683100894672092167539936395294045998768084164940977166031673436851732889445737800820050739583396895511634304328187527173682675849918085244923298401771162474994011185120752311840846792529989223096464375307380091082326889220310109498490049899407015672408356573965199415807770478689208480142340483049344849407234265265721381057726039925510181041078
c3 = 3315717807038438227823719711411060594292161365963539225186453556090497026239526298466849500284906400061879297707675692825116796434140358439874431337532622988513648461926320080652127601627926694853380760656512170461948093613933980731952619002653193664480600847721383680412150275132715024886188493461575677722090679152683779248832452742199908155428051035007775424233605005243530361724023258086288584674278761227202296467456083771348131169033960158380938657754764236283215931702037558315531942498970253315138116407917022885585820322285844401189804619670908195042281023634323988005961890486964473202296135439836065632096
N = []
c = []
for i in range(3):
N.append(eval('n' + str(i + 1)))
c.append(eval('c' + str(i + 1)))
def chinese_remainder(modulus, remainders):
Sum = 0
prod = reduce(lambda a, b: a * b, modulus)
for m_i, r_i in zip(modulus, remainders):
p = prod // m_i
Sum += r_i * (inverse(p, m_i) * p)
return Sum % prod
pow_m_e = chinese_remainder(N, c)
for e in range(65537):
try:
m = iroot(pow_m_e, e)[0]
f = str(long_to_bytes(m))
if 'ctf' in f or 'flag' in f:
print(f)
except ValueError:
continue
flag