Custom Encoding: Cipher Stream Analysis
Detailed Writeup: Custom Substitution / Binary Cipher (cipher (1).txt)
Executive Summary & Flag
- Challenge Name: Custom DogSpeak / Binary Substitution Cipher
- Category: Cryptography / Classical Substitution & Encoding
- Source File:
C:\Users\Vide21\Downloads\cipher (1).txt - Extracted Flag:
GEMASTIK19{TUTOR!!_submit-crypto-flag_D0ng}
1. Challenge Overview & Reconnaissance
File ciphertext (cipher (1).txt) berisi satu baris string kontinu berukuran 701 byte:
SOOHOHHDWOOHOOODWOOHOHHDWOOHOHODWOOHOHHDWOOHHOHHDWOOHOHHDWOOHHHODWOOHOHODWOOHHOODWOOHOHODWOOHOHHDWOOHOHHDWOOOHHODWOOHOHHDWOOHHHOHDWOOHHOODWOOHHHODWOOHHOODWOOOHHODWOOHOOODWOOHHHOHDWOOHOHODWOOHOHHDWOOHOHODWOOHOHODWOOHOHODWOOHOHHDWOOHOHHDWOOHHOOHDWOOHOHODWOOHHOHDWOOHHOHDWOOHHHODWOOHHOHDWOOHHHODWOOHOHODWOOHHOOHDWOOHOOODWOOHHOODWOOHOOODWOOHOHODWOOHOOHDWOOHHOHDWOOHOOHDWOOHHOHHDWOOHOOHDWOOOHHODWOOHOOODWOOHOHHDWOOHHOHDWOOHHOHHDWOOHOOHDWOOHHOODWOOHOOODWOOHHOHDWOOHOOODWOOOHHODWOOHOOODWOOHHHHDWOOHOOODWOOHOHHDWOOHOOHDWOOHHOOHDWOOHHOHDWOOHHOHHDWOOHOOHDWOOHOOHDWOOHOOHDWOOHHHOODWOOHOOHDWOOHHHODWOOHOOHDWOOHOOODWOOHOHODWOOHHOOHDWOOHOHHDWOOHOHHDWOOHHOODWOOHHHHDWOOHOOHDWOOHHOHODWOOHOOHDWOOHOOODWOOHOOODWOOHHOHHZ
Analisa Struktur & Alfabet:
- Header & Trailer (Start/End Markers):
- Karakter pertama adalah
S(Start / Beginning of Message). - Karakter terakhir adalah
Z(End / Termination of Message).
- Karakter pertama adalah
- Delimiter (Pemisah Token):
- Di antara
SdanZ, string terbagi secara teratur oleh substring pemisahDW. - Terdapat 86 token biner yang dipisahkan oleh
DW.
- Di antara
- Encoding Bit (Karakter ‘O’ dan ‘H’):
- Setiap token hanya terdiri dari karakter
OdanH. - Karakter
Omewakili bit1. - Karakter
Hmewakili bit0.
- Setiap token hanya terdiri dari karakter
2. Mathematical Formulation & Decoding Rules
A. Token Splitting
Secara matematis, ciphertext dapat direpresentasikan sebagai gabungan:
Di mana setiap token .
B. Binary Substitution Mapping
Setiap karakter dipetakan ke dalam bit dengan pemetaan bit invers:
Sehingga token menjadi string biner .
C. Base-2 to Decimal / ASCII Conversion
Setiap string biner dikonversi ke nilai desimal menggunakan rumus nilai posisi biner (Positional Base-2 Notation):
Nilai kemudian diubah menjadi karakter ASCII :
C.1. Bukti Penghitungan Nyata (Step-by-Step Proof from Real Cipher Data)
Berikut adalah bukti konkret jabaran matematis langkah-demi-langkah menggunakan 4 token pertama asli dari file cipher (1).txt:
1. Token 1 ()
- Substitusi Bit (): (Panjang bit ).
- Jabaran Pangkat Posisi Biner:
- Konversi ASCII:
2. Token 2 ()
- Substitusi Bit (): (Panjang bit ).
- Jabaran Pangkat Posisi Biner:
- Konversi ASCII:
3. Token 3 ()
- Substitusi Bit ():
- Jabaran Pangkat Posisi Biner:
- Konversi ASCII:
4. Token 4 ()
- Substitusi Bit ():
- Jabaran Pangkat Posisi Biner:
- Konversi ASCII:
Penggabungan Karakter Hasil Token 1 - 4:
(Dua pasangan karakter Hex pertama: "47" mewakili ASCII 'G' dan "45" mewakili ASCII 'E').
D. Hexadecimal Unpacking (Final Step)
Hasil konversi awal dari 86 token menghasilkan string Hexadecimal ASCII sepanjang 86 karakter:
Mengelompokkan hex string ke dalam pasangan nibbles ( karakter hex = byte plaintext):
Maka 43 pasang byte hex dikonversi menjadi plaintext final:
3. Python Solve Script
Berikut adalah skrip lengkap dalam Python untuk menyelesaikan dan mendekode ciphertext secara otomatis:
#!/usr/bin/env python3
def solve_cipher(file_path):
# 1. Read raw ciphertext data
with open(file_path, 'r') as f:
data = f.read().strip()
# 2. Strip Start ('S') and End ('Z') markers
body = data[1:-1]
# 3. Split by delimiter 'DW'
tokens = body.split('DW')
# 4. Map 'O' -> 1 and 'H' -> 0
bit_map = {'O': '1', 'H': '0'}
hex_chars = []
for t in tokens:
binary_str = ''.join(bit_map[c] for c in t)
decimal_val = int(binary_str, 2)
hex_chars.append(chr(decimal_val))
# 5. Join hex ASCII representation
hex_data = ''.join(hex_chars)
print(f"[+] Intermediate Hex Output (86 chars): {hex_data}")
# 6. Decode Hex to Plaintext Flag
flag = bytes.fromhex(hex_data).decode('utf-8')
print(f"[🎉] Decoded Flag: {flag}")
return flag
if __name__ == '__main__':
solve_cipher("/mnt/c/Users/Vide21/Downloads/cipher (1).txt")
4. Similar CTF Challenges & Reference Links
Tipe tantangan ini merupakan variasi dari Custom Binary Encoding / Substitution Cipher dan Esolang Ciphers yang sering muncul di kompetisi CTF. Berikut adalah kompetisi dan tipe challenge serupa beserta link referensinya:
-
PicoCTF - Custom Substitution / Binary Encoding Ciphers
- Challenge: 13 / Easy Peasy / Binary Search / Baconian Cipher
- Konsep: Mengubah teks menggunakan alfabet kustom 2-simbol (misal
A/BatauO/H) ke dalam representasi biner, lalu dikonversi ke karakter ASCII. - Link Referensi: PicoCTF Cryptography Category
-
DogeSpeak / Cow / Ook! Esolang Cipher
- Challenge: Dogspeak / Cow Code / Spoonn
- Konsep: Menggunakan keyword suara binatang atau huruf pengulangan (seperti
WUF/BARK,MOO,OOK!,WOO/HOO) sebagai perintah biner atau instruksi mesin esolang. - Link Referensi: Esolang Wiki - Ook! & Cow
-
Bacon’s Cipher (Baconian Cryptography)
- Konsep: Setiap karakter digantikan oleh sekelompok 5 huruf yang terdiri dari 2 simbol unik (biasanya
AdanB). Pada challenge ini,OdanHberfungsi persis seperti simbolAdanBpada Baconian Cipher dengan delimiter khususDW. - Link Referensi: dCode - Bacon Cipher Decoder
- Konsep: Setiap karakter digantikan oleh sekelompok 5 huruf yang terdiri dari 2 simbol unik (biasanya
-
Hex String Encoded Output (Multi-stage Encoding)
- Konsep: Flag tidak langsung dihasilkan dalam plaintext readable pada tahap pertama biner-ke-ASCII, melainkan membutuhkan 2-pass decoding:
Binary -> Hex String -> Plaintext. - Link Referensi: CyberChef - From Hex / From Binary Recipe
- Konsep: Flag tidak langsung dihasilkan dalam plaintext readable pada tahap pertama biner-ke-ASCII, melainkan membutuhkan 2-pass decoding: