|
@@ -0,0 +1,59 @@
|
|
|
+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)
|