← Back to HWJ CTF

INTERLOCKING ROOTS

Recover shared prime factor across RSA public keys and decrypt stream cipher LFSR parameters.

Tools Used

PythonGCDRSA Key ReuseLFSR

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}