Jumat, 19 September 2014

Kriptografi dua arah menggunakan metode Symetric Key dengan Borland Delphi 7

////////////////////////////////////
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:

https://www.dropbox.com/s/umrys99u49u4p0f/SymetricKeygen.rar?dl=0

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. :D 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! :D :)
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 :

https://www.dropbox.com/s/lz3xe8svhnoebu6/SymetricVerification.rar?dl=0


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/

0 komentar:

Posting Komentar

Copyright © 2014 Aula Media Indonesia | Designed With By Blogger Templates
Scroll To Top