from Crypto.Util.number import * p = 501785758961383005891491265699612686883993041794260611346802080899615437298977076093878384543577171 c = 327005346153237517234971706274055111857447948791422192829214537757745905845319188257204611848165263 t=bytes_to_long(b"NSSCTF{" + bytes([0x30]*70) + b"}") c=(c-t)*pow(256,p-2,p)%p
M=[[i==j for j inrange(72)]for i inrange(72)] M[-1][-1]=p M[-2][-1]=-c for i inrange(70): M[i][-1]=pow(256,69-i,p) Mb=diagonal_matrix([1]*71+[2**400]) M=matrix(ZZ,M) M3L=(M*Mb).BKZ()
for vec in M3L: if(vec[-2] in [1,-1] and vec[-1]==0): if(all([abs(i)<9for i in vec[:-2]])): s=''.join([str(i) for i in vec[:-2]]) print('NSSCTF{'+s+'}') break #NSSCTF{5036541772751046406531362142757356307107252723754051320011253505562041}
from Crypto.Util.number import * from random import *
table = "01234567" p = getPrime(328) flag = b"NSSCTF{" + "".join([choice(table) for i inrange(80)]).encode() + b"}" c = bytes_to_long(flag) % p
print("p =",p) print("c =",c) print(flag)
''' p = 324556397741108806830285502585098109678766437252172614832253074632331911859471735318636292671562523 c = 141624663734155235543198856069652171779130720945875442624943917912062658275440028763836569215230250 '''
from Crypto.Util.number import * p = 324556397741108806830285502585098109678766437252172614832253074632331911859471735318636292671562523 c = 141624663734155235543198856069652171779130720945875442624943917912062658275440028763836569215230250 t=bytes_to_long(b"NSSCTF{" + bytes([0x34]*80) + b"}") c=(c-t)*pow(256,p-2,p)%p M=[[i==j for j inrange(82)]for i inrange(82)] M[-1][-1]=p M[-2][-1]=-c for i inrange(80): M[i][-1]=pow(256,79-i,p) Mb=diagonal_matrix([1]*81+[2**400]) M=matrix(ZZ,M) M3L=(M*Mb).BKZ() for vec in M3L: if(vec[-2] in [1,-1] and vec[-1]==0): vec=vec*vec[-2] if(all([abs(i)<5for i in vec[:-2]])): s=''.join([str(4+i) for i in vec[:-2]]) print('NSSCTF{'+s+'}') break #NSSCTF{25350625451533421162474265547571536103420331260232652121722452361537257541460235}
3.easyMod3
这个时候开始,技巧就开始有了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
from Crypto.Util.number import * from random import *
table = "Nss" p = getPrime(328) flag = b"NSSCTF{" + "".join([choice(table) for i inrange(100)]).encode() + b"}" c = bytes_to_long(flag) % p
print("p =",p) print("c =",c)
''' p = 421384892562377694077340767015240048728671794320496268132504965422627021346504549648945043590200571 c = 273111533929258227142700975315635731051782710899867431150541189647916512765137757827512121549727178 '''
from Crypto.Util.number import * p = 421384892562377694077340767015240048728671794320496268132504965422627021346504549648945043590200571 c = 273111533929258227142700975315635731051782710899867431150541189647916512765137757827512121549727178 t=bytes_to_long(b"NSSCTF{" + bytes([78]*100) + b"}") c=(c-t)*pow(256,p-2,p)*pow(37,p-2,p)%p M=[[i==j for j inrange(102)]for i inrange(102)] M[-1][-1]=p M[-2][-1]=-c for i inrange(100): M[i][-1]=pow(256,99-i,p) Mb=diagonal_matrix([1]*101+[2**400]) M=matrix(ZZ,M) M3L=(M*Mb).BKZ() for vec in M3L: if(vec[-2] in [1,-1] and vec[-1]==0): vec=vec*vec[-2] if(all([abs(i) in [0,1] for i in vec[:-2]])): s=''.join([chr(78+37*i) for i in vec[:-2]]) print('NSSCTF{'+s+'}') break #NSSCTF{NNNssNsNNNNsNNNsNNNNNssNNNssNNNsNsNNsNsNNssNNNNNNsNNNssNsNNNNNssNssssNsNNsNsssNNNNssNNNssNsNNssNsNss}
4.easyMod4
上一题是两个,这一题是四个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
from Crypto.Util.number import * from random import *
table = "GAME" p = getPrime(440) flag = b"NSSCTF{" + "".join([choice(table) for i inrange(100)]).encode() + b"}" c = bytes_to_long(flag) % p
print("p =",p) print("c =",c) print(flag)
''' p = 2271129678202363707972156644097566224560370806295266873816026779022614695317611229903770390498322537051358521932851893609555063610221 c = 244176818026839545554951436126300508547217557099550914232243928051857553603712968234687200629719468115535825237511413058786560692170 '''
from Crypto.Util.number import * p = 2271129678202363707972156644097566224560370806295266873816026779022614695317611229903770390498322537051358521932851893609555063610221 c = 244176818026839545554951436126300508547217557099550914232243928051857553603712968234687200629719468115535825237511413058786560692170 t=bytes_to_long(b"NSSCTF{" + bytes([71]*100) + b"}") c=(c-t)*pow(256,p-2,p)*pow(2,p-2,p)%p M=[[i==j for j inrange(102)]for i inrange(102)] M[-1][-1]=p M[-2][-1]=-c for i inrange(100): M[i][-1]=pow(256,99-i,p) Mb=diagonal_matrix([1]*100+[1]+[2**450]) M=matrix(ZZ,M) M3L=(M*Mb).BKZ() for vec in M3L: if(vec[-2] in [1,-1] and vec[-1]==0): vec=vec*vec[-2] if(all([abs(i) in [0,1,2,3] for i in vec[:-2]])): s=''.join([chr(71+2*i) for i in vec[:-2]]) print('NSSCTF{'+s+'}') break #NSSCTF{GEEGEEEMEEMMAAMGGGGEEGMMAMEGGEEEGAGGMEMEMMAMGGGEAAGMGEAAGEMMEEEMGMAAMMGEAAEEEEEGGEMMMMAEGAAAMEMEAEGE}
5.easyModX
下面来看这个题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
from Crypto.Util.number import * from Crypto.Cipher import AES from hashlib import md5 from random import choice from secret import flag
A= b= c= fA=[0]*len(A) fb=[0]*len(b) for i inrange(len(A)): fA[i]=k*A[i]%p for i inrange(len(b)): fb[i]=(k*b[i]+u)%p M=block_matrix(ZZ,[ # [identity_matrix(160),zero_matrix(160,137),identity_matrix(160),zero_matrix(160,1)], [identity_matrix(137),-matrix(ZZ,160,137,fA[:160*137]).T,zero_matrix(137,1)], [zero_matrix(160,137),-p*identity_matrix(160),zero_matrix(160,1)], [zero_matrix(1,137),matrix(fb[:160]),1] ]) print(M.nrows(),M.ncols()) Mb=diagonal_matrix([1]*137+[1<<123]*160+[1<<128]) from subprocess import check_output from re import findall from sage.allimport *
defflatter(M): # flatter z = "[[" + "]\n[".join(" ".join(map(str, row)) for row in M) + "]]" ret = check_output(["flatter"], input=z.encode()) return matrix(M.nrows(), M.ncols(), map(int, findall(b"-?\\d+", ret))) from datetime import * print(datetime.now()) M3L=flatter(M*Mb) print(datetime.now()) M3LuB=M3L*(Mb**-1) for vec in M3LuB: if(vec[-1] in [1,-1]): print(vec) break assertall([abs(i)<=30for i in vec[137:137+160]]) s=vector(GF(p),vec[:137]) from Crypto.Cipher import AES from hashlib import md5 print(AES.new(key=md5(str(s).encode()).digest(), nonce=b"Tiffany", mode=AES.MODE_CTR).decrypt(bytes.fromhex(c))) #b'NSSCTF{Th1s_T1m3_U_Kn0W_whaT_Lin3AR_M3@Ns!}'
6.easyMod alpha
这部分的最后一题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
from Crypto.Util.number import * from Crypto.Cipher import AES from hashlib import md5 from random import choice, randint from secret import flag
p = getPrime(64) e = [randint(0, p), randint(0, p)]
m, n = 220, 137 s = random_vector(Zmod(p), n) A = random_matrix(Zmod(p), m, n) e = vector(Zmod(p), [choice(e) for i inrange(m)]) b = A*s + e
p=previous_prime(10**100) n,m=140,166 dbgs=random_vector(Zmod(p),n) A=random_matrix(Zmod(p),m,n) dbge=vector(Zmod(p),[randint(-7,7) for _ inrange(m)]) b=A*dbgs+dbge from subprocess import check_output from re import findall
defflatter(M): # compile https://github.com/keeganryan/flatter and put it in $PATH z = "[[" + "]\n[".join(" ".join(map(str, row)) for row in M) + "]]" ret = check_output(["flatter"], input=z.encode()) return matrix(M.nrows(), M.ncols(), map(int, findall(b"-?\\d+", ret))) from datetime import * defEE(x): return identity_matrix(x) defOO(x,y=None): if(not y): return zero_matrix(x,x) else: return zero_matrix(x,y) defattack0(): STIME=datetime.now() M=block_matrix(ZZ,[ [EE(n),A.T,OO(n,1)], [OO(m,n),-p*EE(m),OO(m,1)], [OO(1,n),matrix(b),1] ]) Mb=diagonal_matrix(ZZ,[1]*n+[p//8]*m+[p]) MFL=flatter(M*Mb)*Mb**-1 for vec in MFL: if(vec[-1] in [-1,1]): vec*=-vec[-1] return vector(GF(p),vec[:n]),(datetime.now()-STIME).total_seconds() defattack1(): STIME=datetime.now() ZEm=[[0for __ inrange(m)] for __ inrange(m-n)] for i inrange(1,m-n+1): ZEm[-i][-i]=-p ZEm=matrix(ZEm) M=block_matrix(ZZ,[ [A.T.echelon_form(),OO(n,1)], [ZEm,OO(m-n,1)], [-matrix(b),1] ]) Mb=diagonal_matrix(ZZ,[1]*m+[1]) MFL=flatter(M*Mb)*Mb**-1 for vec in MFL: if(vec[-1] in [-1,1]): vec*=-vec[-1] break err=vector(GF(p),vec[:m]) s=A.solve_right(b-err) return s,(datetime.now()-STIME).total_seconds() s0,t0=attack0() print(t0) assert dbgs==s0 or dbgs==-s0 s1,t1=attack1() print(t1) assert dbgs==s1 or dbgs==-s1