Chosen-Plaintext attack adalah salah satu cara “code breaking” (cryptanalysis) dengan cara membandingkan dan menganalisa contoh plaintext dan ciphertextnya. Dalam chosen plaintext attack, code breaker memiliki kebebasan untuk menentukan plaintext yang diiginkannya.
Untuk mendapatkan contoh plaintext dan ciphertextnya, saya melakukan langkah berikut ini setelah login sebagai seorang user biasa:
- Ubah Password
- Lihat ciphertext dari tabel user dengan SQLinjection
Apa saja plaintext yang saya pilih? Berikut chosen-plaintext dan ciphertextnya yang saya pilih:
Plaintext | Ciphertext |
---|---|
d | 92254325 |
dd | 831214121412 |
ddd | 6180128012807280 |
dddd | 15013601660186017601 |
abcd1234 | 433034273428242944308379538023819382 |
Saya sengaja memilih plaintext berurutan (d,dd,ddd,dddd) untuk melihat apa ada pola yang muncul. Perhatikan pada plaintext “dd”, ciphertextnya adalah 831214121412, terlihat pola berulang pada angka 412 sebanyak 2x. Dalam ciphertext ini saya menyimpulkan bahwa 412 adalah kode untuk karakter ‘d’.
Untuk plaintext “ddd”, ciphertextnya adalah 6180128012807280, terlihat pola berulang pada angka 280 sebanyak 3 kali. Dalam ciphertext ini saya menyimpulkan bahwa 280 adalah kode untuk karakter ‘d’.
Begitu juga pada plaintext “dddd”, ciphertextnya adalah 15013601660186017601, dengan pola berulang pada angka 601 sebanyak 4 kali. Dalam ciphertext ini, saya menyimpulkan bahwa 601 adalah kode untuk karakter ‘d’.
Ingat bahwa untuk setiap penambahan satu karakter plaintext membuat ciphertext bertambah 4 digit. Ternyata 4 digit tersebut adalah satu digit apapun diikuti dengan 3 digit kode karakter. Chosen plaintext dalam contoh sebelumnya saya pecah-pecah menjadi kelompok 4 digit dipisahkan dengan karakter ‘#’ dan dari 4 digit tersebut saya pecah dua menjadi 1 digit dan 3 digit dengan karakter ‘-’.
Plaintext | Ciphertext | Kode |
---|---|---|
d | 9-225#4-325 | 325 = ‘d’ |
dd | 8-312#1-412#1-412 | 412 = ‘d’ |
ddd | 6-180#1-280#1-280#7-280 | 280 = ‘d’ |
dddd | 1-501#3-601#6-601#8-601#7-601 | 601 = ‘d’ |
Kini saya harus mengetahui bagaimana hubungan antara kode yang berurutan, untuk itu saya memilih plaintext “abcd1234″ dengan ciphertext 433034273428242944308379538023819382. Mari kita pecah ciphertext tersebut menjadi kelompok 4 digit seperti tabel di atas.
4-330#3-427#3-428#2-429#4-430#8-379#5-380#2-381#9-382
Dari pengelompokan tersebut kita bisa simpulkan bahwa:
427 = ‘a’, 428 = ‘b’, 429 = ‘c’, 430 = ‘d’, 379 = ’1′, 380 = ’2′, 381=’3′, 382=’4′
Perhatikan bahwa kode-kode tersebut sengaja saya pilih berurut ‘a’->’b’->’c’->’d’ dan ternyata ciphertextnya pun ikut berurut 427->428->429->430. Begitu juga untuk ’1′->’2′->’3′->’4′, ciphertextnya juga berurut 379->380->381->382. Saya mencurigai bahwa enkripsi ini memakai kode ASCII karena memang kode ASCII untuk ‘abcd’ dan ’1234′ berurutan.Kode ASCII untuk ‘a’=97, ‘b’=98,’c’=99,’d’=100,’1′=49,’2′=50,’3′=51,’4′=52.
Terlihat ada jarak yang cukup jauh antara kode ASCII dan kode pada ciphertext. Contohnya ‘a’ dengan ASCII 97, dalam ciphertext dikodekan dengan 427, selisihnya 427-97 adalah 330. Begitu juga dengan ’1′ dengan ASCII 49, dalam ciphertext dikodekan menjadi 379, dengan selisih 379-49 adalah 330. Ternyata kalau dilihat semua kode pada ciphertext juga berjarak 330 dengan kode ASCII. Pertanyaannya, darimana angka 330 ini muncul?
Mari kita lihat sekali lagi ciphertext dari ‘abcd1234′ (setelah dikelompokkan 4 digit):
4-330#3-427#3-428#2-429#4-430#8-379#5-380#2-381#9-382
Adakah angka 330 dalam ciphertext tersebut? Aha, ternyata ada! Ingat bahwa plaintext satu karakter, ciphertextnya adalah 8 digit, padahal tiap karakter dikodekan dalam 4 digit, jadi ada kelebihan 4 digit. Ternyata pada kelompok 4 digit pertama mengandung offset dengan kode ASCII, yaitu pada digit ke-2 hingga ke-4.
Jadi sekarang misteri enkripsi ini terpecahkan. Mari kita coba dekrip contoh ciphertext yang saya kumpulkan di awal:
- 804881451156416021528145
- 9436353935332546555225378546953924846491
Pada akhirnya dengan mengetahui teknik enkripsi yang dipakai, saya berhasil mendapatkan password seseorang dengan hak administrator. Tidak lama kemudian GAME OVER, webshell uploaded
Kesimpulan
Pelajaran yang bisa diambil dari kasus tersebut adalah bahwa membuat algoritma kriptografi yang kuat tidaklah mudah, jangan pernah memakai enkripsi buatan sendiri, walaupun algoritmanya anda rahasiakan. Selalu gunakan algoritma enkripsi terbuka yang sudah teruji oleh para ahli.
Sedangkan untuk password, sebaiknya jangan gunakan enkripsi, tapi gunakan one-way hash function yang kuat seperti SHA1. Enkripsi tidak cocok dipakai untuk menyimpan password karena ketika terjadi compromised, maka semua password yang ada di tabel akan bisa diambil attacker dengan cara menjalankan rutin dekripsi yang pasti tersedia di salah satu file script seperti PHP pada web tersebut.
Walaupun algoritma dekripsinya anda rahasiakan, suatu saat ketika terjadi compromised, seorang attacker akan bisa melakukan dekripsi dengan membaca source code php untuk men-dekrip password. Biasanya rutin dekripsinya tidak jauh dari file php yang terkait dengan halaman login.
Sumber:http://www.ilmuhacking.com/cryptography/memecahkan-kriptografi-dengan-chosen-plaintext-attack/
b. Algoritma subtitusi (Caesar cipher) —|
========== Enkripsi —|
Pada algoritma caesar klasik, setiap huruf plainteks diganti dengan barisan
huruf berikutnya sesuai dengan kunci yang diberikan.
contoh:
plainteks = “aku”
kunci = 7 (artinya setiap huruf cipher teks akan
diganti dengan 7 huruf berikutnya)
maka cipherteks:
a –> 7 = h
k –> 7 = r
u –> 7 = b
jadi cipherteks dari “aku” adalah “hrb”
dalam perhitungan matematis dinyatakan sebagai:
C = (P + K) mod 26
dimana–> C : Cipherteks
P : Plainteks
K : Kunci
Jadi secara matematis plainteks “aku” diatas di-enkripsi
dengan cara:
a=1 , C = ( 1 + 7 ) mod 26=8, 8=h
k=12, C = ( 12 + 7 ) mod 26=19,19=r
u=21, C = ( 21 + 7 ) mod 26=2, 2=b
========= Dekripsi —|
Untuk melakukan dekripsi pesan pada algoritma subtitusi, kita mengganti setiap
huruf cipherteks dengan huruf sejauh kunci sebelum huruf cipher tersebut,
contoh:
plainteks = “hrb”
kunci = 7 (artinya setiap huruf cipher teks akan
diganti dengan 7 huruf sebelumnya)
maka cipherteks:
h <– 7 = a
r <– 7 = k
b C : Cipherteks
P : Plainteks
K : Kunci
Jadi secara matematis plainteks “aku” diatas di-enkripsi
dengan cara:
h=8 , C = ( 8 – 7 ) mod 26=1, 1=a
r=18, C = ( 18 – 7 ) mod 26=11, 11=k
b=2, C = ( 2 – 7 ) mod 26=21, 20=u
========= Kelemahan Algoritma Subtitusi —|
Kelemahan utama dari algoritma subtitusi adalah frekuensi kemunculan setiap
huruf atau karakter pada chperteks yang mewakili huruf atau karakter tertentu
dari plainteks. Dengan hal tersebut, attacker dapat membuat tabel sederhana,
misalnya mengganti semua huruf atau karakter yang paling sering muncul dengan
huruf vokal (a, i, u, e, o) pada chiperteks yang dia peroleh
c. Algoritma XOR—|
Enkripsi/Dekripsi
secara deskriptif, algoritma XOR mengenkrip plainteks dengan cara melakukan
operasi XOR terhadap plainteks dengan kunci,
contoh:
Enkripsi:
A dalam notasi biner : 0 1 0 0 0 0 0 1
kunci B : 0 1 0 0 0 0 1 0
————————————– XOR
Jadi cipherteks : 0 0 0 0 0 0 1 1 atau dalam asci: 3
Dekripsi::
3 dalam notasi biner : 0 0 0 0 0 0 1 1
kunci B : 0 1 0 0 0 0 1 0
————————————– XOR
Jadi cipherteks : 0 1 0 0 0 0 0 1 atau dalam asci: A
d. Algortima RC4 —|
========= Pendahuluan —|
RC4 adalah algoritma yang dibuat oleh Ron Rivest ( RC sendiri adalah singkatan
dari Ron’s Code) RC4 merupakan salah satu chiper jenis aliran yang digunakan
oleh SSL ( Secure Socket Layer) dan beberapa protocol security yang lainnya.
Pengertian Stream Cipher / Cipher Aliran
” Algoritma kriptografi yang beroperasi dalam bentuk bit tunggal,
dimana setiap prosess enkripsi dan deskripsi dilakukan per bit, yang
artinya prosess enkripsi dan deskripsi dilakukan satu bit setiap kali”
========= Enkripsi/Deskripsi —|
———————————————————-//
for (i = 0; i < 256; i++)
S[i] = i;
for (i = j = 0; i S[255]
2. Jika panjang kunci kurang dari 256 byte,lakukan padding(penambahan byte semu)
sehingga panjang kunci sama dengan 256 byte
3. Lakukan permutasi nilai-nilai dalam larik S
4. Pembangkitan Aliran kunci.
e. Algortima Combo (Combo Encryption) —|
Pola enkripsi combo yang saya pakai alurnya seperti berikut:
1. Diberikan sebuah kunci dengan maximal panjang 256 bit
2. Hitung panjang dari karakter kunci kemudian tambahkan dengan interget
tertentu
printf(“\nMasukan kunci anda:”);gets(kunci);
n = (strlen((char*)kunci));
y = n +1024;
3. Lakukan inisialisasi pada kunci yang diberikan dengan algoritma RC4
rc4_init(kunci, n);
int z;
for ( z = 0; z < n; z++){
rc4_gen[z] = (kunci[z]) ^ (rc4_output());
}
4. Enkripsi pertama dengan algoritma Subtitusi
5. Enkripsi kedua dengan algoritma XOR
6. Enkripsi ketiga dengan XOR yang kuncinya telah diinisialisasi oleh RC4
cipher = (plain + y ) % 256 ;
cipher2 = cipher ^ kunci[x];
rc4 = rc4_gen[x] ^ cipher2;
putc(rc4,output);
Proses deskripsi dilakukan dengan membalikan prosess enkripsi. Hal diatas adalah
salah satu contoh pola super enkripsi, dari hal tersebut anda bisa membuat
variasi maupun bentuk baru dari algoritma yang ada.
Sumber:http://dotexe.unnes.ac.id/2009/02/20/algoritma-combo-echo-magazine-volume-vii-issue-xx-phile-0x08txt/
terkait dengan penerapan enkripsi, bisa diunduh artikel berikut http://repository.gunadarma.ac.id/bitstream/123456789/2274/1/01-03-010-Penerapan%5BRangga%5D.pdf
BalasHapusThankss bangeeetttttttttttt... awalnya ane bingung banget pas disrh enkripsi dengan metode plain text yg di XOR-kan dgn key..
BalasHapusehh trnyta,, charakter & key-nya itu cuma tinggal di scan ke integer (%i) dn diubah ke biner lalu di XOR-kan.. wuuaaahhhhhhhh thanksssssssss bangettt yaaaa.... wwkwkwkwkwk.. bahagia banget gue hari ini :'v
Thanks bro, keep writing :D :D :D :D :D :D :D :D
#sayamendukunggerakanmenulistanpaplagiat, wks :v