Files

54 lines
1.1 KiB
Python
Executable File

#!/usr/bin/env nix-shell
#!nix-shell -i sage -p sage python3Packages.pwntools python3Packages.pycryptodome
import time
import sys
from sage.all import *
from pwn import *
from Crypto.Util.number import long_to_bytes
ADDR, PORT, *_ = "verbal-sleep.picoctf.net 56956".split()
def factor_n(n) -> (int, int):
print('Factoring N')
start = time.time()
factors = ZZ(n).factor()
stop = time.time()
print(f"Took: {stop - start}")
p, q, *rest = [x[0] for x in list(factors)]
assert len(rest) == 0
return p, q
def decrypt(p: int, q: int, e: int, n: int, enc: int) -> bytes:
phi = (p - 1) * (q - 1)
d = inverse_mod(e, phi)
m = power_mod(enc, d, n)
return long_to_bytes(m)
def main():
r = remote(ADDR, PORT)
n = int(r.recvline().split(b' ')[1].strip())
e = int(r.recvline().split(b' ')[1].strip())
enc = int(r.recvline().split(b' ')[1].strip())
r.close()
print(f"{n=}")
print(f"{e=}")
print(f"{enc=}")
p, q = factor_n(n)
print(f"{p=}")
print(f"{q=}")
print(decrypt(p, q, e, n, enc).decode())
if __name__ == '__main__':
main()