1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| from hashlib import sha256 import random from Crypto.Util.number import * import os from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad with open("/home/ctf/flag", "r") as f: flag = f.read().strip().encode() class prng: def __init__(self, seed, a, b, c, d, e, p): self.state = seed self.a = a self.b = b self.c = c self.d = d self.e = e self.p = p def next(self, i): if i % 2 == 0: self.state = (self.a * self.state**2 + self.b * self.state + self.c) % self.p else: self.state = (self.d * self.state + self.e) % self.p return self.state def show(self): return (self.a, self.b, self.c, self.d, self.e, self.p) p = getPrime(256) [a, b, c, d, e] = [random.randint(1, p) for _ in range(5)] logo = ''' █ █ █████ █ █ █████ ███████ ███████ █ █ ░ █ ░░░░░ █░ █░ █ ░░░░░ ░░█░░░░ █░░░░░░░ █ █ ░ ░█░ ░░░░░ █░░█ █░░█░ ░░░░░ ░█░░░░░█░░░░░░░░ █ ░ ░ ░█████░░░█░░█░ █░░█░░ ░░░░░ █░░░░░█████░░░░░ █ █ ░ ░ ░░░░█ █░█░█░█░░█░░░ █░░░ █░░░░░█ ░ █ ░ ░░░█░ ██░░ ██░░█░░░ █░░░ █░░░░░░ █ ░ ░ █ █████░░░█░░░░ █░░░█████ █░░░ █░░░░░░░ ░ ░ ░ ░ ░░░░░ ░░░░░ ░ ░░░ ░░░░░ ░░░ ░░░ ░ ░ ░ ░░░░░ ░ ░░░ ░░ ░░░░░ ░░ ░░ ░ ░ ░░░░░ ░ ░ ░░░░░ ░ ░ ''' menu = ''' [1] Show PRNG parameters [2] Give me your seed [3] Generate Challenge [4] Exit ''' if __name__ == "__main__": print(logo) while True: print(menu) choice = input("Your choice: ") if choice == '1': print(f"PRNG parameters:\na = {a}\nb = {b}\nc = {c}\nd = {d}\ne = {e}\np = {p}\n") elif choice == '2': seed_input = input("Enter your seed (integer): ") try: user_seed = int(seed_input) user_prng = prng(user_seed, a, b, c, d, e, p) print("Seed accepted!\n") except ValueError: print("Invalid seed. Please enter an integer.\n") elif choice == '3': if 'user_prng' not in locals(): print("Please provide your seed first (option 2).\n") continue tmp = user_seed rng = random.Random() rng.seed(os.urandom(16)) gift = [] for i in range(320): random_number = rng.getrandbits(256) usr_number = user_prng.next(i) if usr_number == tmp: gift.append(random_number) key = long_to_bytes(rng.getrandbits(128)) cipher = AES.new(key, AES.MODE_ECB) c = cipher.encrypt(pad(flag, 16)) print(f"Encrypted flag (hex): {c.hex()}") print(f"gift = {gift}\n") break elif choice == '4': print("Exiting. Goodbye!") break else: print("Invalid choice. Please try again.\n")
|