朝花夕拾(四)“华为杯”第一届中国研究生网络安全创新大赛
备战2023第二届。
breakme
out = []
from Crypto.Util.number import *
def Function(n,r,c):
P.<m> = PolynomialRing(Zmod(n))
k = bytes_to_long(b'flag{') * 2^(58 * 8) + m
f = k^4 + 3*k^2 + r*k - c
return f
fs = []
ns = []
for i in out:
ns.append(i[0])
print(i[0].nbits())
ff = Function(i[0],i[1],i[2]).monic().change_ring(ZZ)
fs.append(ff)
F = crt(fs,ns)
#print(F)
N = prod(ns)
print(N.nbits())
FF = F.change_ring(Zmod(N))
roots = FF.small_roots(X=2^464,epsilon = 0.03)
print(roots)
print(long_to_bytes(int(roots[0])))
ezdlp
from Crypto.Util.number import *
p = 101202160159081561029549739902097099275439197324107563340103725793005952286427
a = 77352628233208904456190113484930965015529164818065903310716894212030514274681
g = 60481606253840272416608492349866939317114665311741132450767745324720776050313
with open('output.txt', 'r') as f:
data = f.readlines()
G = eval(data[0])
Q = eval(data[1])
leak = eval(data[2])
Qpp = Qp(p, prec=666)
s2 = (Qpp(leak).log() / Qpp(g).log()).lift()
print(long_to_bytes(s2))
b = (G[1]^2 - G[0]^3 - a*G[0]) % p^5
Fp5 = Zmod(p^5)
E = EllipticCurve(Fp5, [a, b])
p_ord = E.change_ring(GF(p)).order()
EQp = E.change_ring(Qp(p))
QpG = EQp(G) * p_ord
QpQ = EQp(Q) * p_ord
phiG = -QpG[0] / QpG[1]
phiQ = -QpQ[0] / QpQ[1]
s1 = ZZ(phiQ / phiG)
print(long_to_bytes(s1))
magic_ecc
from Crypto.Util.number import *
from tqdm import *
n = [7834852404690613421430169663612203646364286385985089874202019066309609197617451690988793560462179054987116479700769830549608039683656465594954511680417439827884682514137395099618980184523220683344996556134367140942117294093697944691881733841814807163442986266436501188979024846961439278137438956993286762327, 56294620872968718380397963653042708970679997991074373308327166468889019728428695832974471693865711660199765275543574607777072876711036238547682259596299830777636017508061107901637637285281716996357267778844219142268259492772365960388947511378141363201796810931407918179374553857261098454741363722931008506489, 129957982988172364798440102561140523140644973971267372222458834449933213209554347296288675182049584297578956734950355730140774286965046426714693180361079049463593214844598178841579717839460125946223610814809560801920675773424029429584993267487434123215947150197664528709696606034737478716163854006621716785991, 9066055260883591502053070869551945047692654206920946891326048741423436599435774484763722715368827203845612354403468594494511688795068051140777669329826790833884137019297335832118519149000495203691914082887641717032244953119788416874814325467577437200429867014461247963978079935867875238778711836684201288629]
a = [7048154001918995017477365250721440939846406590540353416820154008187139217962602433154255479524221017573932812808705559493957586212577760267599598714536291727239485215656286274781121306887482105659998955359830778419337539924176135760285232988635633360704580265662170937825877189245474738393021110026742102153, 31321627825577613037613808260049947007597426398894543343295026929881402452208952913568802715190246106852599964881281443228975390464866025563219146668773014384534545192472026458279658043212752646582216269356048760074676973727755420979369317926774191804078299545532996426124351002568625497764155513252011538383, 100376678530410393440129444794028270589837686585546722960835863526622361668168592119632678982588964433092332436582055706812912246068983186060549127456588081281709747489416102968621180956752592139190805283441881388281289967907267811700783042913976898959346128092682283410576618008749415379182268334407914148254, 6943832903409991642828570302536131525128645753930793106382906368952726384077421186255403537931046135925451476048548017535373288933816332713598232518007018014021815609935851599706943287432440225704733070091400716880400394526448257123585228314673632971354933209639455109919401694778978191398135174777533045403]
b = [4272068648071168554128636586350467405009694241694262836849423155558524145309230653833900842480890062328504409347247873131227928999434917761846296010735220794539754754709781832591462658606731823437811260960368913997315971957378706774967707190047218973326733836134154328499864695789950910713523349012474450864, 11929895073032022513957831520065553727240314640963946035392521145067403043568103057789780858770584336171401618656230002952248952501656323696171128964091972452983219532076399819635525501541575635759478775528763593811199873333060757002721704633920964694387555113420556152094378726220099897441805429281932182249, 103479492760868255868822251568430728660153846040468623291049762149835619268304116069175027462824325373424329188452060129997748026322908351085116208712488124073324734412873332262218458728286795171892582854096835272404670621882642310331656668706237434350806299564270634718815297722496881546541557249523300668419, 7649214589736145661339350025603766052029302867406177205198200412263344904792642202923484806907193137271787655081123837667924783972976687435768372148142019805960085696461852811862193410065098094960702563602088132165333080687485869630334541488910322456467515098185301836641936447884084214487374441279192233849]
y = [4806088655232032640131815968035322182275006692259183095737832095267524825650586709163929120708376642687256768447965710629080349200588181928595678047040880789724971817059358396163096713153272213427522822058891798994246279675546478741928529988967946204452767371906673286827596885891268683555890521866220464996, 36427308113569747526874637238611956674658176451423982942908576371079856193061929116763841738289478269762767309956202920564091203721624520590467722449528903731839566008139942787078693680673776528179554827688651298887826999553050429188191123121557929147839173277183786286467590000199719564184235204795732718072, 22671172019607699010808242481239740857130309731255435371908887956593421434992512079790234625706350568447858868609783480724200167840452748080516811720426420974312708628131116060025172282266118472961472876873141994049733918908550242475246834408823242506072794063563809180873166212417405862218538966602792514167, 644361727747632626598826890581163999609668835723437298040290901674278545143549378125708738964569230174723374335762192451734784904542916232268939865691930798231529455733298867239440319451124463937678028231210599360468666533601195511935168705936295829890653739823139986804039319543460282204539256406399080821]
def F_(n,a,b,y,i):
P.<x> = PolynomialRing(Zmod(n))
f = y^2 - (x+x0+i)^3 -a*(x+x0+i) - b
return f
x0 = bytes_to_long(b'flag{' + b'\x00'*123)
N = prod(n)
print('brute force')
time = 5
for i1 in tqdm(range(10)):
for i2 in range(10):
for i3 in range(10):
for i4 in range(10):
f1 = F_(n[0],a[0],b[0],y[0],i1).monic().change_ring(ZZ)
f2 = F_(n[1],a[1],b[1],y[1],i1+i2).monic().change_ring(ZZ)
f3 = F_(n[2],a[2],b[2],y[2],i1+i2+i3).monic().change_ring(ZZ)
f4 = F_(n[3],a[3],b[3],y[3],i1+i2+i3+i4).monic().change_ring(ZZ)
fs = [f1,f2,f3,f4]
F = crt(fs,n)
FF = F.change_ring(Zmod(N))
roots = FF.small_roots(X=2**984)
if len(roots) != 0:
print(roots)
print(long_to_bytes(ZZ(roots[0])))
exit()