BND-CTF: RSA Key Generation
Der BND hat mal wieder einen öffentlichen Einstellungstest, dem wir uns erfreuen dürfen. Ideal, um sich mal etwas in CTF-Writeups zu probieren!
Aus der Kategorie Cryptography schauen wir uns mal die (einzige) Challenge an: Analysieren einer Backdoor in einem RSA-Schlüsselerzeugungsalgorithmus.
Folgender Code wurde uns bereitgestellt:
SageMath-Code
{%- highlight c linenos -%} ### Excerpt from utils.py (used to encode / decode the message) def encode(msg): """ Convert a message to a number.Example:
>>> hex(encode(b'ABCD'))
'0x41424344'
"""
return int.from_bytes(msg, byteorder='big')
def decode(msg): """ Convert a number back to a message.
Example:
>>> decode(0x41424344)
b'ABCD'
"""
return int(msg).to_bytes(length=len(hex(msg))//2-1, byteorder='big')
Excerpt from RSA.py
x = 0xbb31781a2436fd6833597b61f91b94fba8cc5be702c7084de28625d96823102daf48dd84244fe41d180452a900388d1666ff59981f0912c6640977684c20bcfdcbf365dfcb68c0c5a9fd02576134a0e94ab9e20bbacffb4df5c9c27ae7f5022f6609aefeb9f5249387925ad13ce80a13
def rsa_keygen(): def a(x, y): z = 1 while True: if is_prime(xz + y): return xz + y z += 1
p = a(x, random_prime(2^128, None, 2^127))
q = a(x, random_prime(2^128, None, 2^127))
N = p * q
e = 65537
d = inverse_mod(e, (p-1) * (q-1))
return e, d, N
def rsa_crypt(m, k, n): return lift(Mod(m, n) ^ k) {%- endhighlight -%}
(wer kein SageMath installiert hat, kann diese Online-Version verwenden)
Zu dem Code haben wir folgende Zahlen enthalten, die wir entschlüsseln sollen: