HSCTF 8 | agelaius-phoeniceus

#hsctf8

from sage.all import *
import random
flag = open('flag.txt','rb').read()
class prng:
    co = [random_prime(2**64-1,False,2**63) for i in range(100)]
    n = int(next_prime(2**64))
    def __init__(self):
        self.s = [random.randint(1,self.n) for i in range(100)]
    def next(self):
        self.s.append(vector(self.s).dot_product(vector(self.co))%self.n)
        return self.s.pop(0)
g = prng()
outs = []
for i in range(200):
    outs.append(g.next())
print(outs)
k = "".join([hex(g.next())[2:].zfill(16) for i in range(ceil(len(flag)/8))])[:len(flag)*2]
print("".join([hex(int(k[2*i:2*i+2],16)^flag[i])[2:].zfill(2) for i in range(len(flag))]))
import random
import ast
from ptrlib import xor

class prng:
    co = [random_prime(2**64-1,False,2**63) for i in range(100)]
    n = int(next_prime(2**64))
    def __init__(self):
        self.s = [random.randint(1,self.n) for i in range(100)]
    def next(self):
        self.s.append(vector(self.s).dot_product(vector(self.co))%self.n)
        return self.s.pop(0)

with open("output.txt") as f:
  outs = ast.literal_eval(f.readline().strip())
  bs = bytes.fromhex(f.readline().strip())

g = prng()

F = GF(g.n)
M = Matrix(F, 100, 100)
v = vector(F, outs[100:200])
for i in range(100):
  M[i] = outs[i:i+100]

g.co = [int(x) for x in M.solve_right(v)]
g.s = outs[100:]

for _ in range(100):
  g.next()

k = bytes.fromhex("".join([hex(g.next())[2:].zfill(16) for i in range(ceil(len(bs)/8))])[:len(bs)*2])
print(xor(k, bs))