Writeup Aria
01_General02_XOR

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 plaintext

Teknik ini disebut known-plaintext attack. Karena XOR bersifat self-inverse, operasi XOR yang sama bisa dipakai untuk mengenkripsi maupun mendekripsi.

Ciphertext:

0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104

Solution

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 ^ p membocorkan 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}

On this page