content = '''a 547 256 256 32 {1} a 512 512 INV a 514 514 INV a 515 515 INV ''' for i inrange(256, 256+128): content += 'a {} 512 512 AND\n'.format(i) # b backdoor for i inrange(128): content += 'a {} {} 513 XOR\na 513 513 INV\na 513 514 514 AND\n'.format(i, i+256) # # a b same content += '''a 512 512 INV a 514 514 INV a 512 514 513 AND ''' for i inrange(516, 547): # content += 'a {} 513 INV\n'.format(i) content += 'a 512 514 {} AND\n'.format(i) print(len(content)) withopen('res', 'w') as f: f.write(content)
from Crypto.Util import number from nclib import Netcat import gmpy2 e = 0x10001 io = Netcat(('119.3.152.203', 7001), verbose=False) io.recv_until(b'llp\n') n = int(io.recv_until(b'\n')[:-1]) nn = int(io.recv_until(b'\n')[:-1]) enc_flag = int(io.recv_until(b'\n')[:-1]) whileTrue: io.recv_until(b'>') io.send_line(b'l') enc_sec = int(io.recv_until(b'\n')[:-1]) payload = pow(2, e, n) * enc_sec % n io.recv_until(b'>') io.send_line(b'p') io.send_line(str(payload).encode()) sec_2 = int(io.recv_until(b'\n')[:-1]) if sec_2 % 2 == 0: sec = sec_2 // 2 print('get sec: ', sec) break io.recv_until(b'>') io.send_line(b'u') # io.send_line(str(sec).encode()) defparity_oracle(n, query): """input: n: the modulus of the RSA query: query is a function which inputs an int i, returns if the m*(2^i)%n is odd return: int m """ i = 0 x = 0 while n >> i: res = query(i+1) if res: x = 2 * x + 1 else: x = 2 * x i += 1 print(i, x) return (x+1) * n // 2 ** i defq(i): new_c = enc_flag * pow(2, i * e, nn) % nn io.recv_until(b'>') io.send_line(b'o') io.send_line(str(sec).encode()) io.send_line(str(new_c).encode()) returnint(io.recv_until(b'\n')[:-1].decode()) res = parity_oracle(nn, q) print(res) io.interact()