We intercepted one of Cipher's messages containing their next target.They encrypted their message using a repeating-key XOR cipher.
However, they made a critical errorβevery message always starts with the header:
" ORDER: "
Category: Cryptography || Level: EASY
Can you help void decrypt the message and determine their next target?
Here is the message we intercepted:
1c1c01041963730f31352a3a386e24356b3d32392b6f6b0d323c22243f6373
1a0d0c302d3b2b1a292a3a38282c2f222d2a112d282c31202d2d2e24352e60
Note: Saya menyelesaikan tantangan ini hanya menggunakan command Linux
Teori Singkat: XOR Cipher dengan Kunci Berulang
XOR (Exclusive OR) adalah operasi bitwise dasar yang sering digunakan dalam enkripsi sederhana. Aturannya:
A β 0 = A
A β A = 0
C β K = P (Ciphertext XOR Key = Plaintext)
C β P = K (Jika kita tahu plaintext, kita bisa mendapatkan kuncinya)
Dalam Repeating-Key XOR, kunci diulang terus menerus untuk mengenkripsi teks. Jika kita tahu sebagian plaintext (disebut crib), kita bisa mengekstrak kunci dan mendekripsi pesan.
Dari tantangan, kita tahu bahwa semua pesan diawali dengan header:
ORDER:
Saya mengonversi teks ini ke hex menggunakan perintah
echo -n "ORDER:" | xxd -p
Output:
4f524445523a
Berarti hex dari "ORDER:" adalah 4f 52 44 45 52 3a.
Ciphertext diberikan dalam hex:
1c1c01041963730f31352a3a386e24356b3d32392b6f6b0d323c22243f6373
1a0d0c302d3b2b1a292a3a38282c2f222d2a112d282c31202d2d2e24352e60
Saya perlu mengambil 6 byte pertama dari ciphertext dan XOR dengan hex plaintext "ORDER".
Mendapatkan bytes ciphertext pertama:
echo -n "1c1c0104196373" | xxd -r -p
Kemudian XOR dengan plaintext hex "ORDER:" menggunakan xxd
echo -n "1c1c0104196373" | xxd -r -p | xxd -b
echo -n "4f524445523a" | xxd -r -p | xxd -b
Sekarang, XOR masing-masing byte:
echo $(( 0x1c ^ 0x4f )) $(($(( 0x1c ^ 0x52 )))) $(($(( 0x01 ^ 0x44 )))) $(($(( 0x04 ^ 0x45 )))) $(($(( 0x19 ^ 0x52 )))) $(($(( 0x63 ^ 0x3a ))))
Output:
53 4e 45 41 4b 59
Jika dikonversi ke ASCII:
echo -n "534e45414b59" | xxd -r -p
Output:
SNEAKY
Jadi, Kunci enkripsi adalah "SNEAKY"
Karena key sudah diketahui maka akan dilakukan XOR dengan kunci yang berulang untuk mendekripsi ciphertext.
Gunakan xxd untuk mengonversi ciphertext ke format binary:
echo -n "1c1c01041963730f31352a3a386e24356b3d32392b6f6b0d323c22243f6373" | xxd -r -p > ciphertext.bin
Melakukan hal yang sama untuk kunci "SNEAKY" yang diulang hingga panjang ciphertext
yes "SNEAKY" | tr -d '\n' | head -c $(wc -c < ciphertext.bin) > key.bin
yes "SNEAKY" β Mengulang kata "SNEAKY" terus menerus.Β Β
tr -d '\n' β Menghapus newline agar jadi satu string panjang.Β Β
head -c $(wc -c < ciphertext.bin) β Memotong teks agar sepanjang ciphertext.
XOR operation dengan bash:
paste <(xxd -b ciphertext.bin | cut -d' ' -f2-7) <(xxd -b key.bin | cut -d' ' -f2-7) | awk '{printf "%c", strtonum("0b"$1) ^ strtonum("0b"$7)}'
xxd -b β Mengubah file ke format biner.Β Β
cut -d' ' -f2-7 β Mengambil bagian byte yang diperlukan.Β Β
paste β Menggabungkan ciphertext dan kunci secara berdampingan.Β Β
awk '{printf "%c", strtonum("0b"$1) ^ strtonum("0b"$7)}' β XOR setiap byte lalu mengonversi ke karakter ASCII.Β
Ouput Pesan yang didekripsi:
ORDER: Attack at dawn. Target: THM{the_hackfinity_highschool}
Repeating-key XOR rentan terhadap crib-dragging jika kita tahu sebagian plaintext.
Linux memiliki tools powerful seperti xxd, awk, dan paste untuk melakukan XOR dekripsi tanpa perlu coding dalam Python.
Konsep XOR Cipher sederhana: jika diketahui plaintext, kunci bisa ditemukan dan mendekripsi pesan.
Teknik ini sering digunakan dalam tantangan CTF dan analisis malware (karena malware sering dienkripsi dengan XOR sederhana).