Overview
Two intercepted satellite transmissions share a prime factor p due to a hardware security flaw. Decrypting both RSA payloads reveals state and mask parameters for an onboard LFSR stream cipher.
Reconnaissance
Compute gcd(N1, N2) = p to factor both moduli and derive private keys d1 and d2.
Exploitation Strategy
Decrypting messages recovers State = 0xDEADC0DECAFEFEED and Mask = 0x800000000000000D. Feeding these to stream_engine.py yields keystream bytes to XOR-decrypt flag.enc.
Solution Code
from math import gcd
from stream_engine import stream_engine
p = gcd(N1, N2)
q1, q2 = N1//p, N2//p
phi1, phi2 = (p-1)*(q1-1), (p-1)*(q2-1)
d1, d2 = pow(e,-1,phi1), pow(e,-1,phi2)
m1, m2 = pow(c1,d1,N1), pow(c2,d2,N2)
# State = 0xDEADC0DECAFEFEED, Mask = 0x800000000000000D
ks = stream_engine(0xDEADC0DECAFEFEED, 0x800000000000000D)
plain = bytes(c ^ next(ks) for c in open("flag.enc","rb").read())
print(plain.decode())Flag
hwj{gcd_f4ct0r_m33ts_lfsr_g3n3rat0r}