黄河流域安全赛crypto

发布时间 2023-03-23 19:44:53作者: 原神高手

黄河流域安全赛crypto

EasyLock

已知5条同余方程,可以知道cs[0]*cs[1] - cs[4]和cs[0]^2-cs[2]的公因数为n

# from secret import flag
# from Crypto.Util.number import *

# m = bytes_to_long(flag)
# assert m.bit_length() == 47
# data = [2, 3, 4, 5, 6]
# cs = []
# p = getPrime(512)
# q = getPrime(512)
# n = p*q
# for i in data:
#     cs.append(pow(i, m, n))
# print(cs)
"""
[183098212086317720236828757315510192339273033804875740822801041376722387458993552796227899411901966324318366514880536763913315608412750265815750386810801443666072579873995967676472994916617708760086271155827496223499121301339946900578686321571238854410077055150282805741312173826325669295346629270100887114, 57033027040944100515577298747833062983449034346155581535109171399667991971614122726451624246276583123688811765412755210627513537740891720491136798691017567675611749056264437247135506921747135448387155606513983563110678466501221603978172670533058510913876368172674768929417846635764813733749021238273031358064, 44177513422937659688192503808032734159830361147993789424022745838993946766432456884886189398779755202878679629523667923807343226973440318127947558457476925179848208108399587026072741947465486816791306581859876197942191253278120326733144030253277598039138046967591357892542649422324554104602547660747339872074, 12631302718057472129138289484187738038805661685759196779990368768599115569927115234126312113575785471158626604808250556471019475882601443785660157133230999298014824293609691681149195181799904358979944719852988436666306120350671288382565369084160416022015445829639878167524217607450918100132212115997395372780, 42899381454706854217031716361682990989382003331688973566655317536112884234898037025883907894505663567670829738793956574655657437562098921910867502135260835097785409348930680677890714703165271668372795217905436049326872168290466249129739381681341323649536725632009485619857375114283009023943744880775769510652]
"""

from Crypto.Util.number import *
from gmpy2 import gcd
out = [183098212086317720236828757315510192339273033804875740822801041376722387458993552796227899411901966324318366514880536763913315608412750265815750386810801443666072579873995967676472994916617708760086271155827496223499121301339946900578686321571238854410077055150282805741312173826325669295346629270100887114, 57033027040944100515577298747833062983449034346155581535109171399667991971614122726451624246276583123688811765412755210627513537740891720491136798691017567675611749056264437247135506921747135448387155606513983563110678466501221603978172670533058510913876368172674768929417846635764813733749021238273031358064, 44177513422937659688192503808032734159830361147993789424022745838993946766432456884886189398779755202878679629523667923807343226973440318127947558457476925179848208108399587026072741947465486816791306581859876197942191253278120326733144030253277598039138046967591357892542649422324554104602547660747339872074, 12631302718057472129138289484187738038805661685759196779990368768599115569927115234126312113575785471158626604808250556471019475882601443785660157133230999298014824293609691681149195181799904358979944719852988436666306120350671288382565369084160416022015445829639878167524217607450918100132212115997395372780, 42899381454706854217031716361682990989382003331688973566655317536112884234898037025883907894505663567670829738793956574655657437562098921910867502135260835097785409348930680677890714703165271668372795217905436049326872168290466249129739381681341323649536725632009485619857375114283009023943744880775769510652]
n = gcd(out[0]*out[1]-out[4],out[0]**2-out[2])//2
x = discrete_log_lambda(mod(out[3],n),mod(5,n),(ZZ(10**14),ZZ(10**15)))
m = 128030494236961
print(long_to_bytes(x))

#flag{tql!!!}

Euler

已知e,d,n,求解p,已知n2是由若干个20位素数的乘积。sagemath直接求phi。

# import gmpy2
# from secret import flag
# from Crypto.Util.number import *
# import random
#
#
# p = getPrime(1024)
# q = getPrime(1024)
# e = 65537
# d = inverse(e, (p-1)*(q-1))
# n1 = p*q
# print('d =', d)
# print('n1 =', n1)
#
#
# n2 = 1
# while True:
#     tmp = getPrime(20)
#     for i in range(random.randint(1, 10)):
#         n2 *= tmp
#     if int(n2).bit_length() > 4096:
#         break
# m = bytes_to_long(flag)
# e = p
# c = pow(m,p,n2)
# print(f"n2 = {n2}")
# print(f"c = {c}")

'''
d = 1191103734504058491421349604548564929848616842152689496895544381837156883533438743584190765148552934760581271144506002162145850044043706855922892271482076871873995241085136144968243140990856473896170280564822732549232192446031619309897442553542363254504471740017966570662964696395047018142115398837264339359703632345253800336497946214283448557066829445107164480953216959246058743836325220516737638124436265379246043689904351250933647836622874758885644860021461954464385862680106712884194095768373281466098064819110033091294767089010003022970009602841916377292236136049332199074587736162893766795170383769105855396481
n1 = 13580613334758608446812976519363134969987613428002924766535019511562587104406919787452524386837284913953412450765046949147625708826808005604839699164252065405707381022094044455947068672776228380259796742758661695038105462132145830673755861626914728707456430832560451486001864528121467715375751025330165798298234749333641286199156268444951660172758198564829589895780644285230824166251980165312273600373379395893191960302458674257328572576250700441136204817923980559222287090491322038600230306017349810608247758292597409739448697047571469597942133677889648017239246044193456551115423543297398389835141582226233401091651
n2 = 1214806402018035399640161601350276689119300500885922730338627878893519991129980125476434307328318616551645952775278810103829168554249376991124646974529506458637833256309925386195767085673143119319959502919427611337245914269082657148902705137556296048781578971739222821624583120801659535369927877985173236243714461317935517361255270715241189816284530991305321818355420570545833978683123138276923580243415962479127687019106264574314649544746346086459905012212977958967691480715239783822121874583716717022133331534258680100103894980839994381411182849477289831563331555051111524494710894174250831042393260657010039224282544484051247017811298503920278914985702602401902771910416165113998593372720867385848641975504106450347785422029536444684536992419844582901814455572310411304170053743720539065216022165732393062765647406642461667856590659949987014165020908912248704605394194332522772838334355686250772722614893659631917281850223784937395431499960460631775969046704990152101465734651932493302101064276553602695086721483441047849063689763309160624353722539937307711289340553305706186969043326282042780389837191270199164643251358171042535614702470861637110776902483824241373428279843481575953477705679020507998934443944753893015492521729164439
c = 829714996515560908603942343505920996556339059436557287421074174277687809974667533248085244071086827486112801279665776466949992570288124598686592774771062800764512333540404127622921352174419248968970404794754685847236748961563984628001223295272803310968932487079932521884266677193760840062257399310444131681778575116034804962240312440452076927109544707668525304555494031530153484385014733733295665648179563341929829366393842180933029552234342383165468329118358481709562138556464490952636983157762226775051069620144327191146321078089031134997806488306619954921967209307290224398561337468466377749200533482249418692505335754212596152956893594720809675348504752525191974229476876972508737538861376367290460994163758533707257433535992369795872961693633915923559165304176024241693969803856234404053572424185908635089962296448104233424369921110004610276316317120909034370571217382030431552784144041430129071509829206755292634358474170376986660230213480604735611696589811824530116203051420922042313844629631979060959674508082246111229472102010511440894011705450255517464228219748967389876595425302704439665665510611452129328353818804395006155136491014104673084625985358676817967767734690717397046423097222254342558118886724303282396865112622135
'''

from Crypto.Util.number import *
import gmpy2
import random
e = 65537
d = 1191103734504058491421349604548564929848616842152689496895544381837156883533438743584190765148552934760581271144506002162145850044043706855922892271482076871873995241085136144968243140990856473896170280564822732549232192446031619309897442553542363254504471740017966570662964696395047018142115398837264339359703632345253800336497946214283448557066829445107164480953216959246058743836325220516737638124436265379246043689904351250933647836622874758885644860021461954464385862680106712884194095768373281466098064819110033091294767089010003022970009602841916377292236136049332199074587736162893766795170383769105855396481
n1 = 13580613334758608446812976519363134969987613428002924766535019511562587104406919787452524386837284913953412450765046949147625708826808005604839699164252065405707381022094044455947068672776228380259796742758661695038105462132145830673755861626914728707456430832560451486001864528121467715375751025330165798298234749333641286199156268444951660172758198564829589895780644285230824166251980165312273600373379395893191960302458674257328572576250700441136204817923980559222287090491322038600230306017349810608247758292597409739448697047571469597942133677889648017239246044193456551115423543297398389835141582226233401091651
n2 = 1214806402018035399640161601350276689119300500885922730338627878893519991129980125476434307328318616551645952775278810103829168554249376991124646974529506458637833256309925386195767085673143119319959502919427611337245914269082657148902705137556296048781578971739222821624583120801659535369927877985173236243714461317935517361255270715241189816284530991305321818355420570545833978683123138276923580243415962479127687019106264574314649544746346086459905012212977958967691480715239783822121874583716717022133331534258680100103894980839994381411182849477289831563331555051111524494710894174250831042393260657010039224282544484051247017811298503920278914985702602401902771910416165113998593372720867385848641975504106450347785422029536444684536992419844582901814455572310411304170053743720539065216022165732393062765647406642461667856590659949987014165020908912248704605394194332522772838334355686250772722614893659631917281850223784937395431499960460631775969046704990152101465734651932493302101064276553602695086721483441047849063689763309160624353722539937307711289340553305706186969043326282042780389837191270199164643251358171042535614702470861637110776902483824241373428279843481575953477705679020507998934443944753893015492521729164439
c = 829714996515560908603942343505920996556339059436557287421074174277687809974667533248085244071086827486112801279665776466949992570288124598686592774771062800764512333540404127622921352174419248968970404794754685847236748961563984628001223295272803310968932487079932521884266677193760840062257399310444131681778575116034804962240312440452076927109544707668525304555494031530153484385014733733295665648179563341929829366393842180933029552234342383165468329118358481709562138556464490952636983157762226775051069620144327191146321078089031134997806488306619954921967209307290224398561337468466377749200533482249418692505335754212596152956893594720809675348504752525191974229476876972508737538861376367290460994163758533707257433535992369795872961693633915923559165304176024241693969803856234404053572424185908635089962296448104233424369921110004610276316317120909034370571217382030431552784144041430129071509829206755292634358474170376986660230213480604735611696589811824530116203051420922042313844629631979060959674508082246111229472102010511440894011705450255517464228219748967389876595425302704439665665510611452129328353818804395006155136491014104673084625985358676817967767734690717397046423097222254342558118886724303282396865112622135

def divide_pq(e, d, n):
    k = e*d - 1
    while True:
        g = random.randint(2, n-1)
        t = k
        while True:
            if t % 2 != 0:
                break
            t //= 2
            x = pow(g, t, n)
            if x > 1 and gmpy2.gcd(x-1, n) > 1:
                p = gmpy2.gcd(x-1, n)
                return (p, n//p)

print(divide_pq(e,d,n1))

p = 99535697627541341494991404525180225068908389009029184307762183080720509676180574747934699539744131740583328547717197725197244553215416318028060890705319720045333080998666666221215218686863117303855204744956995545323160724989858236294798184029665332667306731766805975383738940541903481796682297902022496857107
q = n1//p
assert p*q==n1
#sagemath
# print(euler_phi(n2))
phi = 1214743481055418306674923200796837849615523895805543401563759441369343246118986522204311782627678716735076110083488503580291663049622957099674758845000715801331942570563583897748699601876002641512060842959555705944501143148910130554162959388048040519212869978015378597751985356834049556209550624803841207570298137642737395857984101829899978082337057857851112051968930682389636757671781188465691613675153087916911702205401423785475317890541124122086193454983600707787721998113793577979620577534898476900366607144472687183559977045417785928777071198074532579953848782837625343089157820802397678629539368017420537358474076916977809019956158233109058088152632979224345823012868649626822767425736075848093432971228559978734407656071616529172930332880242355377055280321843657698442962249947931867596413331377345743610843716049422485692344992871672279724286939871715214951256915775082201853930411386879306158014821927205845422929099823080947813039889976335554214197065783103831846853692180491580588714471379369769063217267315939921831182591988952743008462760971079264723125493011347321949473298447302260784186208600655746138322458842852759438621930457567141570663852697055384547104514666694053628267784608047228186045453362925876019200000000000
d = inverse(q,phi)
print(gmpy2.gcd(e,phi))
print(long_to_bytes(pow(c,d,n2)))
#flag{09d9cf63-4ccc-4615-8a40-577e1152d2b3}

EasyNumber

已知两条同余方程

再在式1 两边模上kB,得到新的同余方程,coppersmith求解。

Sage
from Crypto.Util.number import *

A = 170552035590584371794277768762390230763544207477112166060533204313753004629936685595405184205281232276007015670211368033442806936779308867580378436822021847321737051586882192693878924902157737728943995367527577690099125847661701232120507334675776645787433344767625337798357285176902699598449086385213291366162
leak = 66573767005779268080495621179078972426265588843146030764009851250207246081886465887129685885427908408673076322868864723505267053962926489662364269721110570269848306490343161117767892544708463436083630857549295570803296389232068947551581525974801496469745646172924950992026908012083467414933570463776905332979

# A+2023*m-2022 = 0 % B
KB = pow(2,2023)-leak
PR.<m> = PolynomialRing(Zmod(KB))
f = A+2023*m-2022
f = f.monic()
x = f.small_roots(X=2^200, beta=0.4)
print(long_to_bytes(int(x[0])))
# flag{unknown_modulus}