''' p = 170990541130074930801165526479429022133700799973347532191727614846803741888876816210632483231997413973919037199883422312436314365293577997262903161076615619596783971730864586404602951191341733308807254112018161897113881363794353050758324742415299277578203838160939521046655099610387485947145087271531951477031 h = 19027613518333504891337723135627869008620752060390603647368919831595397216728378486716291001290575802095059192000315493444659485043387076261350378464749849058547797538347059869865169867814094180939070464336693973680444770599657132264558273692580535803622882040948521678860110391309880528478220088107038861065 c = 75639016590286995205676932417759002029770539425113355588948888258962338419567264292295302442895077764630601149285564849867773180066274580635377957966186472159256462169691456995594496690536094824570820527164224000505303071962872595619159691416247971024761571538057932032549611221598273371855762399417419551483 '''
from Crypto.Util.number import * import random from gmpy2 import *
flag = bytes_to_long(b'******') flag = bin(flag)[2:] n = len(flag)
a = [random.randint(1, 4**n)] s = a[0] for i inrange(1, n): a.append(random.randint(s+1, 4**(n+i))) s += a[i]
m = random.randint(a[-1] + 1, 2*a[-1]) w = random.randint(1, m)
assert gcd(w, m) == 1 b = [w*i % m for i in a]
c = 0 for i inrange(len(b)): c = (c + b[i]*int(flag[i])) withopen('output', 'w+') as f: print(f'b = {b}', file=f) print(f'c = {c}', file=f) #输出数据比较长,不贴了
解题思路
考虑构造格:
我们发现是格中的一个格点,因为
task.sage
b= c=
n=len(b) L=Matrix(ZZ,n+1,n+1)
for i inrange(n): L[i,i]=1 L[i,-1]=b[i]
L[-1,-1]=-c
res=L.LLL()
for i inrange(n + 1): M = res.row(i).list() flag = True for m in M: if m != 0and m != 1: flag = False break if flag: print(i, M)
''' c = 78168998533427639204842155877581577797354503479929547596593341570371249960925614073689003464816147666662937166442652068942931518685068382940712171137636333670133426565340852055387100597883633466292241406019919037053324433086548680586265243208526469135810446004349904985765547633536396188822210185259239807712 a = 134812492661960841508904741709490501744478747431860442812349873283670029478557996515894514952323891966807395438595833662645026902457124893765483848187664404810892289353889878515048084718565523356944401254704006179297186883488636493997227870769852726117603572452948662628907410024781493099700499334357552050587 b = 1522865915656883867403482317171460381324798227298365523650851184567802496240011768078593938858595296724393891397782658816647243489780661999411811900439319821784266117539188498407648397194849631941074737391852399318951669593881907935220986282638388656503090963153968254244131928887025800088609341714974103921219202972691321661198135553928411002184780139571149772037283749086504201758438589417378336940732926352806256093865255824803202598635567105242590697162972609 '''
解题思路
因为
所以
考虑格
exp.sage
from Crypto.Util.number import * from tqdm import tqdm
c=78168998533427639204842155877581577797354503479929547596593341570371249960925614073689003464816147666662937166442652068942931518685068382940712171137636333670133426565340852055387100597883633466292241406019919037053324433086548680586265243208526469135810446004349904985765547633536396188822210185259239807712 a=134812492661960841508904741709490501744478747431860442812349873283670029478557996515894514952323891966807395438595833662645026902457124893765483848187664404810892289353889878515048084718565523356944401254704006179297186883488636493997227870769852726117603572452948662628907410024781493099700499334357552050587 b=1522865915656883867403482317171460381324798227298365523650851184567802496240011768078593938858595296724393891397782658816647243489780661999411811900439319821784266117539188498407648397194849631941074737391852399318951669593881907935220986282638388656503090963153968254244131928887025800088609341714974103921219202972691321661198135553928411002184780139571149772037283749086504201758438589417378336940732926352806256093865255824803202598635567105242590697162972609 L = Matrix(ZZ, [[1, a], [0, b]])
p, q = L.LLL()[0] p, q = abs(p), abs(q)
for r in tqdm(range(2**14, 2**15)): for h inrange(50): pp = p+r qq = q+h phi = (pp-1)*(qq-1) if gcd(phi, 65537) != 1: continue m = power_mod(c, inverse_mod(65537, phi), pp*qq) ifb'NSSCTF'in long_to_bytes(m): print(long_to_bytes(m)) exit(0)
''' a = 92716521851427599147343828266552451834533034815416003395170301819889384044273026852184291232938197215198124164263722270347104189412921224361134013717269051168246275213624264313794650441268405062046423740836145678559969020294978939553573428334198212792931759368218132978344815862506799287082760307048309578592 b = 155530728639099361922541063573602659584927544589739208888076194504495146661257751801481540924821292656785953391450218803112838556107960071792826902126414012831375547340056667753587086997958522683688746248661290255381342148052513971774612583235459904652002495564523557637169529882928308821019659377248151898663 p = 100910862834849216140965884888425432690937357792742349763319405418823395997406883138893618605587754336982681610768197845792843123785451070312818388494074168909379627989079148880913190854232917854414913847526564520719350308494462584771237445179797367179905414074344416047541423116739621805238556845903951985783 '''
flag = b'******' flag = bytes_to_long(flag) d = getPrime(400)
for i inrange(4): p = getPrime(512) q = getPrime(512) n = p * q e = inverse(d, (p-1)*(q-1)) c = pow(flag, e, n) print(f'e{i} =', e) print(f'n{i} =', n) print(f'c{i} =', c)
p = getPrime(512) q = getPrime(512) n = p * q c = pow(flag, 65537, n) print(f'n =', n) print(f'c =', c) for i inrange(2): d = getPrime(350) e = inverse(d, (p-1)*(q-1)) print(f'e{i} =', e)
''' n = 110697784133988071803253124431092603234028687101567047811203431433689306543322837414808117411806181193598553341878079973980865551938790090419082150555675782822484149943421418447579383449269148197087985041351210982545320569973241390962326458234562044133505940521052500278777242988196544039226173227204865907343 c = 3281096209929505523196793672137624804022934270452947405454462490250571524417033484978613243658208567511735641542935158434165363547355697159503378251318054879687577130170122911449101189974762808655638497967674004219512386442280269940950792767174561412932638740423542930763914255112354969122157915514816022159 e0 = 28562806554366667733480283991307446762365777397933141571728113235368201162305126722188842319240464207580134816039095093401651171977877327756351539588974913736802534970867173212883308325913939353140276201705478124488858328502643345172188729914731042179091733244225184522680724392375975935305371163502863968963 e1 = 28572469216883232254074869113744730984165641173439644880182528671699871929340616919028955398474678696802739685594548793470261306125219888911330937557582939811068530294470712859439149735950996866732508004061234613146407591546995439312326450834903885979660916965052092661398640105827442036234500556755520316031 '''