////////////////////////////////////
Kriptografi Dua Arah
////////////////////////////////////
Kriptografi
jenis ini mungkin sering direferensikan sebagai kriptografi yang
“sesungguhnya”, karena memiliki metode “encrypt” untuk merubah plain
text menjadi cipher text, dan metode “decrypt” untuk mengembalikan
cipher text menjadi plain text. Dalam kriptografi jenis ini, selain
plain text dan cipher text, dibutuhkan parameter lainnya yang disebut
“key”. Saat ini dikenal dua jenis key yang digunakan, yaitu “Symmetric
Key” dan “Assymetric Key”.
Yang perlu diingat dalam proses
kriptografi dua arah ini adalah, proses encrypt dan decrypt harus
memiliki operasi yang saling bertolak belakang. Misal, pada proses
encrypt kita menggunakan operator “+” (tambah), maka pada proses decrypt
kita harus menggunakan operator “-“ (kurang). Karena itu, dalam
implementasi kriptografinya proses encrypt dan decrypt dibuat menjadi
dua implementasi yang berbeda, namun saling melengkapi. Untuk proses
decrypt, implementasi akan meniru proses verifikasi serial sebuah
software, sedangkan untuk proses encrypt, implementasi akan bertindak
sebagai “keygen”-nya.
————————
Symmetric Key
————————
Yang
dimaksud dengan symmetric key atau key yang simetris adalah, parameter
key yang digunakan dalam proses encrypt dan decrypt, sama. Panjang dari
parameter key ini pun bervariasi tergantung dari metoda yang digunakan.
Dalam implementasi yang akan diberikan, metoda yang digunakan adalah RC4
dan Blowfish, dengan panjang key 128 bit atau 16 byte.
Dengan
alasan tertentu, implementasi akan diberikan dan dibahas dimulai dari
proses decrypt terlebih dahulu. Implementasi decrypt dapat di download
pada:
Sekali lagi, implementasi ini meniru verifikasi serial sebuah
software, tetapi tentu saja, dibuat se-sederhana mungkin, agar proses
kriptografinya lebih menonjol. Jadi, implementasi ini bersifat sebagai
“penerima” pesan, kemudian mencoba men-decrypt pesan tersebut dan
mem-verikasikan apakah pesan tersebut berasal dari “pengirim” pesan yang
sah atau tidak.
File-file yang terdapat dalam implementasi ini,
tidak jauh berbeda dengan yang berada pada implementasi kriptografi satu
arah, hanya library metoda yang bersangkutan yang berubah. Kode utama,
lagi-lagi terletak di “Unit1.pas”. Mari kita buka kode tersebut untuk
mulai membedah implementasi ini.
Baris 33 sampai dengan 87,
menunjukkan dua fungsi untuk men-decrypt dengan masing-masing metoda.
Proses decrypt kedua metoda dibuat seragam dengan tujuan menghindari
kebingungan, dan yang pasti bukan bentuk baku. Yang berbeda tentu saja
algorithma inti masing-masing metoda yang terdapat di file *.pas
masing-masing. Dikarenakan penyeragaman ini, pembahasan satu metoda bisa
mewakili metoda yang satunya.
Pada baris 35 dapat kita lihat,
inisialisasi konstanta key yang disiapkan untuk proses decrypt. Key
dibuat dengan format array dari byte dengan lebar 16. Atau, dengan kata
lain, key memiliki panjang 16 byte, atau 128 (16*8) bit. Yang perlu
dicatat adalah, bahwa dalam Delphi, notasi “$” menunjukkan bahwa angka
yang ditulis dalam bentuk hexadecimal. Jadi, pendeklarasian array
tersebut bisa saja ditulis seperti ini :
key : array[0..15] of byte = (71,114,105,110,100,83,116,111,110,101,73,115,71,111,111,100);
Pendeklarasian
array diatas menggunakan notasi desimal, dengan nilai yang sama. Lalu,
mengapa dalam implementasi ditulis dengan notasi hexadecimal? I just
love hex, nothing more.
Oke,
mari kita lihat di baris 39 dan 40. Di situ dideklarasikan dua variable
array untuk menampung input dan output dari proses decrypt ini. Karena
yang dilakukan saat ini adalah proses decrypt, maka input adalah Cipher
Text yang ditampung pada variable arrCipher, sedangkan output adalah
Plain Text yang ditampung pada variable arrPlain. Kedua variable
tersebut dibuat dengan panjang yang sama yaitu 8 byte. Hal ini perlu
dicatat, karena akan berpengaruh pada penggunaan fungsi ini, kita akan
sampai ke sana nanti.
Fungsi decrypt ini menerima parameter dalam
bentuk String sebagai input, seperti yang terlihat pada baris 33,
sedangkan variable yang di-input ke proses decrypt inti berbentuk array
dari byte, seperti yang terlihat pada baris 51. Maka, baris 44 sampai
48, bertugas untuk meng-convert variable String menjadi array of byte.
Ada banyak metode yang bisa digunakan untuk tugas ini, seperti misalnya
mengambil nilai ASCII dari masing-masing karakter di dalam string, lalu
menyimpannya ke dalam array of byte. Tetapi, dalam implementasi ini,
metode yang akan digunakan adalah, mengambil setiap 2 (dua) karakter
dari string, lalu ditambahkan notasi “$” di depannya untuk kemudian di
rubah kedalam bentuk byte (integer) dan disimpan ke dalam array. Dan hal
ini dilakukan dengan loop sebanyak 8 (0-7)putaran, karena panjang
variable penampung yang ada (
arrCipher)
adalah 8. Karena itu, panjang String yang valid untuk di-input ke dalam
fungsi ini adalah 16 (8*2) karakter, dan karakter yang ada haruslah
karakter bilangan hexadecimal, yaitu 1-9 dan A-F. Mari kita ambil contoh
untuk memperjelas :
Misalkan, string yang di-input adalah :
“1234567890ABCDEF”
Maka array of byte yang terbentuk adalah :
($12, $34, $56, $78, $90, $AB, $CD, $EF)
atau dalam bentuk desimal adalah :
(18, 52, 86, 120, 144, 171, 205, 239)
Semoga contoh di atas cukup jelas untuk menggambarkan “aliran” algo konversi tersebut.
Baris
49 sampai 52 merupakan kode untuk melakukan proses inti decrypt yang
diwajibkan oleh library DCPCrypt ini. Dan hasil dari proses decrypt inti
ini ditampung di variable arrPlain yang berbentuk array of byte. Baris
53 mempersiapkan (mengosongkan) variable strResult yang akan menampung
hasil dari fungsi decrpyt ini. Jika pada input tadi kita meng-convert
dari variable String ke array of byte, sekarang untuk output kita
lakukan kebalikannya, merubah variable array of byte ke String. Dan
itulah yang dilakukan pada baris 54 sampai 57.
Metode yang
digunakan sekarang adalah mengambil setiap byte dari array, lalu
men-subtitusikannya dengan karakter yang memiliki nilai ASCII yang
bersangkutan, untuk kemudian ditambahkan di variable strResult. Metode
ini lebih simpel dari metode sebelumnya, tetapi mari kita ambil contoh
untuk lebih memperjelas :
Misalkan, dalam variable arrPlain adalah :
(71, 119, 84, 97, 109, 112, 97, 110)
maka dalam variable strResult akan terbentuk :
“GwTampan”
Semoga contoh di atas bisa memperjelas apa yang sebenarnya sudah cukup jelas. ;D
Demikianlah
penjelasan tentang fungsi yang digunakan untuk melakukan decrypt.
Fungsi tersebut perlu dipahami sepenuhnya jika kita ingin membuat proses
encrypt yang diperlukan untuk membuat keygen dari “software” verifikasi
ini. Kita akan bahas hal tersebut dalam implementasi berikutnya. Untuk
saat ini, mari kita masuk pada fungsi inti dari program ini, yang
dieksekusi pada saat user menekan tombol “Check”.
Fungsi tersebut,
tentu saja, terletak pada baris 89 sampai 144. Terlihat banyak
percabangan “if” di sana, yang mungkin membingungkan sebagian orang.
Bila itu yang terjadi, dengan segala kerendahan hati, saya mohon maaf
atas buruknya cara pemogramman saya. Tapi saya rasa,
percabangan-percabangan ini tidak perlu dibahas semua, karena hanya
untuk mengecek kesalahan-kesalahan dasar input dari user. Yang patut
dibahas adalah percabangan pada baris 113. Disitu terlihat bahwa jika
“Nama” yang diinput user lebih dari 8 karakter, maka yang diambil
hanyalah 8 karakter pertama saja. Dan jika “Nama” yang diinput kurang
dari 8 karakter, maka variable tersebut digandakan terus-menerus sampai
lebih dari 8, untuk kemudian diambil 8 karakter pertamanya. Lagi-lagi,
contoh untuk memperjelas :
Misalkan, nama yang diinput adalah :
“CryptographyIsSuperFun”
maka, yang diambil hanyalah :
“Cryptogr”
Dan, jika nama yang diinput adalah :
“FUN”
maka, hasilnya akan menjadi :
“FUNFUNFU”
Dengan
ini, kita “memaksa” variable strName untuk tetap memiliki panjang 8
karakter, tidak peduli berapa karakter yang diinput oleh user. Kenapa?
Sebelum dijawab, saya harap anda masih ingat karakteristik dari fungsi
decrypt di atas tadi, input yang valid haruslah string dengan 16
karakter (ini menjelaskan percabangan pada baris 107), dan ouput yang
dihasilkan adalah string dengan 8 karakter. Dan pada baris 133, terdapat
“final check” yang membandingkan variable strName dengan strPlain yang
merupakan hasil Decrypt dari Serial yang diinput. Otomatis, strPlain
akan selalu memiliki panjang 8 karakter, karena itulah kita perlu
“memaksa” strName untuk tetap memiliki panjang 8 karakter.
Sebenarnya
ada sedikit “bug” yang cukup mengganggu pada implementasi ini. Yaitu,
bila kita memasukkan serial dengan panjang 16 karakter, tapi karakter
yang diinput bukanlah karakter hexadecimal, maka akan muncul pesan error
yang kurang bagus.

Tapi tentu saja, hal tersebut bisa diatasi dengan menambahkan
percabangan yang mengecek apakah serial yang diinput merupakan karakter
hexadecimal atau bukan. Anda bisa menambahkannya bila anda mau!

Yap,
demikianlah salah satu contoh implementasi proses decrypt yang meniru
proses verifikasi serial sebuah software. Untuk melengkapinya, yang
tersisa adalah proses encrypt yang akan diterapkan pada keygen untuk
verifikasi ini.
Oke, implementasi untuk proses encrypt bisa di download pada :
Dalam implementasi ini, jika kita mengeksekusi file “exe”, maka kita
bisa meng-generate serial yang valid untuk implementasi verifikasi
sebelumnya. Karena memang, implementasi ini bertindak sebagai keygen
atau dengan kata lain sebagai “pengirim” pesan. Sedangkan implementasi
sebelumnya bertindak sebagai “penerima” pesan.
File-file yang ada
dalam implementasi ini sama dengan yang ada di implementasi verifikasi,
hanya file “exe” dan “Unit1.pas” yang berbeda, karena implementasi ini
menggunakan library dari metoda yang sama dengan implementasi
verifikasi. Mari kita buka kode utama implementasi ini di dalam
“Unit1.pas” untuk memulai pembedahan kode yang mengasyikan ini.
Yang
patut diingat sebelum melakukan pembedahan adalah, bahwa proses
pembuatan implementasi keygen ini saling bergantung dengan kode pada
implementasi verifikasi. Dan, kita harus melihat bahwa kode keygen ini
saling bertolak belakang dengan verifikasi. Yang artinya, jika
verifikasi melakukan “buka”, maka keygen melakukan “tutup”, jika
verifikasi melakukan “tambah”, maka keygen melakukan “kurang”, dst.
Oke,
kita mulai pembedahannya. Kita bisa lihat pada baris 33 sampai 83,
terdapat dua fungsi encrypt yang, tentu saja, dibuat seragam, seperti
halnya pada implementasi verifikasi. Dan ya, seperti sebelumnya,
pembahasan satu metoda bisa mewakili metoda yang satunya. Baris 35
menunjukkan konstanta key yang memang harus sama nilainya dengan proses
decrypt, agar kedua proses tersebut saling berhubungan.
Karena
proses encrypt ini bertolak belakang dengan proses decrypt, maka kita
akan melakukan pembahasan secara terbalik dari bawah ke atas, sambil
me-review kode verifikasi. Jadi ada baiknya, jika kita buka kode
verifikasi (decrypt) dan keygen (encrypt) secara bersamaan, kecuali jika
anda memang sudah hafal dan paham kode verifikasi secara keseluruhan.
Pada
baris 44 sampai 48 di kode verifikasi, seperti yang telah dibahas,
bahwa fungsi decrypt mengambil setiap dua karakter dari string yang
di-input atau cipher text untuk kemudian merubahnya menjadi nilai hex
dan menyimpannya ke dalam array of byte. Maka, agar fungsi encrypt kita
menghasilkan cipher text yang valid untuk proses tersebut, kita harus
melakukan fungsi sebaliknya, ya, merubah array of byte menjadi string
dengan format hex. Baris 51 sampai 55 melakukan hal tersebut. Fungsi
built-in Delphi “IntToHex” menghasilkan representasi hex dari integer
(atau byte) yang diinput. Untuk contoh, silahkan review contoh di atas
pada proses verifikasi, tetapi baca dari bawah ke atas.
Kemudian
pada baris 49 sampai 52 di kode verifikasi, fungsi decrypt melakukan
fungsi inti decrypt sesuai dengan metoda yang dipakai terhadap array of
byte hasil konversi dari string yang di-input tadi(cipher text). Maka
pada baris 47 sampai 50 di kode keygen, fungsi encrypt harus melakukan
fungsi inti encrypt sesuai dengan metoda yang dipakai terhadap array of
byte yang nantinya akan di konversi menjadi string output(cipher text),
seperti yang telah dibahas pada paragraf sebelumnya.
Lalu pada
baris 54 sampai 57 di kode verifikasi, fungsi decrypt mengkonversi lagi
array of byte yang telah di “decrypt” ke dalam bentuk string, tetapi
kali ini dengan cara subtitusi nilai byte dengan nilai ASCII yang
bersangkutan, atau dengan kata lain melakukan konversi byte to ASCII.
Maka, fungsi encrpyt kita harus melakukan kebalikannya, yap, konversi
ASCII to byte. Baris 43 sampai 46 pada kode keygen menunjukkan hal
tersebut, dan ya, fungsi built-in Delphi “Ord” menolong kita untuk
melakukan hal tersebut. Dan lagi-lagi, untuk contoh, silahkan lihat
contoh “GwTampan” di atas dari bawah ke atas.
Begitulah isi dari
fungsi encrypt yang merupakan kebalikan dari fungsi decrypt. Anda bisa
menutup kode verifikasi sekarang, jika anda mau. Berikutnya, mari kita
bahas penggunaan dari fungsi encrypt ini, pada saat user menekan tombol
“G 3 N” yang terletak pada baris 85 sampai 119.
Tidak banyak yang
dilakukan dalam kode ini. Baris 97 sampai 108 melakukan hal yang sama
dengan yang ada pada kode verifikasi, yaitu memaksa plain text agar
tetap memiliki panjang 8 karakter, seperti yang telah dibahas
sebelumnya. Dan, jika anda belum menyadarinya, untuk nama
“CryptographyIsFun” dan “CryptographyIsSuck” akan menghasilkan serial
yang sama, dikarenakan unsur pemaksaan ini. Lalu pada baris 109 sampai
117, kode melakukan encrypt kepada nama (plain text) yang diinput
menjadi cipher text yang kemudian di-output menjadi serial.
Demikianlah
keseluruhan proses implementasi dari kriptografi dengan key simetris
ini. Dan oke, untuk lebih memperjelas lagi, mari kita rangkum
keseluruhan proses dengan arah yang “lurus” atau dari encrypt sampai
decrypt. Kali ini sang keygen akan kita sebut pengirim, dan sang
verifikator akan kita sebut penerima.
Pertama, pengirim
men-encrypt nama yang di-input untuk kemudian di-output menjadi serial.
Lalu, pengirim mengirimkan pasangan nama dan serial ini kepada penerima.
Kemudian, penerima mengecek pasangan nama dan serial yang dikirimkan
dengan cara, men-decrypt serial untuk kemudian dibandingkan dengan nama.
Jika cocok, maka pasangan nama dan serial tersebut valid dan memang
berasal dari pengirim yang sejati, jika tidak cocok, maka pengirim
tersebut palsu.
Yap, seperti itulah salah satu contoh implementasi
kriptografi dua arah dengan key simetris. Mohon maaf bila penjelasannya
terkesan berbelit-belit dan membingungkan, tetapi saya telah mencoba
yang terbaik untuk menjelaskan hal yang memang sangat teknis ini. Dan
ya, coba “rasakan” bagaimana kode ini mengalir, agar lebih mudah
memahaminya.
To be continued…
Sumber : http://www.binushacker.net/