You Either Know, XOR You Don't
Desc
Challenge ini memakai XOR dengan key rahasia yang diulang sepanjang ciphertext. Sekilas key terlihat sulit ditebak, tetapi kita punya petunjuk penting: semua flag CryptoHack diawali format crypto{.
Jika kita tahu sebagian plaintext dan punya ciphertext, kita bisa mendapatkan bagian key dengan rumus:
key = ciphertext XOR plaintextTeknik ini disebut known-plaintext attack. Karena XOR bersifat self-inverse, operasi XOR yang sama bisa dipakai untuk mengenkripsi maupun mendekripsi.
Ciphertext:
0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104Solution
Kita mulai dengan decode ciphertext dari hex menjadi bytes. Setelah itu, XOR bagian awal ciphertext dengan plaintext yang sudah kita tahu, yaitu crypto{.
ciphertext = bytes.fromhex("0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104")
known_plaintext = b"crypto{"
partial_key = bytes(c ^ p for c, p in zip(ciphertext, known_plaintext))
print(partial_key)Output awal mengarah ke key:
b"myXORk"Dari pola tersebut, key kemungkinan besar adalah myXORkey. Setelah key diketahui, kita ulang key sepanjang ciphertext lalu XOR kembali untuk mendapatkan plaintext.
ciphertext = bytes.fromhex("0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104")
key = b"myXORkey"
plaintext = bytes(c ^ key[i % len(key)] for i, c in enumerate(ciphertext))
print(plaintext.decode())Penjelasan script:
bytes.fromhex()mengubah ciphertext hex menjadi bytes.zip(ciphertext, known_plaintext)memasangkan byte ciphertext dengan byte plaintext yang diketahui.c ^ pmembocorkan byte key pada posisi tersebut.key[i % len(key)]membuat key berulang sepanjang ciphertext..decode()mengubah hasil bytes menjadi string flag.
Solusi yang sama bisa dicek lewat CyberChef. Pertama XOR dengan crypto{ untuk melihat pola key:
Lalu XOR ciphertext dengan key penuh myXORkey:
Summary
Challenge ini memperkenalkan known-plaintext attack pada repeating-key XOR. Karena kita tahu flag diawali crypto{, kita bisa XOR ciphertext dengan teks tersebut untuk membocorkan awal key, menebak key penuh, lalu mendekripsi seluruh ciphertext.
Flag
crypto{1f_y0u_Kn0w_En0uGH_y0u_Kn0w_1t_4ll}