Filer: Download challenge files

Writeup: Binary Caesar


Indledende Observationer

Jeg fik udleveret:

  • encryption.txt (ciphertext)

  • main.py (krypteringslogik)

Ciphertextet var:

1
pporkmhce}taii_}tomi}m{s

Ved første øjekast lignede det ikke klassisk Caesar (ingen simpel rotation).


Recon / Kortlægning

Jeg åbnede main.py og analyserede krypteringsfunktionen.

Jeg observerede følgende:

  • Der bruges et custom alphabet:

    1
    
    abcdefghijklmnopqrstuvwxyzæøå{}_
    
  • Hvert tegn bliver konverteret til sit indeks i alfabetet.

  • Krypteringen sker via:

    1
    
    encrypted_index = char_index ^ key_index
    
  • Samme key-char bruges for hele teksten.

Det vil sige at dette ikke er klassisk Caesar (addition modulo n). Men istedet en XOR-baseret substitution over alfabetets indeks.

En vigtig observation:

XOR er symmetrisk
a ^ b ^ b = a

Det betyder, at dekryptering er identisk med kryptering.


Analyse

Sikkerheden afhænger af én enkelt key-character fra alfabetet.

Alfabetet er meget lille (~33 tegn), hvilket betyder:

  • Keyspace = 33 mulige keys

  • Bruteforce er trivielt

Ingen IV
Ingen multiple rounds
Ingen randomisering

Det lugter altså af en weak XOR single-byte cipher


Angrebet

Jeg lavede et simpelt brute-force script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
ALPHABET = "abcdefghijklmnopqrstuvwxyzæøå{}_"

def decrypt(ciphertext, key):
    result = ""
    key_index = ALPHABET.index(key)

    for char in ciphertext:
        char_index = ALPHABET.index(char)
        decrypted_index = char_index ^ key_index
        result += ALPHABET[decrypted_index]

    return result


with open("encryption.txt") as f:
    ciphertext = f.read().strip()

for key in ALPHABET:
    plaintext = decrypt(ciphertext, key)
    print(key, "->", plaintext)

Ved gennemgang af output fandt jeg:

1
2
Key = m
Plaintext = ddc{galois_meets_caesar}

Flaget

Challenge-format krævede uppercase prefix:

1
DDC{galois_meets_caesar}

Konklusion

Denne challenge illustrerede følgende:

  • XOR er ikke stærk kryptering alene

  • Single-byte XOR med lille keyspace er trivielt at brute-force

  • XOR er symmetrisk, samme funktion bruges til kryptering og dekryptering