Problem: [NSSRound#11 Basic]ez_signin
from pwn import *
from gmpy2 import *
from Crypto.Util.number import *
#------------ 交互部分 ------------
host = 'node4.anna.nssctf.cn'
port = 28223
conn = remote(host, port)
def interact_with_server(conn):
data1 = conn.recvline().decode()
data2 = conn.recvline().decode()
data3 = conn.recvline().decode()
data4 = conn.recvline().decode()
num1 = int(re.findall(r'num1= (\d+)', data1)[0])
num2 = int(re.findall(r'num2= (\d+)', data2)[0])
n = int(re.findall(r'n= (\d+)', data3)[0])
c = int(re.findall(r'c= (\d+)', data4)[0])
return num1, num2, n, c
# ------------ 解密部分 ------------
num1, num2, n, c = interact_with_server(conn)
e = 65536
p = gcd(n,(num1 + num2 ) % n)
q = n//p
cs = [c]
def rabin_decrypt(c,p,q):
mp = pow(c, (p + 1) // 4, p)
mq = pow(c, (q + 1) // 4, q)
yp = inverse(p,q)
yq = inverse(q,p)
r = (yp * p * mq + yq * q * mp) % n
r_ = n - r
s = (yp * p * mq - yq * q * mp) % n
s_ = n - s
return r,r_,s,s_
for i in range(16):
ps = []
for c2 in cs:
r,r_,s,s_ = rabin_decrypt(c2,p,q)
if r not in ps:
ps.append(r)
if r_ not in ps:
ps.append(r_)
if s not in ps:
ps.append(s)
if s_ not in ps:
ps.append(s_)
# print(ps)
cs = ps
for i in range(len(cs)):
print(long_to_bytes(cs[i]))
