import math, re
def parse_pem_pubkey(filename):
import base64
with open(filename) as f:
data = f.read()
b64 = ''.join(data.strip().split('\n')[1:-1])
der = base64.b64decode(b64)
def parse_len(data, pos):
l = data[pos]; pos += 1
if l & 0x80:
nb = l & 0x7f
l = int.from_bytes(data[pos:pos+nb], 'big')
pos += nb
return l, pos
def parse_int(data, pos):
assert data[pos] == 0x02; pos += 1
l, pos = parse_len(data, pos)
return int.from_bytes(data[pos:pos+l], 'big'), pos + l
i = 0
while der[i] != 0x03: i += 1
i += 1; l, i = parse_len(der, i); i += 1
assert der[i] == 0x30; i += 1; l, i = parse_len(der, i)
n, i = parse_int(der, i)
e, i = parse_int(der, i)
return n, e
n, e1 = parse_pem_pubkey('agent1_pub.pem')
_, e2 = parse_pem_pubkey('agent2_pub.pem')
c1 = int.from_bytes(open('msg1.enc', 'rb').read(), 'big')
c2 = int.from_bytes(open('msg2.enc', 'rb').read(), 'big')
def egcd(a, b):
old_r, r = a, b
old_s, s = 1, 0
while r != 0:
q = old_r // r
old_r, r = r, old_r - q * r
old_s, s = s, old_s - q * s
return old_r, old_s, (old_r - old_s * a) // b if b else 0
def modinv(x, m):
_, inv, _ = egcd(x % m, m)
return inv % m
g, a, b = egcd(e1, e2)
if a < 0:
c1u = modinv(c1, n); au = -a
else:
c1u = c1; au = a
if b < 0:
c2u = modinv(c2, n); bu = -b
else:
c2u = c2; bu = b
m = (pow(c1u, au, n) * pow(c2u, bu, n)) % n
m_bytes = m.to_bytes(256, 'big')
if m_bytes[0] == 0x00 and m_bytes[1] == 0x02:
idx = m_bytes.index(0x00, 2)
print("Flag (PKCS#1):", m_bytes[idx+1:].decode('utf-8'))
else:
printable = re.findall(b'[ -~]{4,}', m_bytes)
for s in printable:
print("Trouvé:", s.decode())