from Crypto.Util.number import getPrime, long_to_bytes
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from secrets import randbelow

FLAG = open('flag.txt','rb').read().strip()

def lcg(a,b,p,x):
    while 1:
        if type(b) == int: yield (x := (a*x+b) % p)
        else: yield (x := (a*x+next(b)) % p)

P, p = getPrime(256), getPrime(0x137)
X, A, B, a, b = randbelow(P), randbelow(P), randbelow(p), randbelow(p), randbelow(p)

# what's better than one lcg? TWO lcgs!
moons = lcg(a,b,p,B)
planets = lcg(A,moons,P,X)

orbit = [next(planets) for _ in range(15)]
star = AES.new(long_to_bytes(X),AES.MODE_ECB).encrypt(pad(FLAG,16)).hex()

print(f"{orbit = }")
print(f"{star = }")
print(f"{P = }")

'''
orbit = [65268135111315146543487662002122803303317454738741597399146015674543648151540, 76486897038358272336476830945057748512068210451615849559165917060780258274973, 83804786308430123320490390187241646063410177426277267979693562245034743598416, 75590370444868000387931660913979451581907545197518607941701905465148067350213, 101472579693417222256841278411810307249184859113612179903548894746156318068794, 95046172743786600754770082799531085749628997691601456641196713647712923219908, 98368121369764864264198024963149886142453951328031642895089652528709510645744, 64620088409844329358636811396846159737245978780583844997274794054005983118093, 81110949948920595706175215061991422194795152358466482528222299049433287049023, 39783286420866979158112611594435375966762114040563824275853993678143231291695, 111304611628764198901220899577852392747949737810567401291475853162983930673219, 10916211165898001052649529691396160625379842682496422571933504759126059152436, 88507178579219964099012718788758070468038056654124289977109592291152120028137, 93680394247677612152360699489333664109040824826269119395684552863153392647064, 22513821691500261642269921194784613519124971541405975758737548950902426127787]
star = 'de8a3b579e02904dc6abe4ec06b90e2c9d0526769dc69723176ce96c7b0cb822a97683e0f4fbbe1549ee94587d49120db87604d669a86378dd445dbe27686a32e15e9ab520d6158ad8ca4f60fb9b45f92cce338fb886de61b9473ec0eb16f5281a9ef6e5d9e9c20f4a0f569a201baab804b174ddd1edd6a63e7cd503a58bf4cbd153db65547da55dae0d66bdc937b12d4e237261846ba67441d857654524a4c27808e4b2a6644c5fce3a0f02e1ef1fcb'
P = 111976112566011270312561573762457653887410918282126167831387228032501364850241
'''
