1.
Pendahuluan
Adanya perkembangan teknologi yang sangat pesat pada masa sekarang, membuat manusia membutuhkan suatu sistem informasi untuk mempermudah mengakses, mengirim, atau bertukar informasi pada suatu instansi ataupun perusahaan yang sesuai dengan kebutuhan. Kemajuan sistem informasi memiliki banyak keuntungan tetapi juga rawan dari hal yang negatif seperti pencurian informasi. Misalnya pada sebuah perusahaan, beberapa informasi yang sifatnya rahasia dan hanya boleh diketahui oleh orang-orang tertentu dalam sebuah perusahaan tersebut seperti informasi tentang cara membuat produk yang sedang dikembangkan. Seandainya data yang berisi informasi tersebut jatuh kepada pihak lawan bisnis, maka perusahaan akan mengalami kerugian. Untuk mengantisipasi hal yang tidak diinginkan seperti pencurian informasi, maka dibutuhkan suatu sistem untuk mengamankan suatu informasi. Keamanan informasi yang terkomputasi merupakan suatu masalah yang amat penting bagi sebuah perusahan, lembaga, perguruan tinggi maupun individu. Sistem untuk mengamankan informasi pada masalah ini dapat memanfaat kriptografi. “Menurut Bruce Schneier, kriptografi adalah ilmu dan seni untuk menjaga keamanan pesan”[1]. Algoritma kriptografi modern dapat dibagi menjadi dua algoritma kunci yaitu algoritma kunci simetris dan algoritma asimetris. Algoritma simetris adalah algoritma yang menggunakan kunci enkripsi dan dekripsi yang sama. Sedangkan algoritma asimetris adalah algoritma yang menggunakan kunci enkripsi dan dekripsi yang berbeda. Adapula algoritma yang beroperasi dalam mode bit dapat dibagi menjadi dua, yaitu stream chiper (cipher aliran) dan block cipher (cipher blok). Stream cipher adalah algoritma yang melakukan operasi dalam bentuk bit tunggal. Sedangkan block cipher adalah algoritma yang melakukan operasi dalam bentuk blok bit. Stream cipher dan block cipher adalah algoritma yang digunakan pada algoritma kunci simetris. Saat ini sudah banyak aplikasi enkripsi yang menggunakan algoritma kunci simetris. Salah satu algoritma dengan kunci simetris adalah DES (Data Encryption Standards). DES merupakan algoritma enkripsi standart yang dikeluarkan oleh National Institute of Standards and Technology (NIST). NIST mengadakan Advanced Encryption Standard (AES) sebagai standart baru. Salah satu kandidat AES adalah algoritma twofish dibuat oleh Bruce Schneier. Twofish memenuhi semua kriteria yang dibutuhkan NIST, yaitu 128-bit block, 128 bit, 192 bit dan 256 bit kunci. Beberapa kelebihan twofish yaitu twofish adalah cipher blok 128 bit yang menerima kunci dengan panjang variabel 256 bits, twofish tidak mengandung kunci lemah, dan twofish telah didesain dari awal dengan menekankan pada kinerjanya. Twofish sangat efisien diimplementasikan pada beragam platform, yaitu CPU 32 bit, smart card 8 bit, dan perangkat keras VLSI. Hasilnya merupakan algoritma yang sangat fleksibel yang dapat diimplementasikan secara efisien dalam beragam aplikasi kriptografi [2]. Berdasarkan latar belakang tersebut, akan dilakukan penelitian mengenai algoritma kriptografi Twofish, dengan mengambil judul penelitian “Perancangan dan Implementasi Kriptosistem Data Menggunakan Algoritma Twofish”, yang
akan membahas mengenai proses enkripsi dan dekripsi pada data teks dan data gambar dengan menggunakan algoritma Twofish.
2.
Tinjauan Pustaka
Penelitian terdahulu tentang “Studi Enkripsi dan Dekripsi file dengan menggunakan Algoritma Twofish”. Berdasarkan pembahasan dari penelitian yang dilakukan sebelumnya menyebutkan, bahwa Algoritma Twofish dapat diimplementasikan untuk enkripsi dan dekripsi data, dengan menguji data .Doc, .Pdf, .JPG, PPT, dan MP3. File yang dienkripsikan menjadi karakter yang acak sehingga menjadi file yang rusak [3]. Terdapat juga penelitian sebelumnya yang dilakukan yaitu “Studi dan Implementasi Enkripsi Pengiriman Pesan Suara Menggunakan Algoritma Twofish”. Dalam penelitian yang dilakukan, peneliti menyimpulkan 3 hal yaitu algoritma Twofish merupakan algoritma yang dapat diterapkan untuk enkripsi aliran pesan suara dengan cukup baik setelah mengalami modifikasi pada mode operasinya. Kualitas suara setelah mengalami kompresi dan enkripsi tetap memiliki kualitas yang cukup baik. Delay yang dihasilkan meskipun tetap terasa, dapat dianggap tidak terlalu menggangu karena di bawah 250 milidetik dan suara yang dihasilkan dapat didengar tanpa terputus-putus [4]. Berdasarkan penelitian yang pernah dilakukan tentang algoritma twofish, maka akan dilakukan penelitian tentang penerapan algoritma twofish pada enkripsi dan dekripsi semua jenis data file, dengan panjang kunci 128 bit, serta hasil enkripsi berbentuk hexadecimal. Kriptosistem dengan Twofish akan dianalisis dengan melihat proses yang terjadi, terkait kunci yang digunakan, proses enkripsi dan dekripsi, pada data file. Selanjutnya akan dilihat perbandingan antara waktu proses enkripsi dan dekripsi, ukuran file setelah kedua proses tersebut diimplementasikan, serta perbandingan nilai heksadesimal antara file asli, file hasil enkripsi, dan file hasil dekripsi Penelitian yang dilakukan diharapkan dapat bermanfaat dalam memberikan keamanan suatu data dan informasi yang dimiliki, berupa penyandian data dan informasi menjadi sesuatu yang tidak terbaca oleh pihak yang tidak berhak; juga bermanfaat dalam memberikan tambahan informasi terkait kunci, proses enkripsi dan dekripsi yang terjadi pada algoritma twofish.
Algoritma Twofish Berdasarkan Schneier, dkk. (1998), twofish merupakan salah satu peserta AES yang telah memenuhi kriteria National Institute of Standard and Technology (NIST), dimana kriteria itu antara lain adalah blok sebesar 128 bit, dapat menggunakan key sepanjang 128 bit, 192 bit, dan 256 bit, efisien untuk diimplementasikan ke dalam berbagai spesifikasi komputer, memiliki variasi dalam performa yang disebabkan oleh adanya key schedule, dan lain-lain. Twofish menggunakan struktur Feistel 16-round dengan whitening tambahan dalam input dan output. Satu-satunya elemen yang bukan Feistel adalah rotasi 1 (satu) bit. Rotasi tersebut dapat dipindahkan ke fungsi F untuk menciptakan output berjalan. Plaintext dipecah menjadi empat buah word 32-bit. Pada whitening input, keempat word itu di XOR-kan dengan empat key word, dan diikuti dengan keenam
belas round. Dalam tiap round, dua word di kiri, digunakan sebagai input fungsi g (Salah satunya dirotasikan dengan 8 bit terlebih dahulu). Algoritma Twofish menggunakan struktur jaringan Feistel. Jaringan Feistel yang digunakan oleh Twofish terdiri atas 16 perulangan. Fungsi f pada algoritma twofish terdiri dari beberapa tahap yaitu : Fungsi g, yang terdiri dari 4 s-box dan matriks MDS; Pseudo-Hadamard Transformatio; Penambahan hasil PHT dengan kunci. Unsur Pembangun Algoritma Twofish Unsur pembangun twofish terdiri dari feistel network (jaringan feistel), s-boxes, matriks MDS, transformasi pseudo-hadamard (PHT), whitening, dan key schedule (penjadwalan kunci). Penjabaran dari unsur-unsur pembangun twofish, dijelaskan sebagai berikut: Feistel Network (Jaringan Feistel) Schneier (1998) menjelaskan bahwa “sebuah Fietsel Network adalah metode umum untuk mentransformasi suatu fungsi menjadi bentuk permutasi. Bagian paling fundamental dari Jaringan Fietsel adalah fungsi F: sebuah pemetaan keydependent dari suatu input string menjadi output string. Dalam Twofish dilakukan Fietsel Network sebanyak 16 kali.” Pada twofish, jaringan feistel terdiri dari Input Whitening, S-boxes, Transformasi Pseudo Hadamard (PHT), dan Output Whitening. S-Boxes “Sebuah S-box adalah operasi subsitusi table-driven non linear yang digunakan dalam block cipher. S-boxes bervariasi antara setiap ukuran input dan ukuran output-nya, dan bisa diciptakan secara random atau dengan algoritma. Twofish menggunakan empat bijective, key-dependent dan 8-by-8-bit S-boxes. S-boxes ini dibuat menggunakan dua permutasi 8-by-8-bit dan material key.” (Schneier dkk, 1998). Matrik MDS Code Maximum Distance Separable (MDS) melalui sebuah pemetaan linear dari elemen field a ke elemen field b, menghasilkan campuran dari vector a+b elemen, dengan properti jumlah minimum angka tidak nol dalam vector tidak nol paling kurang b+1. Dengan kata lain “Distance” adalah jumlah elemen yang berbeda antara dua vector yang berbeda yang dihasilkan oleh MDS paling kurang b+1. Pemetaan MDS bisa direpresentasikan oleh matriks MDS yang terdiri dari a x b elemen (Schneier dkk, 1998: 5). Transformasi Pseudo-Hadamard (PHT) Transformasi Pseudo-Hadamard (PHT) adalah operasi sederhana yang bekerja dengan cepat dalam software. Diberikan dua input, a dan b, dan PHT 32 bit didefinisikan sebagai : A0 = a + b mod 232 B0 = a + 2b mod 232 Twofish menggunakan PHT 32 bit untuk melakukan mixing terhadap output-nya dari dua buah fungsi g 32 bit parallel. PHT ini dapat dieksekusi dalam dua opcode di atas kebanyakan microprocessor modern, termasuk keluarga Pentium. (Schneier dkk, 1998).
Whitening Schneier (1998:5) menjabarkan bahwa “whitening merupakan teknik meng-XORkan key material sebelum ronde pertama dan sesudah ronde terakhir. Dalam serangan terhadap Twofish, terbukti bahwa whitening secara substansial meningkatkan kesulitan menyerang cipher, dengan jalan menyembunyikan input spesifik untuk awal dan akhir ronde dari Twofish.” Key Schedule (Penjadwalan Kunci) “Key schedule adalah suatu cara dimana bit-bit key diubah menjadi key-key bulat yang dapat digunakan oleh cipher. Twofish memerlukan material key yang sangat banyak, dan memiliki key schedule yang rumit” (Schneier dkk, 1998:5). Jadi secara singkat, key schedule (penjadwalan kunci) adalah proses pengacakan kunci untuk melakukan proses enkripsi sehingga tingkat kerumitannya menjadi tinggi. Fungsi F Fungsi F adalah permutasi yang bergantung pada kunci dengan nilai 64 bit. Fungsi ini menerima 3 (tiga) argumen, dua buah 32 bit R0 dan R1, dan nomor putaran untuk menentukan subkunci mana yang dipakai. R0 akan diserahkan ke fungsi g yang akan mengembalikan T0. R1 akan digeser sejauh 8 bit, yang kemudian diberikan juga ke fungsi g yang akan mengembalikan T1. Hasil T0 dan T1 kemudian dikombinasikan ulang menggunakan transformasi pseudoHadamard, yang kemudian ditambahkan dengan dua buah 32 bit dari kunci. T0 = g(R0) T1 = g(shiftLeft(R1,8)) F0 = (T0+T1+K2r+8) mod 232 F1 = (T0+2T1+K2r+9) mod 232 F0 dan F1 adalah hasil dari F, yang masing-masing sepanjang 32 bit. Hasil keluaran ini nantinya akan dipertukarkan dan dimasukkan kembali ke putaran selanjutnya. Fungsi G Fungsi g merupakan jantung dari keseluruhan algoritma twofish. 32 bit masukan X dari fungsi F dipecah menjadi 4 buah yang masing-masing sepanjang 8 bit. Setiap 8 bit kemudian diproses dengan kotak S yang bersesuaian. Setiap kotak S bersifat bijektif, yaitu menerima 8 bit dan mengeluarkan 8 bit pula. 4 buah 8 bit hasil keluaran, kemudian dikalikan dengan matriks Most Distance Separable (MDS) 4x4. Hasil pengalian kemudian diartikan sebagai 32 bit, yang merupakan keluaran dari fungsi g, yang kemudian akan dikembalikan ke fungsi f. Algoritma Twofish terdiri dari 3 (tiga) tahapan proses, yaitu penjadwalan kunci, proses enkripsi, dan proses dekripsi. Langkah-langkah dalam proses penjadwalan kunci pada algoritma twofish, adalah sebagai berikut : Sebelum melalui tahapan enkripsi, maka harus melalui penjadwalan kunci. 1. Panjang kunci yang didefinisikan twofish sepanjang 128 bit, 192 bit, dan 256 bit. Apabila input kunci yang dimasukkan kurang dari ketentuan tersebut, maka akan ditambahkan zero byte sampai panjang kunci memenuhi ketentuan tersebut.
2.
3.
4.
Setelah itu, kunci dibagi menjadi vektor Me, Mo, dan S. Vektor Me dan Mo digunakan pada fungsi h sebagai list, sedangkan vektor S digunakan untuk tahap enkripsi pada fungsi g. Memasukkan masing-masing word kunci Kj yang diekspansi, yaitu 2i dan 2i+1 ke dalam fungsi h, yaitu melalui permutasi q0 dan q1 dilanjutkan dengan matrik MDS. Hasil dari word 2i melalui proses PHT, sedangkan word 2i+1 sebelum melalui proses PHT dilakukan rotasi ke kiri sejauh 8 bit. Maka hasil dari proses tersebut menjadi kunci yang sudah terjadwal.
Gambar 1. Diagram Fungsi h (Schneier, 1998 : 9)
Langkah-langkah dalam proses enkripsi pada algoritma twofish, adalah sebagai berikut : 1. Input plaintext sebesar 128 bit akan dibagi menjadi empat word yaitu P0, P1, P2, dan P3, yang masing-masing sebesar 32 bit. P0 dan P1 akan menjadi bagian kiri, sedangkan P2 dan P3 akan menjadi bagian kanan. 2. Plaintext akan melalui proses input whitening (Gambar 2) yaitu input akan di-XOR dengan empat word kunci yang telah terjadwal yaitu K0, K1, K2, dan K3. Secara formalnya adalah sebagai berikut : Ro,i = Pi xor Ki i = 0, …, 3
Gambar 2. Proses Whitening
3.
4.
5.
Proses berikutnya, input akan melalui proses pada fungsi F yang meliputi di dalamnya adalah fungsi g, dan dilanjutkan dengan PHT (pseudo hadamard transform), dan dilakukan penambahan hasil PHT dengan kunci. Proses fungsi F tersebut dilakukan secara bertahap. R0 dan R1 yang merupakan hasil whitening akan menjadi input untuk fungsi F. R0 dan R1 akan dimasukkan ke dalam fungsi g yang merupakan bagian awal dari fungsi F. Untuk R1, sebelum dimasukkan ke dalam fungsi g akan dirotasi ke kiri sejauh 8 bit. R0 dan R1 melalui S-box, dan selanjutnya akan dikalikan dengan matriks MDS. Hasil dari fungsi g ini masing-masing menjadi T0 dan T1 . T0 dan T1 akan melalui proses PHT yang merupakan penggabungan T0 dan T1 dimana T0 + T1 dan T0 + 2T1. Setelah itu hasil dari PHT tersebut masingmasing akan ditambahkan dengan kunci yang sudah terjadwal yaitu K2r+8 dan K2r+9. Hasil dari fungsi F adalah F0 dan F1, maka dengan demikian fungsi F (Gambar 3) telah terpenuhi.
Gambar 3 Fungsi F
6.
7. 8.
Setelah itu, F0 dan F1 masing-masing di-XOR dengan R2 dan R3. Hasil dari R2 XOR F0 dirotasi ke kanan sejauh 1 bit. Sedangkan R3 XOR F1, sebelumnya R3 dirotasi ke kiri sejauh 1 bit. Setelah itu, akan dilakukan iterasi sebanyak 16 kali. Setiap iterasi sama dengan proses sebelumnya. Hasil dari swap blok terakhir (Gambar 4) adalah penukaran bagian kanan dan kiri yang di-undo.
9.
Hasil dari 16 round enkripsi akan melalui output whitening, yaitu proses peng-XOR-an 16 round enkripsi dengan K4, K5, K6, dan K7.
Gambar 4. Swap Blok Terakhir dan Output Whitening
Langkah-langkah dalam proses dekripsi pada algoritma twofish, sama dengan proses enkripsi, tetapi hanya arahnya saja yang berlawanan. Proses yang dilalui secara berurutan yaitu : output whitening, swap blok trakhir, 16 iterasi dekripsi, dan input whitening. Input untuk proses dekripsi adalah ciphertext dan kunci, untuk memperoleh plaintext. Kunci untuk dekripsi sama dengan dengan kunci enkripsi, karena algoritma twofish merupakan algoritma kriptografi dengan kunci bersifat simetris. 3.
Metode dan Perancangan Sistem
Prototype Model adalah metode pengembangan perangkat lunak yang banyak digunakan. Metode ini memungkinkan adanya interaksi antara pengembang sistem dengan pengguna sistem nantinya, sehingga dapat mengatasi ketidakserasian antara pengembang dan pengguna. Bagan mengenai prototype model dapat dilihat pada Gambar 5.
Gambar 5 Bagan Prototype Model [6]
1.
Tahap-tahap dalam Prototype Model adalah sebagai berikut: Listen to Costumer; Pada tahap ini dilakukan analisis terhadap permasalahan yang ada, yaitu mendapatkan data dan literatur yang terkait dengan proses
enkripsi dan dekripsi terhadap data file, menggunakan algoritma twofish; melalui dokumen dan referensi yang ada. 2. Build; Selanjutnya setelah memperoleh data dan mengetahui proses enkripsi dan dekripsi dengan twofish, langkah berikutnya adalah membuat perancangan proses enkripsi dan dekripsi dengan menggunakan Data Flow Diagram (DFD) dan flowchart. Proses enkripsi dan dekripsi diterapkan pada semua data file. Kunci yang digunakan sesuai dengan ketentuan algoritma twofish yaitu 128 bit, dengan penyesuaian pada masukan panjang data kunci yang bersifat fleksibel. Modifikasi juga dilakukan untuk hasil enkripsi yaitu berupa heksadesimal. Pada proses pembentukan kunci, begitu juga pesan yang akan dienkripsi, jika tidak sesuai dengan ketentuan algoritma twofish, maka akan dilakukan penyesuaian. Penyesuaian dilakukan karena algoritma twofish merupakan algoritma yang berjenis block cipher. Pada algoritma twofish penyesuaian panjang data kunci menggunakan padding yaitu penambahan bit 0, sedangkan dalam penelitian ini penyesuaian untuk panjang data kunci dilakukan melalui proses pengulangan kunci, ide ini didasarkan pada konsep substitusi berulang pada algoritma vigenere cipher. Sedangkan penyesuaian untuk panjang data plaintext, dilakukan melalui proses padding, yaitu penambahan bit 0, pada block yang tidak mencapai 16 byte. Pada tahap ini juga, dilakukan perancangan user interface. 3. Costumer Test Pada Tahap ini dilakukan pengujian sistem, yaitu menjalankan proses implementasi sistem, dengan menguji data file, yaitu data .doc, .pdf, .jpeg, .png, dan .mp3. Pada tahap ini juga akan diuji apakah hasil yang diberikan oleh kriptosistem sudah sesuai dengan konsep kriptografi dan algoritma twofish, menguji waktu proses yang digunakan, serta perubahan ukuran file, setelah proses enkripsi dan dekripsi dijalankan. Perancangan Sistem Perancangan sistem merupakan gambaran, dan perancangan dari sistem yang akan dibuat. Pada bagian ini, tool yang digunakan adalah Data Flow Diagram (DFD). DFD digunakan untuk menggambarkan hubungan sistem dengan lingkungan, mulai dari proses masukan hingga menjadi keluaran. Data Flow Diagram (DFD) Diagram konteks atau DFD level 0 dipakai untuk menggambarkan interaksi dan aliran data yang berlangsung antara entitas di luar sistem dengan sistem itu sendiri. Bagan diagram konteks dari aplikasi ini terlihat pada Gambar 6.
Gambar 6 Diagram Konteks
Diagram konteks sistem pada Gambar 6, dapat dijelaskan sebagai berikut. User memasukkan plaintext untuk dilakukan proses enkripsi. Sistem akan
memberikan plain yang telah dienkripsi dan kunci hasil enkripsi. User memasukkan cipher hasil enkripsi dan kunci ke dalam sistem, dan sistem akan memberikan output berupa plain hasil dekripsi. Proses yang ada pada diagram konteks kemudian diuraikan dalam bentuk yang lebih luas, yaitu DFD level 1. Dalam DFD level 1, diuraikan secara bertingkat dimana peringkat yang lebih tinggi mendeskripsikan secara lebih rinci apa yang dilakukan masing-masing proses.
Gambar 7 Diagram DFD Level 1
Gambar 7 menunjukkan DFD level 1 dari sistem, yang dapat dijelaskan sebagai berikut. Pada level 1 dari sistem ini terdapat dua proses, proses enkripsi dan proses dekripsi. Pada proses enkripsi, User memasukkan plain ke dalam sistem, dan sistem akan memberikan output berupa data yang telah dienkripsi, dan kunci yang digunakan saat proses enkripsi. Pada proses dekripsi, user memasukkan cipher yang merupakan hasil enkripsi yang akan didekripsi, beserta kunci ke dalam sistem, dan sistem akan memberikan output berupa data yang telah didekripsi kepada user. Proses enkripsi dan dekripsi dengan algoritma Twofish Pada penelitian ini, kunci yang digunakan adalah kunci dengan panjang 128 bit. Aplikasi yang dikembangkan pada penelitian ini, memberikan fleksibilitas penggunaan teori dalam aplikasi, berupa proteksi/error trapping terhadap panjang data yang dimasukkan sebagai kunci. Jika data yang dimasukkan dalam isian kunci, tidak dalam panjang 128 bit, maka akan dilakukan penyesuaian untuk mencapai 128 bit, sehingga tidak muncul error pada proses pembuatan kunci. Hal berikutnya yang dimodifikasi dalam penelitian ini adalah pada hasil enkripsi (ciphertext) dari algoritma twofish. Ciphertext yang dihasilkan oleh algoritma Twofish, berbentuk array of byte, yaitu data berupa karakter-karakter yang tidak dapat dicetak, misalnya karakter white space. Dengan alasan inilah sehingga dilakukan proses mengubah nilai tiap elemen tersebut menjadi karakter hexadecimal. Langkah-langkah proses penjadwalan kunci ke dalam 128 bit kunci (16 byte, dimana 1 karakter 1 byte) di dalam sistem, adalah sebagai berikut: 1. Simpan kunci dalam variabel byte array. -> byte[ ] kunci. 2. Buat 1(satu) variable array penampung dengan panjang 16 byte. -> byte[16] buffer. 3. Inisialisasi variable index i dan j, dengan nilai masing-masing adalah 0. 4. Lakukan perulangan selama nilai i kurang dari panjang kunci Salin nilai kunci ke-i ke dalam buffer ke-j ( buffer[j] := kunci[i])
Increment nilai variable index i dan j sebesar 1. (i:=i+1, j:=j+1) Jika panjang j sama dengan panjang kunci, reset nilai j menjadi 0, dengan maksud supaya pembacaan kunci dimulai dari depan lagi. Karena ketika nilai j = panjang kunci, berarti pembacaan sudah sampai di belakang. 5. Ulangi langkah 4 sampai i bernilai 16 6. Output buffer Proses penjadwalan kunci dalam bentuk flowchart, ditunjukkan pada Gambar 8.
Gambar 8 Flowchart Proses Pembentukan Kunci
Kriptosistem yang dibangun, berfungsi untuk melakukan proses enkripsidekripsi pada semua data file, sesuai dengan ketentuan algoritma twofish. Langkah-langkah yang dikerjakan dalam proses enkripsi, adalah sebagai berikut : (1) Memulai proses enkripsi (plaintext) dengan ukuran block 128 bit; (2) Memasukkan kunci yang akan digunakan dalam proses; (3) Jika panjang kunci yang dimasukkan kurang dari 128 bit maka akan dilakukan penyesuaian panjang kunci, untuk mencapai 128 bit; (4) Memasukkan file yang akan dienkripsi; (5) Jika plaintext berukuran 128 bit maka tidak terjadi proses padding; (6) Jika plaintext berukuran lebih dari 128 bit, maka proses padding akan dilakukan; (7) Langkah selanjutnya yaitu proses enkripsi 1 (satu) block, jika data belum habis dibaca maka akan berulang, namun jika data habis dibaca maka sistem akan menampilkan hasil enkripsi; dan (7) Selesai. Proses enkripsi dalam bentuk flowchart, ditunjukkan pada Gambar 9.
Gambar 9. Flowchart Proses Enkripsi
Langkah-langkah yang dikerjakan dalam proses dekripsi, adalah sebagai berikut : (1) Memulai proses dekripsi (ciphertext) dengan ukuran block 128 bit; (2) Memasukkan kunci yang akan digunakan dalam proses; (3) Jika panjang kunci yang dimasukkan kurang dari 128 bit, maka akan dilakukan penyesuaian panjang kunci, untuk mencapai 128 bit; (4) Memasukkan file yang akan didekripsi; (5) Membaca 1 (satu) block (16 byte cipher data); (6) Langkah selanjutnya yaitu proses dekripsi 1 (satu) block, jika data belum habis dibaca, maka akan berulang; (7) Menghapus padding; (8) Sistem menampilkan hasil dekripsi; dan (9) Selesai. Proses dekripsi dalam bentuk flowchart, ditunjukkan pada Gambar 10.
Gambar 10 Flowchart Proses Dekripsi
4. Pembahasan dan Pengujian Penerapan Algoritma Twofish (128 bit key length) Twofish merupakan algoritma kriptografi dengan mode operasi ECB (Electronic Code Book), yang berarti sebuah blok pada plaintext dienkripsi ke dalam sebuah blok ciphertext dengan panjang blok yang sama, atau dapat dikatakan bahwa proses enkripsi dilakukan block per block. 1 (satu) block berukuran 16 byte. Jika plaintext tidak memenuhi 16 byte, maka dilakukan proses padding. Proses padding adalah proses penambahan byte-byte dummy berupa karakter NULL pada byte-byte sisa yang masih kosong pada blok terakhir
plaintext, sehingga ukurannya menjadi sama dengan ukuran blok penyandian. Ukuran plaintext yang akan disandikan sebagian besar tidak merupakan kelipatan ukuran blok penyandian. Hal ini mengakibatkan blok terakhir mungkin akan memiliki ukuran yang lebih kecil dari blok penyandian. Karena pada Block Cipher mengharuskan blok yang akan disandikan memiliki panjang yang tetap, maka pada blok terakhir tersebut harus ditambahkan byte-byte tertentu sehingga ukurannya menjadi sama dengan ukuran blok penyandian. Dalam penelitian yang dilakukan, Padding menggunakan nilai 0 byte, karena mewakili istilah “tidak ada arti”. Padding diletakkan di bagian belakang data yang akan dienkripsi. Pemilihan padding menggunakan pseudocode berikut. if L mod 16 = 0 padding = 0 else = padding = 16 – ( L mod 16) dimana: 16: konstanta, 16 byte per block sesuai ketentuan Twofish, dan L panjang data. Pembentukan Kunci Perintah yang digunakan dalam proses pembentukan kunci dan fleksibilitas kunci, terlihat pada Kode Program 1. Kode Program 1 Kode Program untuk Proses Pembentukan Kunci private void kunciTextKeyReleased(java.awt.event.KeyEvent evt) { String expand = Utility.expandKey(this.kunciText.getText(), 1 16); this.jTextField1.setText(expand); byte[] values = expand.getBytes(); String cetak = Utility.printBytes(values); this.byteKunciText.setText(cetak); } private void generateButtonActionPerformed(java.awt.event.ActionEvent evt) { Object key = null; try { byte[] byteKey = getKey(); key = Twofish_Algorithm.makeKey(byteKey); int[] subKeys = (int[]) ((Object[]) key)[1]; Object[][] data = new Object[subKeys.length][3]; Object[] column = {"index", "SubKey (int decimal)", "SubKey (hexadecimal)"}; for (int i = 0; i < subKeys.length; i++) { data[i] = new Object[]{i, subKeys[i], Utility.intToString(subKeys[i])}; } this.jTable1.setModel(new DefaultTableModel(data, column)); } catch (InvalidKeyException ex) {
2
Logger.getLogger(StepKeyFrame.class.getName()).log(Level.SEVERE, null, ex); } }
Pada Kode Program 1, perintah pada bagian ke-1 menunjukkan proses penyesuaian panjang kunci yang dibangun. Selanjutnya, proses pembangkitan kunci yang ada pada sistem, terlihat pada perintah bagian ke-2.
Implementasi Proses Enkripsi dan Dekripsi Pada Data Proses enkripsi adalah proses untuk mengacak data sehingga tidak dapat dibaca oleh pihak yang tidak memiliki hak untuk mengakses data tersebut. Proses enkripsi bertujuan untuk mengamankan data maupun informasi yang bersifat rahasia. Halaman untuk Proses Enkripsi ditunjukkan pada Gambar 11.
Gambar 11 Proses Enkripsi Data
Kode Program yang digunakan dalam proses enkripsi terlihat pada Kode Program 2. Kode Program 2 Kode Program untuk Proses Enkripsi public byte[] encrypt(byte[] message, String key) { mulai = Calendar.getInstance(); StringBuilder builder = new StringBuilder(); Twofish_Algorithm ta = new Twofish_Algorithm(); int keySize = 16; String expandedKey = expandKey(key, keySize); builder.append("Panjang Kunci: " + expandedKey.length() + " bytes\n");
1
try { Object sessionKey = ta.makeKey (expandedKey.getBytes());
2
byte[] paddedMessage = padMessage(message); builder.append("Panjang Plain Data: " + paddedMessage.length + " bytes\n");
3
int tambahan = paddedMessage.length - message.length; message = paddedMessage; List listResult = new ArrayList(); startProgressBar(message.length * 3); for (int i = 0; i < message.length; i += 16) { byte[] block = new byte[16]; System.arraycopy(message, i, block, 0, block.length); byte[] result = ta.blockEncrypt(block, 0, for (int j = 0; j < result.length; j++) {
listResult.add(result[j]); }
4 sessionKey);
Pada Kode Program 2, perintah pada bagian ke-1 menunjukkan pembuatan informasi mengenai panjang kunci yang dimasukkan untuk dilakukan proses enkripsi. Perintah pada bagian ke-2 menunjukkan penjadwalan kunci. Selanjutnya, sistem akan mengambil dan membaca plain data yang sudah dipilih sebelumnya, untuk menjalankan proses enkripsi seperti terlihat pada perintah bagian ke-3. Selanjutnya pada perintah bagian ke-4 menunjukkan proses enkripsi per blok. Kode Program 3 Kode Program untuk Proses Dekripsi public byte[] decrypt() { Calendar mulai = Calendar.getInstance(); StringBuilder builder = new StringBuilder(); Twofish_Algorithm ta = new Twofish_Algorithm(); int keySize = 16; String expandedKey = expandKey(this.dKeyText.getText(), 1 keySize); builder.append("Panjang Kunci: " + expandedKey.length() + " bytes\n"); try { RandomAccessFile r = new RandomAccessFile(cipherUrlTextField.getText(), "r"); byte[] message = new byte[(int) r.length()]; r.read(message); builder.append("Panjang cipher Data: " + r.length() + " bytes\n"); int tambahan = (int) message[0];
2
Object sessionKey = ta.makeKey(expandedKey.getBytes()); 3 List listResult = new ArrayList(); for (int i = 1; i < message.length; i += 16) { byte[] block = new byte[16]; System.arraycopy(message, i, block, 0, block.length); byte[]result = ta.blockDecrypt(block,0,sessionKey); 4 for (int j = 0; j < result.length; j++) { listResult.add(result[j]); } }
Perintah yang digunakan dalam proses dekripsi terlihat pada Kode Program 3, dengan penjelasan sebagai berikut, perintah pada bagian ke-1 menunjukkan pembuatan informasi mengenai panjang kunci yang dimasukkan untuk dilakukan proses dekripsi. Selanjutnya, sistem akan mengambil dan membaca cipher data yang sudah dipilih sebelumnya, untuk dijalankan proses enkripsi seperti terlihat pada perintah bagian ke-2. Perintah bagian ke-3 menunjukkan penjadwalan kunci. Selanjutnya pada perintah bagian ke-4 menunjukkan proses dekripsi per block, 1 block 16 byte. Halaman untuk proses dekripsi ditunjukkan pada Gambar 12.
Gambar 12 Proses Dekripsi Data
Pengujian Pada Proses Enkripsi dan Dekripsi Terhadap Data Tabel 3 Tabel Pengamatan Ukuran Data Pada Proses Enkripsi dan Dekripsi Nama Data
NO
Ukuran Data Asli (Bytes)
Ukuran Data Hasil Enkripsi (Bytes)
Ukuran Data Hasil Dekripsi (Bytes)
1
k2i.jpg
103,166
103,169
103,166
2
Bab 1.docx
25,761
25,776
25,761
3
672008110.pptx
422,306
422,320
422,306
4
papertwofish.pdf
228,570
228,576
228,570
5
TwofishAppHexa.rar
131,905
131,920
131,905
450 400 350 ukuran gambar
Gambar Asli
300 250
Enkripsi
200 150
Dekripsi
100 50 0
file yang diuji Gambar 13 Grafik Pengujian Dengan Panjang File Berbeda
Berdasarkan hasil pengujian pada Tabel 3, menunjukkan bahwa ukuran file asli dengan ukuran file yang telah dienkripsi mengalami perbedaan, dimana ukuran file yang telah dienkripsi lebih besar daripada file asli. Tabel 3 juga menunjukkan bahwa file asli dengan file hasil dekripsi memiliki ukuran byte yang sama. Tabel 4 Tabel Pengamatan Waktu Proses Enkripsi dan Dekripsi Terhadap Data No.
Data
Ukuran Data Asli (Bytes)
Lamanya Proses Enkripsi (Detik)
Lamanya Proses Dekripsi (Detik)
1
k2i.jpg
103,166
0.06300000000192085
0.06999999999807915
2
Bab 1.docx
25,761
0.03200000000651926
0.04700000000593718
3
672008110.pptx
422,306
0.1869999999908032
0.20300000000861473
4
Papertwofish.pdf
228,570
0.10899999999674037
0.12899999999674037
5
TwofishAppHexa.rar
131,920
0.07799999999406282
0.07800000000861473
Berdasarkan hasil pengujian pada Tabel 4, menunjukkan bahwa semakin besar ukuran data, maka waktu yang digunakan akan semakin lama. Tabel 4 juga menunjukkan bahwa waktu yang digunakan pada proses dekripsi data lebih lama dibandingkan waktu yang digunakan pada proses enkripsi data, disebabkan karena ukuran data yang telah dienkripsi lebih besar daripada data asli, Sehingga dapat dilihat dengan jelas bahwa waktu yang digunakan dalam proses dekripsi lebih besar daripada waktu yang digunakan pada proses enkripsi. Waktu proses dipengaruhi oleh ukuran data, dimana semakin besar ukuran data, maka waktu yang dibutuhkan dalam proses enkripsi dan dekripsi juga semakin lama. Proses enkripsi data diawali dengan tahapan-tahapan sebagai berikut: (1) mengambil data yang akan dienkripsi dari lokasi penyimpanan, (2) memasukkan kunci pada text area yang disediakan, (3) melakukan proses enkripsi terhadap data yang akan dienkripsi, dan (4) menyimpan hasil enkripsi terhadap data yang diproses. Proses dekripsi data diawali dengan tahapan-tahapan sebagai berikut: (1) mengambil data yang terenkripsi dari lokasi penyimpanan, (2) memasukkan kunci yang sama dengan kunci yang digunakan pada proses enkripsi, (3) melakukan proses dekripsi terhadap data terenkripsi, menyimpan hasil dekripsi terhadap data yang diproses. Berdasarkan perbandingan tahapan proses enkripsi dan dekripsi, dapat disimpulkan bahwa waktu yang dibutuhkan untuk proses dekripsi lebih lama dibandingkan dengan waktu yang dibutuhkan untuk proses enkripsi. Pengujian Compare Data Files Pengujian Compare data files merupakan proses untuk membandingkan data file plaintext, file hasil enkripsi, dan file hasil dekripsi, dimana dengan compare data files, user dapat menemukan perbedaan bytes yang ada antara data yang dibandingkan. Gambar 17 merupakan tampilan dari compare data files yang telah dibangun pada sistem.
Gambar 17 Form Hasil Compare Data Files
Gambar 17 menunjukkan sub menu compare images yang tersedia pada menu tools. Pada form compare data files ini terdapat 4 (empat) tombol sebagai berikut : (1) Tombol open pada data file 1 berfungsi untuk menampilkan data file asli (data file yang belum dienkripsi oleh sistem yang dibangun); (2) Tombol open pada data file 2 berfungsi untuk menampilkan file yang telah didekripsi oleh sistem; (3) Tombol detect berfungsi untuk memulai proses compare data files; dan (4) Tombol close berfungsi untuk keluar dari sub menu compare. Gambar 17 juga menunjukkan hasil compare data files yang telah dijalankan, serta menunjukkan bahwa tidak ada perbedaan antara data file asli dengan data file hasil dekripsi. Kode Program 4 Kode Program untuk Compare Data Files private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { try { BufferedImage img1 = ImageIO.read(new File(this.jTextField1.getText())); 1 BufferedImage img2 = ImageIO.read(new File(this.jTextField2.getText())); int[] pixels1 = new int[img1.getWidth() * img1.getHeight()]; int[] pixels2 = new int[img2.getWidth() * img2.getHeight()]; PixelGrabber grabber1 = new PixelGrabber(img1, 0, 0, img1.getWidth(), img1.getHeight(), pixels1, 0, img1.getWidth()); PixelGrabber grabber2 = new PixelGrabber(img2, 0, 0, img2.getWidth(), img2.getHeight(), pixels2, 0, img2.getWidth()); grabber1.grabPixels(); grabber2.grabPixels(); int counter = 0; //Math.abs(pixels1.length - pixels2.length); for (int i = 0; i < pixels1.length; i++) { if (i == pixels2.length) { break; } if (pixels1[i] != pixels2[i]) { counter++; } } String kesimpulan = "Differ by " + counter + " 2 pixels\n\r"; this.jTextArea1.setText(kesimpulan); } catch (Exception ex) { Logger.getLogger(CompareDialog.class.getName()).log(Level.SEVERE, null, ex); } try{ int byteDifferent = CompareByte(new File(this.jTextField1.getText()), new File(this.jTextField2.getText())); String k = "Differ by " + byteDifferent + " bytes"; 3 this.jTextArea1.append("\n\r" + k); }catch(Exception ex){ } }
Perintah yang digunakan dalam proses compare images terlihat pada Kode Program 4, yang dijelaskan sebagai berikut. Perintah pada bagian ke-1 menunjukkan proses untuk memasukkan file yang akan dibandingkan. Selanjutnya, sistem akan menampilkan hasil perbandingan pixels dari data yang
dibanding, seperti terlihat pada perintah bagian ke-2. Perintah bagian ke-3, sistem menampilkan hasil perbandingan bytes dari data yang dibanding. Perbandingan terhadap isi file dilakukan untuk melihat perbedaan byte yang terdapat pada data file plaintext, data file hasil enkripsi, dan data file hasil dekripsi. Hasil Perbandingan bisa dilihat pada Gambar 14, Gambar 15, dan Gambar 16.
(a) Isi File Asli
(b) Isi File Hasil (c) Isi File Hasil Enkripsi Dekripsi Gambar 14. Perbandingan Isi Data File Image UKSW
(a) Isi File Asli .rar
(b) Isi File Hasil (c) Isi File Hasil Enkripsi Dekripsi Gambar 15 Perbandingan Isi File twofishapphexa.rar
Berdasarkan hasil pengamatan isi image, file pptx, dan rar pada Gambar 14, dan Gambar 15, maka secara visual dapat dikatakan data asli sama dengan data hasil dekripsi. Analisis Hasil Modifikasi Algoritma Twofish Analisis terhadap modifikasi yang dilakukan dalam penelitian ini, adalah sebagai berikut : (1) Kunci dalam penelitian ini bersifat asimetrik, karena kunci pada proses enkripsi berbeda dengan kunci pada proses dekripsi; dimana kunci pada proses dekripsi ditambahkan dengan angka yang menunjukkan jumlah padding; hal ini dapat menambah tingkat kesulitan dalam memecahkan kriptosistem yang dibangun; dan (2) Hasil enkripsi yang direpresentasikan dalam hexadecimal, menyebabkan tiap karakter hasil enkripsi tersebut akan terdiri dari 2 (dua) digit; Contoh nilai ascii/byte 97, maka nilai dalam hexa adalah 16; nilai byte 92, maka nilai dalam hexa adalah 52.
5.
Simpulan
Berdasarkan hasil pembuatan, pembahasan, dan pengujian aplikasi data dapat dibuat menjadi data yang tidak terbaca dengan menggunakan algoritma twofish, sehingga kriptosistem yang dibangun dapat memenuhi prinsip kriptografi. Data yang besar ukurannya akan lebih lama proses enkripsinya jika dibandingkan dengan data yang berukuran kecil. Panjang plaintext mempengaruhi hasil dari panjang ciphertext. Panjang kunci yang berbeda tidak akan mempengaruhi panjang ciphertext satu dengan yang lainnya. Waktu yang dibutuhkan untuk proses dekripsi lebih lama dibandingkan dengan waktu yang dibutuhkan untuk proses enkripsi. Saran untuk pengembangan aplikasi ke depan adalah menerapkan algoritma Twofish pada file database 6. Daftar Pustaka [1] Ariyus, Dony, 2008, Pengantar Ilmu Kriptografi, Yogyakarta: Penerbit ANDI. [2] Munir, Rinaldi, 2006, Kriptografi, Bandung: Penerbit Informatika. Tumanggor, Seti, 2009, Studi Enkripsi dan Dekripsi File dengan [3] menggunakan algoritma twofish. Jurnal Tahun 2009 (Diakses tanggal 04 februari 2012). [4] Ratih, 2007, Studi dan Implementasi Enkripsi pengiriman pesan suara menggunakan algoritma twofish. Jurnal Teknik Informatika, Tahun 2007 (Diakses tanggal 04 februari 2012). [5] http://www.schneier.com/twofish.html (Diakses tanggal 04 februari 2012). [6] Pressman, Roger S., 2001, Software Engineering a Practitioner’s Approach, New York : McGraw-Hill Higher Education.