from Crypto.Util.number import * from math import log deff(x): return x*log(x)
arr=open("output.txt","r").readlines() s="" for y in arr: for i inrange(1,128): ifabs(f(i)-float(y))<0.0003: s+=chr(i) continue print(s) #0xGame{YouH4veKn0wedPy7honL081s<y=ln(x)>InM47hs}
n = 32366272889292879088882195998253721958216118427319043123590736165426820884306499725050727749537295796623781690886255268016096819542474814457437532341958464848643200659916387692563367270923362263462485626863278634698636219570995613163637857962196938268241034329466928075048970301826587646917598116612437415879221437295531628513384414258368369916946742389703355179727112580592683439416261547865491725025586248605272291584028774967553627942724579632389254496409849216841409604686980557654983994405692268823696566554514932549687234389560838939048535333918846662927374585386766723838290671937789073306966759191649325746073717288252462817952734597692830994622255635546908058581524477518532518924112976563197010192251929746445312969880127879576958492529042343256141675368594461418257288354657105617752796615735654975200326101463143024542800708390095145361 e = 906371 c = 15326438748659000169738486078886997781541935909035823368289334280968233481809714574428064879237827914760740438396085818400100752918474657858554388771724064383701395897618045276281398824434274848557653909089994244435972710632336639335300023667869547648881808002952139588112935030846125601449819192271492110196773991802015580978532663199706950910343070008368979693052990985227852719668245569238857908655227385682414319846321429428810022909530050444105837210601614933221417662986725539709495237298445020038006845869543594704774018595363714269915863872404761678621066244387220449270355482924374014811790125751689511923646410269665459941400645007655696532244986604521949477159649748754760874919743902307824198126893002486445262315126416725774433901321311453440889692050265638750239216391568288836776466397695369910655394827082589725264284100323144743368 f = 4071 * p + 7840 * q = 70609572383507708646716591625555712379946460153989879089689539734922903656784859764618771054881882855097217363252911229485210947514270593649999198018427595733868497208821457315913778178532267217419587556519640009047854707649751663514017094626487619210733938544175505589938842947647526503757953723232894419183885106501307587792888770406913619606926851412157084401688469130571174114717305950501097282446764439401475500746719477183
方法一:
有Sagemath的,录入4个已知数据后,可以直接利用以下的代码求解:
1 2
var('p q') solve([p * q == n, 4071 * p + 7840 * q == f],(p, q))
然后就可以解出:
1 2
p == 5083858928708691100777959116505887333680880438073587959441589817260857392095426280573595409516065652457557087257582498766032467943842309357363106558257787135298633883829312431320375735688577512605869266440855676882837431188700856046398782182742328211552394159944490832515415689088811946496781884336421281783780403089383634369539994631626195420357561861396522278697114564263369128050977173067291911354418900362132140587209993 q == 6366477383256967751970602048757684316904540292167385523826891274088514440505660634745365324329334130604911028192256744516414894198327621461246682553540834732916805952519429388776598030426539306581772164902923029140028510877621234508817302597008112380293895652938964720761299193541705748669586055114709614928841209888319746463583093400709614547276940953368857424121494354522321223778287994763284682566699629595310657706146377
defy(x): return7840*x*x-f*x+4071*n L, R = 2**1407, 2**1408 while L <= R: M = (L+R)//2 if y(M) < 0: L = M+1 if y(M) > 0: R = M-1 if y(M) == 0: print(M) break #6366477383256967751970602048757684316904540292167385523826891274088514440505660634745365324329334130604911028192256744516414894198327621461246682553540834732916805952519429388776598030426539306581772164902923029140028510877621234508817302597008112380293895652938964720761299193541705748669586055114709614928841209888319746463583093400709614547276940953368857424121494354522321223778287994763284682566699629595310657706146377
from Crypto.Util.number import * from pwn import * sh=remote("47.101.38.213",60709) u,detla=[],[] for i inrange(16): sh.recvuntil(b">") sh.sendline(b"1") sh.recvuntil(b">") sh.sendline(b"1") numb=sh.recvline(keepends=False) numb=numb.split(b"is")[1] u.append(int(numb)) for i inrange(12): detla.append(abs((u[i+2]-u[i+1])*(u[i+2]-u[i+1])-(u[i+3]-u[i+2])*(u[i+1]-u[i]))) p=detla[0] for i in detla: p=GCD(p,i) print(p) assert isPrime(p) a=(u[3]-u[2])*inverse(u[2]-u[1],p)%p b=(u[1]-a*u[0])%p print(a,b,p) x=u[-1] for i inrange(205): if i%15==0: print(i) x=(a*x+b)%p sh.recvuntil(b">") sh.sendline(b"1") sh.recvuntil(b">") sh.sendline(str(x).encode()) sh.recvuntil(b"0xGame{") flag=sh.recvline(keepends=False) print("0xGame{"+flag.decode()) sh.close()
#Sagemath from Crypto.Util.number import * from sage.allimport * from pwn import * sh = remote("47.101.38.213", 60710) states = [] for i inrange(90): sh.recvuntil(b">") sh.sendline(b"1") sh.recvuntil(b">") sh.sendline(b"1500000000") sh.recvuntil(b"is") states.append(int(sh.recvline(keepends=False))) M = [] for i inrange(45): M.append(states[i:i+45]) v = states[45:90] M = matrix(Zmod(1435756429), M) v = vector(Zmod(1435756429), v) mask = v*(M**(-1)) v, mask = list(v), list(mask) print(mask) for i inrange(601): s = 0 for j inrange(45): s += v[j]*mask[j] s %= 1435756429 print(i, s) v = v[1:]+[s] sh.recvuntil(b">") sh.sendline(b"1") sh.recvuntil(b">") sh.sendline(str(s).encode()) sh.interactive()
defInvMatrixWithModulus(_matrix, p): if (not isPrime(p)) or (len(_matrix) != len(_matrix[0])): raise ValueError("matrix must be a square and p must be a prime") l = len(_matrix) matrix = [[] for _ inrange(l)] for i inrange(l): for j inrange(l): matrix[i].append(_matrix[i][j]) for i inrange(l): matrix[i] = matrix[i]+[0for _ inrange(l)] matrix[i][l+i] = 1 for i inrange(l): inv = inverse(matrix[i][i], p) for j inrange(i, 2*l): matrix[i][j] = matrix[i][j]*inv % p for j inrange(i+1, l): timz = matrix[j][i] for k inrange(0, 2*l): matrix[j][k] = (matrix[j][k]-timz*matrix[i][k]) % p for i inrange(l): assert matrix[i][i] == 1 for i inrange(l-1, -1, -1): for j inrange(i-1, -1, -1): timz = matrix[j][i] for k inrange(i, 2*l): matrix[j][k] = (matrix[j][k]-timz*matrix[i][k]) % p J = [] for i in matrix: J.append(i[l:]) return J