from Crypto.Util.number import * from secret import flag flag=bytes_to_long(flag) l=flag.bit_length()//3 + 1 n=[] N=1 whilelen(n) < 3: p = 4*getPrime(l)-1 if isPrime(p): n.append(p) N *= p
from Crypto.Util.number import * PR.<x> = PolynomialRing(ZZ) c=24884251313604275189259571459005374365204772270250725590014651519125317134307160341658199551661333326703566996431067426138627332156507267671028553934664652787411834581708944 polynomial=x**3 - 15264966144147258587171776703005926730518438603688487721465*x**2 + 76513250180666948190254989703768338299723386154619468700730085586057638716434556720233473454400881002065319569292923*x - 125440939526343949494022113552414275560444252378483072729156599143746741258532431664938677330319449789665352104352620658550544887807433866999963624320909981994018431526620619 n1, n2, n3 = [i[0] for i in polynomial.roots()] all_root = [] for n in [n1, n2, n3]: PR.<x> = PolynomialRing(GF(n)) f = x^2 - c all_root.append([ZZ(r[0]) for r in f.roots()])
for r1 in all_root[0]: for r2 in all_root[1]: for r3 in all_root[2]: flag = crt([r1, r2, r3], [n1, n2, n3]) flag = long_to_bytes(flag) if flag.isascii(): print(flag) # b'VNCTF{90dcfb2dfb21a21e0c8715cbf3643f4a47d3e2e4b3f7b7975954e6d9701d9648}'
defnext(self): self.seed = (self.seed * self.a + self.b) % self.m returnself.seed binary_flag = ''.join(f"{byte:08b}"for byte in FLAG1) m = [int(bit) for bit in binary_flag]
n=[] lcg=LCG()
for i in m: z=lcg.next() if i == 0: n.append(z) else: z=randint(0, 2**512) n.append(z) print(f"n={n}") ''' n = [...] '''
# part2 classFlagEncoder: def__init__(self, flag: bytes, e: int = 65537): self.flag = flag self.e = e self.encoded_flag = [] self.n = None self.c = None
defprocess(self): for idx, byte inenumerate(self.flag): self.encoded_flag.extend([idx + 0x1234] * byte) shuffle(self.encoded_flag) p, q = getPrime(1024), getPrime(1024) self.n = p * q self.c = sum(pow(m, self.e, self.n) for m inself.encoded_flag) % self.n print(f"{self.n = }\n{self.e = }\n{self.c = }\n")
n = 16880924655573626811763865075201881594085658222047473444427295924181371341406971359787070757333746323665180258925280624345937931067302673406166527557074157053768756954809954623549764696024889104571712837947570927160960150469942624060518463231436452655059364616329589584232929658472512262657486196000339385053006838678892053410082983193195313760143294107276239320478952773774926076976118332506709002823833966693933772855520415233420873109157410013754228009873467565264170667190055496092630482018483458436328026371767734605083997033690559928072813698606007542923203397847175503893541662307450142747604801158547519780249 e = 65537 c = 9032357989989555941675564821401950498589029986516332099523507342092837051434738218296315677579902547951839735936211470189183670081413398549328213424711630953101945318953216233002076158699383482500577204410862449005374635380205765227970071715701130376936200309849157913293371540209836180873164955112090522763296400826270168187684580268049900241471974781359543289845547305509778118625872361241263888981982239852260791787315392967289385225742091913059414916109642527756161790351439311378131805693115561811434117214628348326091634314754373956682740966173046220578724814192276046560931649844628370528719818294616692090359 length = 68 m = [] for i inrange(length): m.append(pow(i + 0x1234, e, n)) M = column_matrix(ZZ, m + [c]) M = M.augment(identity_matrix(ZZ, length+1)) M = M.stack(vector(ZZ, [n] + [0]*(length+1))) MLLL = M.LLL() f = -MLLL[0] FLAG2 = b"" for i in f: if i >= 32and i <= 127: FLAG2 += bytes([i]) print(FLAG2) print(FLAG1 + FLAG2) # b'i0ns_On_Rec0vering_The_Messages}' # b'VNCTF{Happy_New_Year_C0ngratu1ati0ns_On_Rec0vering_The_Messages}'
from Crypto.Util.number import * from flag import flag
classDaMie: def__init__(self, flag , n = None): self.m = ZZ(bytes_to_long(flag)) self.n = n if n else getPrime(1024) self.P = Zmod(self.n) print(f'n = {self.n}')
defprocess(self, x, y, z):
return vector([5 * x + y - 5 * z, 5 * y - z, 5 * z])
if m != 0: plana = self.Mat(m//2) planb = plana(*plana) if m % 2 == 0: return planb else: returnself.process(*planb) else: returnself.process(*PR.gens())
defhash(self, A, B, C): returnself.Mat(self.m)(A, B, C)
if __name__ == '__main__': Ouch = DaMie(flag) result = Ouch.hash(2025,208,209) print(f'hash(A,B,C) = {result}')
from random import getrandbits, setstate, getstate from tqdm import trange from sympy import nextprime from Crypto.Util.number import long_to_bytes
SAMPLES = 20000//8 M = [] for i in trange(19968): state = [int(0) for _ inrange(624)] state[i//32] = int(1 << (31 - (i%32))) setstate((3, tuple(state+[int(624)]), None)) [getrandbits(8) for _ inrange(40000-SAMPLES)] v = [] for _ inrange(SAMPLES): v += [int(j) for j inbin(int(getrandbits(8)))[2:].zfill(8)] M.append(v) M = matrix(GF(2), M)
C = [...] # data_RC4.txt n = 26980604887403283496573518645101009757918606698853458260144784342978772393393467159696674710328131884261355662514745622491261092465745269577290758714239679409012557118030398147480332081042210408218887341210447413254761345186067802391751122935097887010056608819272453816990951833451399957608884115252497940851 e = 65537 encrypted_flag = 22847144372366781807296364754215583869872051137564987029409815879189317730469949628642001732153066224531749269434313483657465708558426141747771243442436639562785183869683190497179323158809757566582076031163900773712582568942616829434508926165117919744857175079480357695183964845638413639130567108300906156467 for sbox in trange(256): # print(sbox) v = [] for i in C[40000-SAMPLES:]: v += [int(j) for j inbin(i^^17^^sbox)[2:].zfill(8)] s = matrix(GF(2), [v[32: 19968]]) v = s + a0*KK sol = v*MM_inv final_state = a0.list()+sol.list() state = [int("".join([str(j) for j in final_state[32*i:32*i+32]]), 2) for i inrange(624)] if state[0] != 1<<31: continue setstate((3, tuple(state+[int(624)]), None)) [getrandbits(8) for _ inrange(40000)] p = nextprime(getrandbits(512)) if n%p == 0: print(p) break q = n//p d = pow(e, -1, (p-1)*(q-1)) flag = pow(encrypted_flag, d, n) print(long_to_bytes(int(flag))) # VNCTF{FL4w3d_RC4_C0nv3rg3s_2_123_4nd_M1nd_Sm4ller_MT_Brut3}
s_ = input("Give me s: ") if s_ == str(s.tolist()): print("Congratulations! You have signed in successfully.") print(FLAG) else: print("Sorry, you cannot sign in.")
import random from Crypto.Util.number import * import numpy as np from concurrent.futures import ProcessPoolExecutor from time import time from pwn import *
defuniform_sample(n, bound, SecureRandom): return [SecureRandom.randrange(-bound, bound) for _ inrange(n)]
defchoice_sample(n, L, SecureRandom): return [SecureRandom.choice(L) for i inrange(n)]
A = [uniform_sample(197, q, R_A) for _ inrange(19700)]
defget_row_task(begin, end): M_i = random_matrix(ZZ, end-begin, 19700) row = [0] * 19700# 初始化一行数据ZZ for k inrange(begin, end): for i inrange(197): row[i] = A[k][i] ** 2 cnt = 197 for i inrange(197): for j inrange(i + 1, 197): row[cnt] = 2 * A[k][i] * A[k][j] cnt += 1 for i inrange(197): row[cnt] = A[k][i] * (e_L[0] + e_L[1] - 2 * b[k]) cnt += 1 M_i[k-begin] = row return M_i
begin = time.time() dim = 19700 num = 8 gap = dim // num M = matrix(GF(q), [[0for i inrange(19700)]]) with ProcessPoolExecutor(max_workers=num) as executor: future_all = [executor.submit(get_row_task, gap*i, gap*(i+1)) for i inrange(num)] + [executor.submit(get_row_task, gap*8, dim)] for future in future_all: M = M.stack(future.result()) M = M[1:] end = time.time() print(f"矩阵 M 填充完成,耗时{end-begin}s")
begin = time.time() y = [] for i inrange(dim): y.append(-(b[i]-e_L[0])*(b[i]-e_L[1])) y = vector(GF(q), y) x = M.solve_right(y) end = time.time() print(f"求解完成,耗时{end-begin}s") s = x[-197:].change_ring(ZZ).list() for i inrange(len(s)): if s[i] >= q//2: s[i] -= q s = np.array(s) io.recvuntil(b"Give me s: ") io.sendline(str(s.tolist()).encode()) print(io.recvline()) flag = io.recvline() print(flag)
1 2 3
矩阵 M 填充完成,耗时103.08421277999878s 求解完成,耗时145.3967547416687s VNCTF{Wh3%_th3rr0R_c@nd1d@t3s_0f_L3@rn1n9-w1tH-3r^20r_1s_sm4ll,it_WoulD_b3-R3411Y_D4ng3r0us!!}