import re import random from Crypto.Util.number import long_to_bytes values = {} with open("output.txt", "r") as f: lines = f.read().split("\n") values["sum"] = int(lines[0]) for line in lines[1:]: match = re.match(r"(\w+)=(-?[0-9]+)", line) values[match[1]] = int(match[2]) for y in range(0, 1000+1): random.seed(y) grade = random.choice([2,3]) a = random.randint(9999, 999999) b = random.randint(8888, 888888) c = random.randint(7777, 777777) if a + b + c == values["sum"]: print("[+] Found y:", y) break print("[+] a:", a) print("[+] b:", b) print("[+] c:", c) print("[+] grade:", grade) x = var("x", domain="integer") if grade == 2: y_x = a*x**2+b*x+c if grade == 3: d = random.randint(6666, 666666) y_x = a*x**3+b*x**2+c*x+d print("[+] d:", d) print("[+] polynome:", y_x) N = values["N"] hint = values["hint"] p = None q = var("q", domain="integer") for x in range(0,1000+1): eq = (N/q)^3 - q^8 + y_x(x=x) == hint solution = solve([eq], q, solution_dict=True) if solution and q in solution[0]: print("[+] Found x:", x) q = int(solution[0][q]) p = N//q break if p is None: print("[-] Could not find p and q") exit() phi_n = (p - 1) * (q - 1) d = pow(values["e"], -1, phi_n) pt = pow(values["encrypted"], d, values["N"]) flag = long_to_bytes(pt).decode() print("[+] Flag:", flag)