54 lines
1.1 KiB
Python
Executable File
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()
|