Shared Secrets - picoCTF Crypto Challenge
Challenge Overview
| Informasi | Detail |
|---|---|
| Event | picoCTF |
| Challenge | Shared Secrets |
| Kategori | Cryptography |
| Tools | Python |
Deskripsi Challenge:
Dikasih source code enkripsi (
encryption.py) dan hasil outputnya (file.txt). Flag-nya dienkripsi pakai key hasil pertukaran kunci ala Diffie-Hellman.
Flag: picoCTF{dh_s3cr3t_****8f37}
Pendahuluan
Deskripsi soalnya cuma bilang gini:
A message was encrypted using a shared secret… but it looks like one side of the exchange leaked something. Can you piece together the secret and get the flag?
Hint-nya juga cuma satu baris:
What do you get if you combine a public key with a known private one?
Nggak ada istilah teknis yang disebut langsung di soal. Tapi begitu buka source code-nya, kelihatan pola pow(g, a, p) dan pow(A, b, p), ini ciri khas dari sistem pertukaran kunci Diffie-Hellman. Jadi istilah ini bukan dari soalnya, tapi dari hasil baca kodenya sendiri.
Kedengarannya serem karena ada angka-angka yang panjangnya ratusan digit, tapi tenang, kita nggak perlu paham teori matematika di baliknya secara detail. Yang perlu dilakukan cuma baca kode yang dikasih pelan-pelan, cari celahnya (sesuai clue di deskripsi soal: "one side of the exchange leaked something"), terus hitung ulang pakai Python.
Nggak perlu jago coding buat ngerjain ini. Kodenya cuma dipakai buat "menghitung", persis kayak kalkulator, bukan buat bikin program yang rumit

Mengenal Konsep: Apa itu Diffie-Hellman?
Diffie-Hellman itu cara dua pihak (misal server dan client) buat sepakat soal satu "kunci rahasia" yang sama, tanpa perlu kirim kunci itu secara langsung lewat jaringan. Jadi walaupun ada orang lain yang nyadap komunikasinya, orang itu tetap nggak bisa tahu kunci rahasianya, karena yang dikirim cuma "hasil perhitungan", bukan kuncinya langsung.
Cara kerjanya kira-kira gini:
- Server punya angka rahasia sendiri, sebut saja
a - Client punya angka rahasia sendiri, sebut saja
b - Dari angka rahasia masing-masing, dihitung angka publik yang boleh dilihat siapa saja
- Angka publik itu dipertukarkan, terus masing-masing pihak menghitung ulang pakai angka rahasia miliknya sendiri
- Hasil akhirnya, server dan client sama-sama dapat angka yang sama persis, disebut shared key, tanpa pernah saling kirim angka rahasia aslinya
Nah, di soal ini, ada satu hal yang bikin soal ini jadi lebih gampang dari seharusnya: angka rahasia b itu ternyata bocor, ketulis langsung di file yang dikasih ke kita.
Penyelesaian Challenge
Langkah 1: Baca Kode Sumbernya Pelan-Pelan
Buka file encryption.py yang dikasih di soal. Isinya kira-kira gini (versi disederhanakan):
g = 2
p = getPrime(1048)
a = randint(2, p-2)
A = pow(g, a, p)
b = '???'
B = pow(g, b, p)
shared = pow(A, b, p)
flag = b"picoCTF{...}"
enc = bytes([x ^ (shared % 256) for x in flag])Kalau dibaca satu-satu tanpa mikirin istilah matematikanya:
gdanpitu angka publik, boleh dilihat siapa sajaaitu angka rahasia punya server, nggak dikasih tahu ke kitaAitu hasil hitungan daria, ini yang dikirim ke publik (boleh kelihatan)bitu angka rahasia punya clientshareditu kunci rahasia hasil akhir, dipakai buat ngunci flag- Baris paling bawah itu cara flag-nya dikunci, tiap huruf di-XOR pakai
shared % 256(nanti dijelasin XOR itu apa)

Langkah 2: Cari yang Bocor
Scroll ke bagian bawah kode, ada bagian yang nulis semua info ke file:
with open("file.txt", "w") as f:
f.write(f"g = {g}\n")
f.write(f"p = {p}\n")
f.write(f"A = {A}\n")
f.write(f"b = {b} \n")
f.write(f"enc = {enc.hex()}\n")Di sinilah letak celahnya. Baris f.write(f"b = {b} \n") itu nulis angka rahasia b langsung ke file yang dikasih ke kita. Padahal harusnya b itu rahasia si client, nggak boleh kelihatan orang lain. Tapi karena programnya salah nulis kode, angka b ini malah ikut ketulis di file.txt.
Jadi kita nggak perlu mecahin apapun secara matematis. Semua bahan yang dibutuhin, yaitu g, p, A, b, dan enc, semuanya udah ada di file.txt, tinggal dipakai buat hitung ulang.

Langkah 3: Hitung Ulang Shared Key
Shared key dihitung dari rumus A pangkat b, dimodulo p. Ditulis dalam bahasa Python:
shared = pow(A, b, p)Kenapa Python? Karena angka-angkanya panjang banget, ratusan digit, jadi kalkulator biasa atau kalkulator hp nggak akan sanggup. Python punya fungsi pow() yang bisa langsung menghitung pangkat sekaligus modulo tanpa perlu install apa-apa tambahan.
Kalau belum pernah pakai Python sama sekali, ini cara paling gampang buat nyobain:
- Buka https://www.online-python.com/ di browser (nggak perlu install apa-apa)
- Copy-paste kode di bawah ini ke kolom editor, ganti bagian
g,p,A,b,encsesuai isifile.txtmasing-masing - Klik tombol Run
g = 2
p = ANGKA_P_DARI_FILE
A = ANGKA_A_DARI_FILE
b = ANGKA_B_DARI_FILE
enc = "ENC_DARI_FILE"
shared = pow(A, b, p)
key = shared % 256
enc_bytes = bytes.fromhex(enc)
flag = bytes([x ^ key for x in enc_bytes])
print(flag)
Langkah 4: Kenapa Ada XOR?
XOR itu operasi yang sifatnya "bolak-balik". Kalau angka A di-XOR sama angka B menghasilkan angka C, maka angka C di-XOR lagi sama angka B bakal balik lagi jadi angka A. Sifat inilah yang bikin XOR sering dipakai buat enkripsi sederhana.
Di soal ini, flag aslinya di-XOR pakai key (hasil dari shared % 256) buat menghasilkan enc. Karena sifat XOR itu bolak-balik, kita tinggal XOR lagi enc-nya pakai key yang sama, otomatis balik lagi jadi flag asli. Itu kenapa baris terakhir kodenya persis sama kayak yang dipakai buat ngunci, cuma dibalik arahnya:
flag = bytes([x ^ key for x in enc_bytes])
Langkah 5: Baca Hasilnya

Setelah kode dijalankan, hasil print(flag) bakal muncul dalam bentuk kayak gini:
b'picoCTF{dh_s3cr3t_97db8f37}'Huruf b di depan sama tanda kutip itu cuma format bawaan Python buat nunjukin ini tipe data bytes, bukan bagian dari flag-nya. Flag aslinya:
picoCTF{dh_s3cr3t_97db8f37}Kesimpulan
Beberapa hal yang bisa diambil dari challenge Shared Secrets ini:
- Diffie-Hellman itu sistem buat dua pihak sepakat soal kunci rahasia bersama tanpa perlu kirim kunci itu secara langsung. Tapi sistem ini cuma aman kalau angka rahasianya beneran dijaga rahasia.
- Kesalahan kecil di kode, kayak nulis angka rahasia ke file log atau output, bisa bikin seluruh sistem enkripsinya jebol, walaupun metode enkripsinya sendiri sebenarnya aman.
- Nggak semua soal kriptografi butuh dipecahin secara matematis. Kadang jawabannya cuma soal teliti baca kode, nyari bagian yang harusnya rahasia tapi malah kebocor.
- XOR itu operasi yang bisa membalik dirinya sendiri, jadi kalau tahu key yang dipakai buat ngunci, tinggal XOR lagi pakai key yang sama buat buka kuncinya.
Flag: picoCTF{dh_s3cr3t_97db8f37}
Selamat mencoba challenge lainnya di PicoCTF! 🚩
Leave a Reply