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()