43 lines
1.0 KiB
Python
Executable File
43 lines
1.0 KiB
Python
Executable File
#!/home/maxime/.pyvenv/bin/python3
|
|
from sympy import Rational, Symbol, solve
|
|
from sympy.ntheory.continued_fraction import continued_fraction, continued_fraction_convergents
|
|
from pwn import *
|
|
|
|
conn = connect("mercury.picoctf.net", 30761)
|
|
conn.recvuntil(b':')
|
|
e = int(conn.recvline().strip())
|
|
conn.recvuntil(b':')
|
|
n = int(conn.recvline().strip())
|
|
conn.recvuntil(b':')
|
|
c = int(conn.recvline().strip())
|
|
conn.close()
|
|
|
|
print("n =", n, '\n')
|
|
print("e =", e, '\n')
|
|
print("c =", c, '\n')
|
|
|
|
|
|
cont_frac = continued_fraction(Rational(e, n))
|
|
convergents = continued_fraction_convergents(cont_frac)
|
|
|
|
|
|
for convergent in convergents:
|
|
if convergent.p == 0:
|
|
continue
|
|
pk = convergent.p
|
|
pd = convergent.q
|
|
pphi = (e*pd - 1)//pk
|
|
|
|
p = Symbol('p', integer=True)
|
|
roots = solve(p**2 + (pphi - n - 1)*p + n, p)
|
|
|
|
if len(roots) == 2:
|
|
pp, pq = roots
|
|
if pp*pq == n:
|
|
print("factorized!")
|
|
P = pow(c, pd, n)
|
|
print(P.to_bytes((P.bit_length()+7)//8, byteorder='big'))
|
|
break
|
|
|
|
|