46 lines
1.1 KiB
Python
46 lines
1.1 KiB
Python
import socket
|
|
from Crypto.Util.number import getPrime, inverse
|
|
import re
|
|
# Fill in the right target here
|
|
HOST = 'netsec.net.in.tum.de' # TODO
|
|
PORT = 20106 # TODO
|
|
|
|
|
|
def int_to_bytes(m):
|
|
return m.to_bytes((m.bit_length() + 7) // 8, 'big').decode()
|
|
|
|
def modular_inverse(p, phi_q):
|
|
x = inverse(p, phi_q)
|
|
return x % phi_q
|
|
|
|
def decrypt_message(encrypted, p, q):
|
|
phi_q = q - 1
|
|
d = modular_inverse(p, phi_q)
|
|
message = pow(encrypted, d, q)
|
|
return message
|
|
|
|
|
|
|
|
def get_flag():
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
|
s.connect((HOST, PORT))
|
|
sf = s.makefile('rw') # we use a file abstraction for the sockets
|
|
m = sf.readline().rstrip('\n')
|
|
bit_len = int(re.search(r"[0-9]+", m).group())
|
|
print(f"bit_len is {bit_len}")
|
|
p = getPrime(bit_len*2)
|
|
q = getPrime(bit_len*2)
|
|
sf.write(f'{p};{q}\n')
|
|
sf.flush()
|
|
c_m = int(sf.readline().rstrip('\n'))
|
|
print("C_M: ", c_m)
|
|
d_m = decrypt_message(c_m, p, q)
|
|
sf.close()
|
|
s.close()
|
|
print(int_to_bytes(d_m))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
get_flag()
|