PENGEMBANGAN SISTEM PENGIRIMAN SUARA VOTER MENUJU CENTRAL TABULATING FACILITIES (CTF)
MEDRIA KUSUMA DEWI HARDHIENATA
DEPARTEMEN ILMU KOMPUTER FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM INSTITUT PERTANIAN BOGOR BOGOR 2009
PENGEMBANGAN SISTEM PENGIRIMAN SUARA VOTER MENUJU CENTRAL TABULATING FACILITIES (CTF)
MEDRIA KUSUMA DEWI HARDHIENATA
Skripsi Sebagai salah satu syarat untuk memperoleh gelar Sarjana Komputer pada Departemen Ilmu Komputer
DEPARTEMEN ILMU KOMPUTER FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM INSTITUT PERTANIAN BOGOR BOGOR 2009
ABSTRACT MEDRIA KUSUMA DEWI HARDHIENATA.The Development of Voting Result Data Transfer to the Central Tabulating Facilities. Under the direction of SRI NURDIATI and SUGI GURITMAN. Advances in election voting process nowadays has triggered the application of virtualization technique in several countries. Most studies raised concern about Online Voting which provides cost saving and convinience. The voting system using virtual network technology aims to reduce considerable calculation time as well as necessary human resources. Despite this, Indonesia still performs voting during election manually. Therefore, this research is performed to study the application of small scale Online Voting at the Department of Computer Science, Bogor Agricultural University as well as studying its further possibility for applying this technique in larger scales. Considering the complexity in building a complete secure online election voting process, this research is focused only in developing a system to send vote from voter to Central Tabulating Facilities (CTF) by implementing a modified secure election protocol with Two Central Facilities. It is also conducted to implement earlier research recommendations to make the system more secure as well as how to integrate an election voting system from a single host into multiple hosts by using Java Web Start Technology. Keywords: Online Voting, voter, Central Tabulating Facilities, Two Central Facilities
Judul Nama NIM
:Pengembangan Sistem Pengiriman Suara Voter Menuju Central Tabulating Facilities (CTF) :Medria K.D.Hardhienata :G64052475
Menyetujui: Pembimbing I,
Pembimbing II,
Dr. Ir. Sri Nurdiati, M.Sc NIP 19601126 198601 2 001
Dr. Sugi Guritman NIP 19620927 199203 1 004
Mengetahui, Dekan Fakultas Matematika dan Ilmu Pengetahuan Alam Institut Pertanian Bogor
Dr. Drh. Hasim, DEA NIP 19610328 198601 1 002
Tanggal Lulus :
RIWAYAT HIDUP Medria Kusuma Dewi Hardhienata dilahirkan di kota Stuttgart, Jerman Barat, pada tanggal 22 Agustus 1986 dari pasangan Ibu Sri Setyaningsih dan Bapak Soewarto Hardhienata. Pada tahun 2005 penulis lulus dari Sekolah Menengah Atas (SMA) Negeri 1 Bogor dan diterima di Program Studi Ilmu Komputer Institut Pertanian Bogor melalui jalur Seleksi Masuk Penerimaan Mahasiswa (SPMB). Penulis aktif berpartisipasi dalam National University English Debate Championship yang diselenggarakan pada tanggal 24-26 April 2007 dan berhasil meraih juara Third Runner Up. Pada bulan Januari hingga Maret 2007 penulis menjadi anggota Tim Multimedia Publikasi Satelit Lapan Tubsat dalam bidang animasi dan design. Setahun kemudian penulis menjadi asisten praktikum untuk mata kuliah Basis Data dan Organisasi Komputer di Institut Pertanian Bogor serta menjadi asisten dosen untuk mata kuliah Organisasi Komputer di Universitas Pakuan Bogor. Pada tahun yang sama Fakultas Matematika dan Ilmu Pengetahuan Alam Institut Pertanian Bogor memberikan penghargaan kepada penulis sebagai Mahasiswa Berprestasi Tingkat Fakultas tahun 2008.
PRAKATA Rasa syukur penulis ucapkan kepada Allah SWT yang telah memberikan anugerah dan rahmatNya hingga proses pembuatan skripsi ini dapat terselesaikan dengan lancar. Skripsi berjudul “Pengembangan Sistem Pengiriman Suara Voter Menuju Central Tabulating Facilities (CTF)” ini berangkat dari sebuah mimpi bahwa suatu saat pemilu di Indonesia dapat terselenggara secara virtual. Penelitian ini diharapkan dapat menjadi sumbangan pemikiran yang nantinya dapat terus dikembangkan bagi penyelenggaraan pemilu secara lebih luas di masa mendatang. Seiring dengan terselesaikannya skripsi ini, penulis ingin mengucapkan terima kasih yang tidak terhingga kepada: 1 Ayah dan Ibu, Soewarto Hardhienata dan Sri Setyaningsih, kedua orang yang menjadi sumber kekuatan untuk tetap maju dan melangkah. Terimakasih pula penulis ucapkan kepada kakak, Hendradi Hardhienata, yang selalu mengajarkan untuk tidak cepat menyerah dan menyadarkan bahwa mempelajari ilmu pengetahuan dimulai dari mencintai ilmu pengetahuan itu sendiri. Terimakasih pula kepada Faridah Handayasari, kakak perempuan penulis yang telah memotivasi agar dapat menyelesaikan skripsi tepat waktu. 2 Ibu Dr. Ir. Sri Nurdiati, MSc selaku pembimbing pertama yang telah memberi arahan, bimbingan serta motivasi untuk menyelesaikan skripsi ini. 3 Bapak Dr. Sugi Guritman selaku pembimbing kedua yang telah menumbuhkan rasa kecintaan akan ilmu kriptografi dan mencetuskan pemikiran awal untuk mengerjakan penelitian Online Voting. 4 Bapak Irman Hermadi S.Kom, MS selaku pembimbing akademik yang telah membimbing dan menjadi tempat penulis berkonsultasi dan bertanya. 5 Orang-orang yang telah menemani hingga semester demi semester perkuliahan dapat terlewati dan membantu penulis dalam melewati masa-masa sulit, Rizqi Baihaqi Ahmadi, sahabat terbaik yang pernah ada, orang yang mengajarkan untuk tidak pernah menyerah dan terus berjuang serta Rinjani Yusni Maharjanti, sahabat yang selalu menemani di saat-saat pengerjaan skripsi. Tidak lupa penulis ucapkan terimakasih kepada sahabat, Nida, rekan seperjuangan dalam projek Online Voting, Dina, Uud, dan Fajri, serta sahabat-sahabat yang pernah bekerja bersama-sama dalam satu tim hebat Ferdian Faisal, Noviana Putri, Fitri, dan Abie Rafdi. Skripsi ini juga penulis persembahkan untuk sahabat-sahabat program studi Ilmu Komputer Angkatan 42, Mirna, Lena, Adet, Prita, Nila, Huda, Indra, Ijun, Nano, Regi, organisasi yang telah membesarkan penulis, Komunitas Film FOKERZ dan HIMALKOM, serta sahabat-sahabat yang tidak bisa penulis sebutkan satu persatu, terimakasih atas segalanya. 6 Seluruf staf pengajar Departemen Ilmu Komputer yang telah berbagi banyak ilmu, filosofi dan cerita-cerita luar biasa sehingga mempelajari ilmu komputer menjadi hal yang menyenangkan. Terimakasih juga penulis ucapkan kepada segenap staf administrasi dan perpustakaan Departemen Ilmu Komputer yang telah membantu hingga skripsi ini dapat terselesaikan. Terimakasih atas bantuan semua pihak. Akhir kata semoga karya ilmiah ini dapat bermanfaat dan memberi inspirasi bagi peneliti-peneliti muda lainnya untuk terus berlomba menciptakan karya terbaik. Bogor, Agustus 2009
Medria K. D. Hardhienata
DAFTAR ISI
Halaman DAFTAR GAMBAR ................................................................................................................................. v DAFTAR LAMPIRAN.............................................................................................................................. v PENDAHULUAN ..................................................................................................................................... 6 Latar Belakang ..................................................................................................................................... 6 Tujuan ................................................................................................................................................... 6 Ruang Lingkup ..................................................................................................................................... 6 TINJAUAN PUSTAKA ............................................................................................................................ 2 Protokol ................................................................................................................................................ 2 Kriptografi ............................................................................................................................................ 2 Kunci Publik (Public Key) ................................................................................................................... 2 Kunci Simetri (Session Key) ................................................................................................................ 2 Algoritme RSA ..................................................................................................................................... 2 Secure Hash Algorithm (SHA)-1 .......................................................................................................... 3 Jaringan Feistel..................................................................................................................................... 3 Blowfish ................................................................................................................................................ 3 Nonce .................................................................................................................................................... 5 Java Web Start...................................................................................................................................... 5 Certificate Authority (CA) ................................................................................................................... 5 Central Legitimization Agency (CLA)................................................................................................. 5 Central Tabulating Facilities (CTF).................................................................................................... 5 METODE PENELITIAN........................................................................................................................... 6 Ancaman (Threats) ............................................................................................................................... 6 Kebijakan (Policy)................................................................................................................................ 6 Spesifikasi (Specification).................................................................................................................... 6 Perancangan (Design) .......................................................................................................................... 6 Implementasi (Implementation) ........................................................................................................... 7 Pengujian (Testing) .............................................................................................................................. 7 HASIL DAN PEMBAHASAN ................................................................................................................. 8 Ancaman (Threats) ............................................................................................................................... 8 Kebijakan (Policy)................................................................................................................................ 8 Spesifikasi (Specification).................................................................................................................... 9 Perancangan (Design) .......................................................................................................................... 9 Perancangan Sistem Secara Umum ..................................................................................................... 9 Perancangan Pengembangan Sistem .................................................................................................. 11 Implementasi ...................................................................................................................................... 13 Pengujian ............................................................................................................................................ 17 KESIMPULAN DAN SARAN ............................................................................................................... 19 Kesimpulan ......................................................................................................................................... 19 Saran ................................................................................................................................................... 19 DAFTAR PUSTAKA .............................................................................................................................. 20 LAMPIRAN ............................................................................................................................................. 21
iv
DAFTAR GAMBAR Halaman 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Enkripsi dan Dekripsi ........................................................................................................................... 2 Jaringan Feistel..................................................................................................................................... 3 Fungsi f Blowfish .................................................................................................................................. 4 Blowfish ................................................................................................................................................ 4 The Security Life Cycle ........................................................................................................................ 6 Proses Komunikasi Voter – CTF untuk Fungsionalitas Permintaan Kandidat ................................. 10 Proses Komunikasi Voter – CTF untuk Fungsionalitas Permintaan Melakukan Pemilihan (vote) . 10 Proses Komunikasi Voter – CTF untuk Fungsionalitas Melakukan Verifikasi Pilihan ................... 11 Jaringan Wireless Online Voting dengan Topologi Infrastruktur ..................................................... 12 Diagram Alir Pengiriman dan Penerimaan Kunci Simetri Voter ...................................................... 12 Diagram Alir Pengiriman dan Penerimaan Kunci Simetri CTF ....................................................... 13 Pengaturan Java Web Start pada project properties window menu Run ......................................... 13 Pengaturan Java Web Start pada project properties window menu Application Web Start ........... 14 Situs IPB Online Voting Centre (Bagian 1)....................................................................................... 14 Situs IPB Online Voting Centre (Bagian 2)...................................................................................... 14 Tampilan Antamuka Online Voting ................................................................................................... 14 Berkas launch.jnlp untuk memunculkan aplikasi Online Voting ...................................................... 14
DAFTAR LAMPIRAN Halaman 1 2 3 4
Implementasi GenerateRandomKeys.java ......................................................................................... 22 Implementasi Voter.java untuk Fungsi do_CTF ............................................................................... 28 Implementasi CTF.java untuk Fungsi Main ...................................................................................... 35 Black Box Testing ............................................................................................................................... 40
v
PENDAHULUAN Latar Belakang Pemilihan Umum (Pemilu) merupakan suatu kegiatan yang lazim dilakukan di berbagai negara untuk memilih kandidat yang akan menempati jabatan politik tertentu. Kegiatan ini dilakukan tidak hanya dalam skala nasional, pada lingkungan yang lebih khusus seperti kampus misalnya kegiatan ini pun sering kali dilakukan untuk melakukan pemilu berskala kecil seperti pemilihan rektor, dekan, maupun berbagai ketua badan kegiatan mahasiswa. Seiring dengan kemajuan teknologi, proses pemunggutan suara dalam pemilu di negaranegara maju kini mulai berkembang ke arah virtualisasi. Pemilu untuk memilih presiden Amerika Serikat pada bulan November 2008 lalu pun telah berhasil diselenggarakan dengan penghitungan electoral vote yang sangat cepat berkat bantuan teknologi maju. Hanya dalam hitungan jam hasil pemungutan suara dari seluruh negara bagian negara ini dapat diketahui oleh seluruh dunia. Di Indonesia sendiri pemilu umumnya masih dilakukan dengan cara konvensional. Pemilihan dilakukan melalui pencontrengan pada kartu pemilih serta identifikasi pemilih secara manual. Tidak jarang kegiatan ini menghabiskan waktu yang cukup lama dalam penghitungan suara akhir. Peluang dalam melakukan kecurangan dalam pemilu yang diselenggarakan secara konvensional pun kadang tidak dapat dihindari. Pada tahun 2001, Dan DuFeu dan Jon Harris (2001) melakukan penelitian dengan mendeskripsikan bagaimana online election system bekerja. Penelitian ini mengimplementasikan pembangunan Central Legitimization Agency (CLA) dan Central Tabulating Facilities (CTF) untuk menerapkan pemilu yang aman. Selanjutnya beberapa penelitian mengenai topik serupa kian terbuka lebar. Pada tahun 2005, Sireesha, Janga dan So-In Chakchai (2005) melakukan penelitian dengan memodifikasi protokol secure election dengan Two Central Facilities. Dengan lahirnya berbagai penelitian dalam bidang election system, penelitian ini diharapkan dapat terus menyempurnakan sistem online voting yang telah ada.
bukanlah hal yang mustahil dilakukan. Meski demikian, pemilihan suara dengan komputerisasi hanya dapat dilakukan jika protokol menjamin bahwa privasi individu dapat dilindungi dan berbagai bentuk kecurangan dengan teknologi ini dapat dicegah. Hal inilah yang mendorong adanya keinginan untuk terus menyempurnakan serta mengembangkan sebuah protokol keamanan virtual dengan protokol Two Central Facilities. Protokol ini dipilih karena termasuk sebagai protokol yang paling memenuhi sebagian besar persyaratan untuk menjalankan secure election dan memiliki tingkat keamanan yang paling tinggi dibandingkan protokol-protokol lain yang dijelaskan oleh Schneier (1996). Tujuan Terdapat dua tujuan utama dari penelitian ini. Pertama, penelitian dilakukan untuk mengembangkan sistem pengiriman suara dari voter menuju Central Tabulating Facilities (CTF) dengan protokol Two Central Facilities yang telah ada serta penyempurnaan beberapa kekurangan pada protokol sesuai rekomendasi dari penelitian sebelumnya. Kedua, penelitian dilakukan untuk membuat model simulasi guna melihat apakah sistem ini dimungkinkan untuk diimplementasikan pada pemilu yang diadakan di lingkungan kampus Institut Pertanian Bogor (IPB). Ruang Lingkup Ruang lingkup penelitian ini difokuskan kepada pembentukan protokol untuk pengiriman suara dari voter menuju CTF dengan Two Central Fasilities serta pembangunan model yang disimulasikan pada lingkungan kampus IPB.
Dengan kemajuan jaringan teknologi dan teknik kriptografi saat ini penyelenggaraan pemilihan kandidat dengan cara virtual khususnya dalam lingkup kampus di Indonesia vi
TINJAUAN PUSTAKA Protokol Suatu protokol menurut Schneier (1996) adalah serangkaian langkah yang melibatkan dua pihak atau lebih dan dirancang agar dapat menyelesaikan suatu tugas. Protokol memiliki berbagai karakteristik seperti : 1 Protokol memiliki urutan dari awal hingga akhir. 2 Setiap langkah harus dilaksanakan secara bergilir. 3 Suatu langkah tidak dapat dikerjakan bila langkah sebelumnya belum selesai dilakukan. 4 Diperlukan dua pihak atau lebih untuk melaksanakan protokol. 5 Protokol harus mencapai dan memberikan suatu hasil. 6 Setiap orang yang terlibat dalam protokol harus mengetahui terlebih dahulu mengenai protokol dan seluruh langkah yang akan dilaksanakan dalam protokol. 7 Setiap orang yang terlibat dalam protokol harus menyetujui untuk mengikutinya. 8 Protokol tidak boleh menimbulkan kerancuan (ambigu) dan tidak boleh timbul kesalahpahaman. 9 Protokol harus lengkap, harus terdapat aksi yang spesifik untuk setiap kemungkinan situasi. Kriptografi Kriptografi menurut Schneier (1996) adalah seni dan ilmu untuk menjaga keamanan pesan. Beberapa istilah menurut Kurniawan (2008) yang sering digunakan dalam kriptografi antara lain: a) Plaintext: Semua data yang belum diproses melalui suatu algoritme kriptografi. Plaintext dapat berupa teks, gambar atau bentuk lainnya. b) Ciphertext: Hasil proses algoritme kriptografi dari suatu plaintext. c) Enkripsi: Proses pengubahan pesan sedemikian sehingga isi pesan disembunyikan. Enkripsi juga dapat dikatakan sebagai proses pengubahan dari plaintext ke ciphertext, dengan algoritme kriptografi tertentu. d) Dekripsi: proses pengubahan kembali dari ciphertext ke plaintext dengan algoritme kriptografi tertentu. e) Cipher: Suatu algoritme kriptografi yang dapat melakukan enkripsi dan dekripsi.
f) Key: Parameter kunci yang digunakan oleh cipher dalam melakukan proses enkripsi dan dekripsi. g) Message digest: Ukuran byte kecil yang menunjukkan ukuran plaintext. h) Hash: Nama lain dari message digest. Skema proses enkripsi dan dekripsi secara umum dapat dilihat pada Gambar 1.
Gambar 1 Enkripsi dan Dekripsi. Kunci Publik (Public Key) Kunci Publik (Public Key) adalah kunci yang dirancang sedemikian sehingga kunci yang digunakan untuk enkripsi berbeda dengan kunci yang digunakan pada proses dekripsi (Schneier 1996). Kunci Simetri (Session Key) Kunci Simetri (Session Key) adalah kunci yang dirancang sedemikian sehingga kunci yang digunakan untuk enkripsi sama dengan kunci yang digunakan pada proses dekripsi (Schneier 1996). Algoritme RSA Algoritme RSA dinamakan berdasarkan nama tiga orang penemunya yakni Ron Rivest, Adi Shamir, dan Leonard Adleman. Keamanan algoritme RSA didapatkan dari sulitnya memfaktorkan bilangan yang besar menjadi faktor-faktor prima. Pemfaktoran dilakukan untuk memperoleh kunci privat. Algoritme RSA memiliki besaran-besaran sebagai berikut: 1 2 3 4 5 6 7
p dan q bilangan prima N = p. q φ (N) =(p-1)(q-1) e (kunci enkripsi) d (kunci dekripsi) m (plaintext) c (ciphertext)
(rahasia) (tidak rahasia) (rahasia) (tidak rahasia) (rahasia) (rahasia) (tidak rahasia)
Deskripsi sederhana dari algoritme RSA dijelaskan sebagai berikut, diberikan Nilai N, dimana N adalah : N=p.q dengan p dan q adalah dua bilangan prima besar dengan ukuran yang sama. 2
Diberikan nilai e dan d dengan ketentuan sebagai berikut : ed = 1 mod φ (N) dan φ (N) = (p-1)(q-1) N adalah RSA modulus, e adalah encryption exponent, dan d adalah decryption exponent. (N,e) adalah kunci publik yang digunakan untuk enkripsi pesan. (N,d) adalah kunci rahasia atau kunci privat yang digunakan untuk mendekripsi ciphertext atau pesan yang telah dienkripsi ke pesan sebenarnya (Boneh 1999).
Ri = Li – 1 ⊕ f(Ri – 1, Ki) yang dalam hal ini, i = 1, 2, …, r (r adalah jumlah putaran). Ki = subkey pada putaran ke-i f = fungsi transformasi (di dalamnya terdapat fungsi substitusi, permutasi, dan/atau ekspansi, kompresi) (Munir 2006).
Pesan adalah bilangan integer M, untuk mengenkripsi M menggunakan cara C = Me mod N. Untuk mendekripsi ciphertext digunakan perhitungan M = Cd mod N dengan Cd = Med = M (mod N) (Boneh 1999). Secure Hash Algorithm (SHA)-1 SHA adalah fungsi hash satu-arah yang dibuat oleh NIST. Fungsi hash SHA yang paling umum digunakan adalah SHA-1 yang telah diimplementasikan di dalam berbagai aplikasi dan protokol keamanan. SHA-1 menerima masukan berupa pesan dengan ukuran maksimum 64 bit dan menghasilkan message digest yang panjangnya 160 bit, lebih panjang dari message digest yang dihasilkan oleh MD5 yang hanya 128 bit. Langkah-langkah pembuatan message digest dengan SHA-1 secara garis besar adalah sebagai berikut: 1 Penambahan bit-bit pengganjal (padding bits). 2 Penambahan nilai panjang pesan semula. 3 Inisialisasi penyangga (buffer) MD. 4 Pengolahan pesan dalam blok berukuran 512 bit. (Munir 2006). Jaringan Feistel Hampir semua algoritme cipher blok bekerja dalam model jaringan Feistel. Jaringan Feistel ditemukan oleh Horst Feistel tahun 1970. Model jaringan Feistel adalah sebagai berikut: 1 Bagi blok yang panjangnya n bit menjadi dua bagian, kiri (L) dan kanan (R), yang masing-masing panjangnya n/2 (hal ini mensyaratkan n harus genap). 2 Definisikan cipher blok berulang dimana hasil dari putaran ke-i ditentukan dari hasil putaran sebelumnya (lihat Gambar 2), yaitu :
Gambar 2 Jaringan Feistel. Blowfish Blowfish merupakan blok cipher 64-bit dengan panjang kunci variabel. Algoritme ini terdiri dari dua bagian: ekspansi kunci dan enkripsi data. Ekspansi kunci mengubah kunci yang dapat mencapai 448 bit menjadi beberapa array subkunci (subkey) dengan total 4168 byte. Blowfish dikembangkan untuk memenuhi kriteria perancangan sebagai berikut: a) Cepat, pada implementasi yang optimal Blowfish dapat mencapai kecepatan 26 clock cycle per-byte. b) Kompak, Blowfish dapat berjalan pada memori kurang dari 5 KB. c) Sederhana, Blowfish hanya menggunakan operasi yang sederhana: penambahan (addition), XOR, dan penelusuran tabel (table lookup) pada operand 32 bit. Rancangannya mudah untuk dianalisis yang membuatnya resisten terhadap kesalahan implementasi. d) Keamanan yang variabel, panjang kunci Blowfish dapat bervariasi dan dapat mencapai 448 bit (56 byte). Enkripsi data terdiri dari iterasi fungsi sederhana sebanyak 16 kali. Setiap putaran terdiri atas permutasi kunci-dependent dan substitusi kunci- dan data-dependent. Semua operasi adalah penambahan dan XOR pada variable 32-bit. Tambahan operasi lainnya hanyalah empat penelusuran tabel (table lookup) array berindeks untuk setiap putaran.
Li = Ri+1 3
Blowfish menggunakan subkunci yang besar. Kunci ini harus dihitung sebelum enkripsi atau dekripsi data. Array P terdiri dari delapan belas 32-bit subkunci: P1,P2, . . . ,P18 Empat 32-bit S-box masing-masing mempunyai 256 entri: S1,0, S1,1, . . . , S1,255 S2,0, S2,1, . . . , S2,255 S3,0, S3,1, . . . , S3,255 S4,0, S4,1, . . . , S4,255
5 Lakukan enkripsi pada keluaran dari langkah (3) dengan algoritme Blowfish dengan subkunci yang sudah dimodifikasi. 6 Ganti P3 dan P4 dengan keluaran dari langkah (5). 7 Lanjutkan proses tersebut, ganti seluruh elemen dari P-array, dan kemudian seluruh keempat S-box berurutan, dengan keluaran yang berubah secara kontinyu dari algoritme Blowfish. (Schneier 1996).
Metode selengkapnya untuk menghitung subkunci ini akan dijelaskan pada bagian di bawah ini. Blowfish merupakan algoritme yang menerapkan jaringan Feistel (Feistel network) yang terdiri atas 16 putaran. Input merupakan elemen 64 bit, X. Untuk memulai enkripsi : Bagi X menjadi dua 32-bit: XL, XR untuk i = 1 sampai 16 XL = XL xor Pi XR = F(XL) xor XR Tukar XL dan XR Tukar XL dan XR (batalkan penukaran terakhir) XR = XR xor P17 XL = XL xor P18 Kombinasikan kembali XL dan XR Fungsi F adalah sebagai berikut: Bagi XL, menjadi empat bagian 8-bit: a, b, c dan d F(XL) = ((S1,a + S2,b mod 232) xor S3,c) + S4,c mod 232
Gambar 3 Fungsi f Blowfish.
Proses fungsi f dan enkripsi Blowfish dapat dilihat pada Gambar 3 dan 4. Dekripsi sama persis dengan enkripsi, kecuali P1, P2, . . . , P18 digunakan pada urutan yang terbalik. Subkunci dihitung menggunakan algoritme Blowfish sebagai berikut: 1 Pertama-tama inisialisasi P-array dan kemudian empat S-box secara berurutan dengan string yang tetap. String ini terdiri digit heksadesimal dari pi. 2 XOR P1 dengan 32 bit pertama kunci, XOR P2 dengan 32 bit kedua dari kunci dan seterusnya untuk setiap bit dari kunci (sampai P18). Ulangi terhadap bit kunci sampai seluruh P-array di XOR dengan bit kunci. 3 Lakukan enkripsi pada semua string nol dengan algoritme Blowfish dengan menggunakan subkunci seperti dijelaskan pada langkah (1) dan (2). 4 Ganti P1 dan P2 dengan keluaran dari langkah (3)
Gambar 4 Blowfish.
4
Nonce Dalam bidang teknik keamanan, Nonce merupakan kepanjangan dari number used once (nomor yang digunakan hanya sekali). Umumnya bilangan ini berupa bilangan acak atau semi-acak yang digunakan dalam protokol otentikasi untuk memastikan bahwa komunikasi lama tidak dapat digunakan ulang dalam serangan balasan (replay attacks) (Ross 2001). Java Web Start Java Web Start menyediakan kekuatan dalam menampilkan fitur lengkap aplikasi Java dalam satu kali klik. Pengguna dapat mengunduh dan menampilkan aplikasi, seperti tampilan program yang lengkap atau komunikasi klien dalam internet tanpa prosedur instalasi yang rumit. Sekali pengguna mengakses Java Web Start, aplikasi akan terintegrasi dengan desktop pengguna. Sebagai tambahan Java Web Start juga dapat melayani pengguna dengan mengatur versi Java Runtime Environment dan secara otomatis melakukan update versi aplikasi (Sun Microsystem 2005).
menyediakan beberapa fungsionalitas sebagai berikut: a) Mengizinkan pengguna untuk meminta sertifikasi daftar kandidat. b) Menerima secure Validation ID yang telah disertifikasi dan ditandatangani dari CLA. c) Menerima permintaan secure vote dari pemilih yang berwenang (dengan Validation ID). d) Secara aman mengembalikan nama kandidat terpilih sebagai verifikasi atas permintaan pemilih. e) Mengizinkan pemilih untuk meminta sertifikasi hasil pemilihan. Dalam rangka otorisasi pemilih, CTF melakukan pengecekan ValidationID dengan daftar yang diterima dari CLA. Jika ValidationID valid maka suara pemilih akan dimasukkan ke dalam kotak suara (Dan DuFeu and Jon Harris 2001).
Certificate Authority (CA) Fungsi Utama dari Certificate Authority (CA) adalah menghasilkan, memublikasikan, dan menghapus certificate public key dari user identity, bisa personal maupun lembaga. Contoh CA, yaitu verisign (Kurniawan 2008). Central Legitimization Agency (CLA) Central Legitimization Agency (CLA) merupakan sebuah badan yang bertugas untuk melakukan sertifikasi pemilih. Fungsi utama badan ini adalah untuk melakukan otentikasi dan otorisasi pemilih. Setiap pemilih akan mengirim sebuah pesan aman kepada CLA untuk meminta sebuah ValidationID. CLA akan membangkitkan ValidationID, mendaftarkannya secara aman kepada Central Tabulating Facilities, dan mengembalikannya secara aman kepada pemilih. ValidationID bernilai kompleks sehingga secara komputasi tidak dimungkinkan seorang penyerang untuk memproduksi sebuah ID yang valid. CLA memiliki daftar sejumlah ValidationID yang valid serta daftar identifikasi pemilih dari setiap ValidationID untuk mencegah seseorang memiliki lebih dari satu ValidationID (Dan DuFeu and Jon Harris 2001). Central Tabulating Facilities (CTF) Central merupakan melakukan
Tabulating Facilities (CTF) suatu badan yang bertugas penghitungan suara. CTF
5
METODE PENELITIAN Penelitian ini dikembangkan dengan metode Security Life Cycle. Berdasarkan Bishop (2003) 6 tahap utama yang diterapkan dalam Security Life Cycle di antaranya: (1) Ancaman (Threats), (2) Kebijakan (Policy), (3) Spesifikasi (Specification) (4) Perancangan (Design) (5) Implementasi (Implementation) serta (6) Operasi dan Pemeliharaan (Operation and Maintenance). Metode Security Life Cycle dapat dilihat pada Gambar 5. Oleh karena keterbatasan waktu, penelitian ini difokuskan dari tahap (1) hingga (5) serta disempurnakan dengan tahap pengujian.
d) Usurpation, yakni pengaturan beberapa bagian dari sistem oleh pihak-pihak yang tidak berwenang. Kebijakan (Policy) Kebijakan keamanan adalah pernyataan atas apa yang diperbolehkan dan tidak diperbolehkan dalam menjalankan sebuah sistem. Metode, alat, atau prosedur untuk melaksanakan kebijakan keamanan tersebut dinamakan mekanisme keamanan. Sistem pemilu yang rentan terhadap serangan keamanan tentu membutuhkan kebijakan tentang hal-hal yang diperbolehkan dan tidak diperbolehkan dalam proses penyelenggaraan pemilu secara online. Kebijakan yang dibuat untuk menjalankan pemilu online dalam penelitian ini mengacu pada requirement secure voting yang ditulis dalam buku karangan Schneier (1996). Spesifikasi (Specification)
Gambar 5 The Security Life Cycle. Ancaman (Threats) Sebuah ancaman (threats) adalah kekerasan potensial dalam suatu sistem keamanan. Di dalam konteks pemilu, terdapat banyak sekali serangan yang mengancam pertukaran informasi yang terkirim dan diterima oleh voter dan server. Peran kriptografi sangat dibutuhkan untuk melindungi sistem pemilu, termasuk pada saat suara voter dikirim kepada CTF. Oleh karenanya, sistem pemilu yang akan dibangun harus dipersiapkan agar mampu melindungi sistem dari ancaman-ancaman yang mungkin terjadi. Dalam penelitian ini berbagai ancaman yang dapat timbul pada saat suara voter dikirim menuju CTF akan dianalisis dalam 4 kelas besar yakni : a) Disclosure, yakni akses terhadap informasi oleh pihak yang tidak berwenang. b) Deception, yakni penerimaan data yang salah. c) Disruption, yakni gangguan atau pencegahan terhadap operasi yang benar.
Spesifikasi adalah pernyataan baik formal maupun informal mengenai fungsi sistem yang diinginkan (Bishop 2003). Setelah kebijakan pemilu dibuat, langkah selanjutnya adalah menentukan spesifikasi sistem. Agar dapat menjalankan mekanisme keamanan sesuai dengan kebijakan, sistem pemilu online membutuhkan berbagai spesifikasi keamanan. Pada konteks penelitian kali ini spesifikasi yang digunakan adalah spesifikasi informal yang menjelaskan fungsi-fungsi yang dikerjakan sistem agar dapat menjalankan kebijakan. Perancangan (Design) Tahap perancangan akan menerjemahkan spesifikasi menjadi komponen-komponen yang dapat diimplementasikan. Suatu perancangan dikatakan sesuai dengan spesifikasi jika dalam semua kondisi, rancangan yang telah dibuat tidak mengizinkan sistem untuk melanggar spesifikasi. Tahap perancangan sistem pengiriman suara voter menuju CTF mencakup perancangan pengembangan sistem komunikasi antara voter dan CTF dari mulai perancangan proses pengiriman kunci agar lebih aman hingga proses pengiriman suara voter menuju CTF. Selain itu, oleh karena program Online Voting semula dikembangkan dengan basis desktop maka pada penelitian ini juga akan dirancang pemindahan aplikasi dari basis desktop menjadi berbasis web dengan menggunakan teknologi Java Web Start. Secara garis besar perancangan sistem Online Voting
6
pada penelitian ini dapat dibagi menjadi dua bagian yakni : 1 perancangan Online Voting dengan Java Web Start , dan 2 perancangan pengiriman kunci simetri. Implementasi (Implementation) Pada tahap ini hasil analisis dan perancangan akan diimplementasikan menjadi sistem dengan lingkungan implementasi sebagai berikut: a) Platform: Java 1.4 (Platform independent & inbuilt security features) b) GUI: Java Swing c) RSA (2048 bits): Enkripsi kunci publik d) Blowfish (56 bits): Enkripsi kunci simetri e) SHA-1 (160 bits): signature/Hashing f) Nonce and Nonce+1: untuk mengembalikan pesan. g) CA : Transmisi kunci publik secara aman. Pengujian (Testing) Tahap Pengujian dilakukan untuk menguji apakah sistem yang dibangun memberi hasil keluaran seperti yang diharapkan. Pengujian pada penelitian ini dilakukan dengan metode Black Box dan simulasi.
7
HASIL DAN PEMBAHASAN Ancaman (Threats) Seiring dengan kemajuan teknologi komunikasi saat ini, ancaman terhadap pengiriman data yang bersifat rahasia seperti hasil pilihan voter menuju CTF menjadi hal yang sangat penting untuk diperhatikan dalam pembangunan sistem Online Voting. Keamanan komunikasi antara voter dan CTF sangat diperlukan untuk menjaga tingkat kepercayaan voter kepada instansi atau lembaga yang menyelenggarakan pemilu. Oleh karena itu pembangunan sistem IPB Online Voting harus dimulai dari analisis mengenai berbagai ancaman yang mungkin menyerang sistem komunikasi data. Salah satu bagian yang akan dikembangkan dalam sistem IPB Online Voting adalah pengamanan pengiriman kunci simetri. Kunci ini digunakan sebagai media pengaman komunikasi antara voter dan CTF saat pengiriman daftar kandidat, hasil pilihan voter maupun hasil verifikasi suara dilakukan. Oleh karenanya, berbagai ancaman yang akan dianalisis dalam penelitian ini difokuskan pada penanggulangan ancaman yang dapat menyerang pengiriman kunci simetri dari voter menuju CTF. Berbagai ancaman yang dapat timbul saat proses pengiriman kunci simetri berlangsung diantaranya: a) Pengintaian (snooping), yakni penahanan informasi oleh pihak yang tidak berwenang. Secara sederhana ancaman ini dapat didefinisikan bahwa terdapat suatu entitas yang tidak memiliki otoritas ikut mendengar atau membaca komunikasi sistem informasi yang bersifat rahasia. Dalam konteks pengamanan pengiriman kunci simetri, ancaman ini berarti bahwa terdapat entitas yang tidak berwenang dan berhasil mendengar komunikasi pengiriman kunci simetri dari voter menuju CTF. Ancaman jenis ini tergolong ke dalam kelas disclosure. Snooping merupakan salah satu contoh serangan pasif dimana penyerang tidak terlibat langsung dalam komunikasi antara voter dan CTF, namun menyadap pertukaran pesan antara kedua entitas. Tujuan penyerangan ini adalah untuk mendapatkan informasi yang dapat digunakan oleh kriptanalis. Ancaman snooping dapat diatasi menggunakan layanan keamanan pesan kerahasiaan (confidentiality).
b) Modifikasi atau pengubahan (modification or alternation) yakni pengubahan informasi yang dilakukan oleh pihak penyerang. Jika kunci simetri yang dibangkitkan oleh voter telah diubah, maka CTF akan menerima kiriman kunci simetri berbeda yang dianggap benar oleh CTF. Ancaman ini pada akhirnya mengarah ke dalam kelas deception. Ancaman modifikasi yang mungkin terjadi dalam pengiriman suara voter menuju CTF di antaranya kunci simertri yang dikirimkan oleh pemilih telah diubah oleh penyerang saat kunci dikirimkan kepada CTF. Hal ini menyebabkan komunikasi antara voter dan CTF tidak dapat dilakukan. Ancaman modifikasi terhadap kunci simetri dapat menyebabkan terjadinya peningkatan ancaman disruption dan usurpation. Layanan keamanan integritas (integrity) digunakan untuk menanggulangi masalah ini. c) Penyamaran (masquering) yakni peniruan terhadap suatu entitas terhadap entitas yang lain. Ancaman ini akan mengumpan korban agar percaya bahwa entitas yang berkomunikasi dengannya adalah pihak yang benar, meski pada kenyataannya pihak tersebuat adalah penyerang (attacker) yang bukan merupakan pihak yang berwenang. Sebagai contoh, saat pemilih akan mengirimkan kunci simetri kepada CTF untuk melakukan komunikasi, pihak yang menerima kunci tersebut bukanlah CTF melainkan server lain yang mengaku sebagai CTF. Untuk menangani ancaman ini konsep otentifikasi (authentication) dapat digunakan untuk mencegah serangan ini. Masquerading termasuk ancaman dalam kelas deception dan usurpation. Kebijakan (Policy) Kebijakan yang diterapkan dalam membangun IPB Online Voting mengacu pada buku Schneier (1996) mengenai syarat-syarat penyelenggaraan sistem pemilihan umum yang aman. Menurut Scheneier secure voting yang dibangun secara komputerisasi akan digunakan jika terdapat protokol yang menjamin : 1 privasi individu, dan 2 pencegahan terhadap kecurangan.
8
Suatu protokol yang ideal harus memiliki 6 persyaratan sebagai berikut : 1 Hanya pemilih yang berhak yang dapat memberikan suara (otentifikasi); 2 Tidak boleh memberikan lebih dari satu suara; 3 Tidak boleh menentukan orang lain harus memilih untuk siapa; 4 Tidak ada yang bisa menduplikasi suara orang lain; 5 Tidak boleh mengubah pilihan orang lain; 6 Setiap pemilih dapat memastikan bahwa suara mereka sudah dikirimkan dan terhitung dalam penghitungan akhir.
•
•
Spesifikasi (Specification) Secara Umum sistem pengiriman suara voter menuju CTF yang dibangun dapat memenuhi spesifikasi umum sebagai berikut: • Hanya pemilih yang berhak yang dapat memberikan suara (otentifikasi). o Terdapat validationID yang acak dan unik untuk setiap voter. o Secara komputasional infeasible untuk seorang penyerang untuk menebak pasangan kunci dan validationID yang valid. o Hanya CTF yang dapat memasukkan hasil pilihan. •
Tidak boleh menentukan orang lain harus memilih untuk siapa. o Semua transaksi aman dan ditandatangani untuk mencegah orang lain menangkap pesan.
• Tidak boleh memberikan lebih dari satu suara. o Jika voter telah melakukan pemilihan dan kembali melakukan pemilihan maka CTF akan mengembalikan pesan “Telah terjadi duplikasi Suara”. CTF tidak mengetahui ID validasi voter namun hanya nilai Hash yang dihasilkan oleh ID validasi tersebut. Hal ini menyebabkan CTF dapat mengetahui jika terjadi duplikasi. •
Tidak ada yang bisa menduplikasi suara orang lain. o
Diasumsikan bahwa terdapat saluran aman lain untuk mengirim ID pengguna dan password secara langsung untuk setiap voter, sehingga orang lain selain voter yang dimaksud tidak dapat mengetahui password voter lain.
Tidak boleh mengubah pilihan orang lain o Diberikan ID validasi yang unik dan aman sehingga orang lain tidak dapat mengganti pilihan voter lain termasuk CTF. Setiap pemilih dapat memastikan bahwa suara mereka sudah dikirimkan dan terhitung dalam penghitungan akhir. o Jika seorang voter memasukkan pilihan, CTF akan menghitung kandidat yang telah dipilih oleh voter dan mengembalikan hasil penghitungan sementara. Hal ini menyebabkan voter dapat memastikan bahwa pilihannya benar telah dihitung oleh CTF.
Secara khusus spesifikasi tambahan yang dikembangkan dalam penelitian ini adalah bahwa sistem menjamin agar voter dapat melakukan komunikasi secara lebih aman dengan CTF karena kunci simetri kini telah dilengkapi dengan penghitungan Nonce untuk menghindari serangan balasan (replay attack) dan nilai Hash untuk menjamin integritas pesan. Perancangan (Design) Perancangan sistem Online Voting terbagi menjadi dua bagian yakni perancangan sistem secara umum dan khusus. Perancangan secara umum membahas keseluruhan komunikasi yang dilakukan antara voter dengan CTF, sedangkan perancangan secara khusus difokuskan untuk membahas secara lebih rinci mengenai pengembangan sistem. Perancangan Sistem Secara Umum Secara umum CTF melayani 3 fungsionalitas agar dapat berkomunikasi dengan voter yakni permintaan daftar kandidat (Request Candidate), melakukan voting (Vote), dan melihat dan memverifikasi hasil yang sudah dipilih (Request My Vote). Proses permintaan daftar kandidat (Request Candidate) dari voter menuju CTF dilakukan melalui langkah-langkah sebagai berikut: 1 2 3 4 5
Voter meminta daftar kandidat dari CTF. CTF mengirimkan kunci publik CTF (kunci publik RSA) dan sertifikat. Voter membaca kunci publik CTF dan memverifikasi sertifikat dengan kunci publik CA. Voter membangkitkan kunci simetri Blowfish. Kunci simetri Blowfish dienkripsi dengan kunci publik CTF kemudian dikirim kembali ke CTF. 9
6 7 8 9 10
Voter mengirimkan permintaan Daftar Kandidat kepada CTF dengan symmetric cipher. CTF mendekripsi kunci simetri dengan kunci privat RSA dan mendekripsi pesan dengan kunci simetri. Dengan kunci simetri CTF mengenkripsi daftar kandidat dan mengirimkan kepada voter. CTF menandatangani daftar kandidat dan mengirimkannya kepada voter. Voter mendekripsi daftar kandidat dan memverifikasi tanda tangan CTF.
Proses komunikasi antara voter dengan CTF untuk fungsionalitas permintaan kandidat dapat dilihat pada Gambar 6.
4 5 6 7 8
9 10 11
Voter membangkitkan kunci simetri Blowfish. Voter mengenkripsi kunci simetri tersebut dengan kunci publik CTF dan mengirimkannya kepada CTF. Voter mengirimkan pesan yang terdiri dari VOTE, validationID, kandidat CTF menggunakan symmetric cipher. CTF mendekripsi kunci simetri dengan kunci publik RSA, dan mendekripsi pesan dengan kunci simetri. CTF melakukan pemeriksaan apakah validationID valid. Jika ya, maka suara dihitung dan dimasukkan ke dalam kotak suara. CTF mengirimkan konfirmasi kandidat kepada voter. Menggunakan kunci simetri CTF mengirimkan pesan kepada voter pernyataan “OK” dan menandatanganinya. Voter mendekripsi pesan dengan kunci publik dan memverifikasi sertifikat.
Proses komunikasi antara voter dengan CTF untuk fungsionalitas melakukan pemilihan (vote) dapat dilihat pada Gambar 7. Voter
CTF 1. Permintaan Melakukan Pemilihan (Vote)
2. Kunci publik RSA bersama sertifikat Membaca kunci publik CTF dan menverifikasi sertifikat dengan kunci publik CA
Voter membangkitkan kunci simetri Blowfish
Ruang Lingkup Pengembangan Sistem
3. Kunci Simetri Blowfish di enkripsi dengan kunci publik CTF
4. Voter mengirimkan pesan yang terdiri dari VOTE, ID validasi, kandidat CTF menggunakan symmetric cipher
Gambar 6 Proses Komunikasi Voter – CTF untuk Fungsionalitas Permintaan Kandidat. Fungsionalitas kedua yang dilayani oleh CTF adalah permintaan voter untuk melakukan pemilihan (vote). Langkah-langkah komunikasi yang dilakukan untuk memenuhi fungsionalitas yang kedua adalah: 1 2 3
Voter meminta untuk melakukan pemilihan (voting). CTF mengirimkan kunci publik RSA bersama sertifikat. Voter membaca kunci publik RSA dan memverifikasi sertifikat dengan kunci publik RSA dan memverifikasi sertifikat dengan kunci publik CA.
5. Pesan pernyataan “OK” dan tanda tangan CTF yang telah dienkripsi dengan kunci simetri Voter mendekripsi konfirmasi kandidat
CTF mendekripsi kunci simetri dengan kunci privat RSA dan mendekripsi pesan dengan kunci simetri
CTF melakukan pemeriksaan apakah ID validasi valid. Jika ya, maka suara dihitung dan dimasukkan ke dalam kotak suara.
Gambar 7 Proses Komunikasi Voter – CTF untuk Fungsionalitas Permintaan Melakukan Pemilihan (vote). Fungsionalitas yang ketiga adalah melakukan verifikasi terhadap kandidat yang telah dipilih oleh voter. Langkah–langkah
10
komunikasi yang dilakukan untuk memenuhi fungsionalitas yang ketiga adalah: 1 2 3
4 5 6 7 8 9
Voter meminta untuk melakukan verifikasi terhadap pilihannya. CTF mengirimkan kunci publik RSA bersama sertifikat. Voter membaca kunci publik RSA dan memverifikasi sertifikat dengan kunci publik RSA dan memverifikasi sertifikat dengan kunci publik CA. Voter membangkitkan kunci simetri Blowfish. Voter mengenkripsi kunci simetri tersebut dengan kunci publik CTF dan mengirimkannya kepada CTF. Voter mengirimkan pesan meminta hasil menggunakan symmetric cipher. CTF mendekripsi kunci simetri dengan kunci publik RSA dan mendekripsi pesan dengan kunci simetri. Menggunakan kunci simetri CTF, mengenkripsi hasil voting kepada voter. Voter mendekripsi hasil pemilihan dengan kunci publik dan memverifikasi tanda tangan.
Proses komunikasi antara voter dengan CTF untuk fungsionalitas verifikasi hasil pilihan dapat dilihat pada Gambar 8.
Area pengembangan sistem selanjutnya dilakukan pada proses nomor tiga dari Gambar 6, 7, dan 8. Untuk memperjelas ruang lingkup pengembangan sistem maka penulisan proses nomor tiga diberi warna merah dan terletak di dalam lingkaran bergaris putus-putus untuk membedakan dengan proses lainnya. Perancangan Pengembangan Sistem 1 Perancangan Online Voting dengan Java Web Start Pemilu Online Voting dirancang dengan model topologi infrastruktur dimana komunikasi antara voter, CLA, dan CTF dijembatani oleh wireless acces point. Gambar 9 menunjukkan rancangan topologi pemilu online. Sistem Online Voting dirancang dengan mengadopsi cara kerja protokol Two Central Facilities. Oleh karenanya perancangan Java Web Start dimulai dengan memisahkan CLA dan CTF ke dalam dua server yang berbeda. Selanjutnya dilakukan pendistribusian kuncikunci antara voter, CLA dan CTF. Pada penelitian sebelumnya program Online Voting diimplementasikan untuk single host sehingga kunci-kunci milik voter, CLA, dan CTF berada pada satu berkas yang sama. Pada penelitian ini program Online Voting dikembangkan agar dapat diimplementasikan menjadi multiple host. Agar dapat mempermudah voter dalam menjalankan program ini, dilakukan konversi dari aplikasi berbasis desktop menjadi basis web dengan teknologi Java Web Start. CLA yang berfungsi untuk memverifikasi voter bertindak sebagai server pertama sehingga berkas aplikasi pemilu online yang harus diunduh oleh voter ditempatkan di root CLA.
Gambar 8 Proses Komunikasi Voter – CTF untuk Fungsionalitas Melakukan Verifikasi Pilihan.
11
7 CLA
8
CTF
balasan paket dari CTF berupa pesan, nilai Hash, dan Nonce Balasan. Voter akan melakukan pemeriksaan nilai Hash. Jika Nilai Hash valid maka pemeriksaan dilanjutkan dengan memeriksa nilai Nonce.
Diagram alir pengiriman dan penerimaan kunci simetri oleh voter dapat dilihat pada Gambar 10.
Wireless Access Point
Mulai
voter
voter
Membangkitkan objek pasangan kunci simetri dengan algoritme Blowfish
Enkripsi Kunci Simetri dengan algoritme RSA
Kunci Simetri
voter
Gambar 9 Jaringan Wireless Online Voting dengan Topologi Infrastruktur.
Membangkitkan nilai Nonce
Mengirim Cipher Text (1) ke CTF (Paket 1)
Cipher Text (1) Kunci Simetri
Nonce
Gabungkani Kunci Simetri dan Nonce
Kunci Simetri + Nonce
Gabungkan nilai Kunci Simetri+Nonce + Nilai Hash
Nilai Hash
Mencari nilai Hash dari Kunci Simetri+Nonce
2 Perancangan pengiriman kunci simetri Program Online Voting yang dibangun oleh Sireesha, Janga dan So-In Chakchai pada awalnya dirancang dengan mengimplementasikan 1024 RSA sehingga enkripsi dilakukan hanya terhadap kunci simetri. Penelitian ini dirancang agar dapat menambah faktor keamanan sistem sehingga sistem yang baru kini menggunakan 2048 RSA. Dengan peningkatan ini, nilai Nonce dan SHA-1 dapat dikombinasikan bersama dengan kunci simetri agar proses pengiriman kunci menjadi lebih aman.
Kunci Simetri+Nonce+ Hash
1 2 3
4 5 6
Inisialisasi key generator dilakukan dari 1024 menjadi 2048 RSA. Voter membangkitkan kunci simetri dengan algoritme Blowfish. Kunci simetri dikirim melalui 2 paket : a) Paket yang pertama berisi kunci simetri yang kemudian dienkripsi dan dikirimkan dari voter menuju CTF. b) Paket kedua berisi kunci simetri yang digabungkan dengan nilai Nonce dan nilai Hash dari kombinasi kunci simetri dan Nonce. Kunci simetri pada paket pertama kemudian dienkripsi dengan algoritme RSA dan dikirimkan ke CTF. Untuk memperkuat faktor keamanan pengiriman kunci voter mengirimkan paket kedua kepada CTF. Selanjutnya jika semua proses verifikasi berhasil dilewati, voter akan menerima
Menerima Pesan 1 yang dienkripsi dengan Kunci Simetri
Mendekripsi Pesan 1
Hasil perancangan pengiriman kunci simetri dari voter menuju CTF dijelaskan sebagai berikut:
Mengirim Cipher Text (2) ke CTF (Paket 2)
tidak
Pesan + nilai Hash + Nounce
Informasikan bahwa kiriman paket benar
Cipher Text 2 Kunci Simetri+Nonce+ Hash
Enkripsi Kunci Simetri+Nonce+Hash dengan algoritme RSA
Periksa nilai Hash
ya
Apakah Nilai inonce3!=inonce2 +1?
Apakah nilai Hash benar?
ya
tidak
Selesai
Sistem dihentikan
Gambar 10 Diagram Alir Pengiriman dan Penerimaan Kunci Simetri Voter. Hasil perancangan pengiriman kunci simetri dari CTF menuju voter dijelaskan sebagai berikut: 1 2
CTF mendapatkan kiriman paket pertama dari voter. Paket pertama didekripsi dengan kunci privat CTF dan menghasilkan kunci simetri.
12
3 4
5
6
CTF kemudian menerima paket kedua dari voter. CTF mendekripsi paket kedua dan mendapatkan pesan nilai Nonce dan Hash dari kunci simetri yang dikirim pada paket pertama. CTF memeriksa nilai Hash yang dikirimkan. Jika nilai Hash tidak valid maka sistem dihentikan. Jika valid, maka CTF melakukan pemeriksaan terhadap nilai Nonce. Jika nilai Nonce tidak valid maka sistem dihentikan, jika nilai Nonce valid maka CTF akan mengirimkan Nonce balasan ke voter. Nilai Nonce balasan dienkripsi dan dikirimkan bersama dengan pesan konfirmasi CTF serta nilai Hash dari pesan.
Diagram alir pengiriman dan penerimaan kunci simetri oleh CTF dapat dilihat pada Gambar 11.
mengandung semua fungsi utama yang diperlukan oleh voter untuk menjalankan program Online Voting dari komputer voter. Selanjutnya pengaturan konfigurasi diubah menjadi Web Start. Konfigurasi Java Web Start dapat dilihat pada Gambar 12 dan 13. Pada saat dilakukan build pada project Online Voting, Java Web Start akan menghasilkan 3 berkas, yakni berkas aplikasi bertipe jar, berkas launch bertipe html, serta berkas launch bertipe jnlp. Berkas aplikasi bertipe jar berisi semua kelas dan berkas lain yang dibutuhkan voter untuk menjalankan aplikasi voting. Berkas-berkas yang dibungkus ke dalam satu berkas bertipe jar di antaranya kelas User Interface.Java,Voter.Java, Voter.private, Voter.public, serta CA Public. Berkas launch bertipe jnlp digunakan untuk memudahkan voter dalam menjalankan program Online Voting. Dengan berkas ini voter hanya perlu menekan sebuah link dan mendapatkan aplikasi Online Voting berjalan di luar browser. Berkas launch bertipe html tidak diperlukan untuk menjalankan program Online Voting karena fungsi untuk menjalankan program dari browser telah diintegrasikan dengan situs IPB Online Voting. Tampilan antarmuka Situs IPB Online Voting dapat dilihat pada Gambar 14 dan 15. Voter dapat menjalankan program Online Voting dengan cara mengunduh Voter.rar dari situs IPB Online Votng. Selanjutnya hasil unduhan diekstrak ke dalam direktori C pada komputer voter. Langkah terakhir dilakukan dengan menjalankan berkas launch.jnlp. Jika prosedur menjalankan aplikasi Voting telah dilakukan dengan benar maka tampilan antarmuka Online Voting akan muncul seperti yang terlihat pada Gambar 16. Berkas launch bertipe .jnlp dapat dilihat pada Gambar 17.
Gambar 11 Diagram Alir Pengiriman dan Penerimaan Kunci Simetri CTF. Implementasi 1. Implementasi Online Voting dengan Java Web Start Perubahan aplikasi Online Voting dari basis desktop menjadi basis web diolah dengan menggunakan teknologi Java Web Start dengan Netbeans 6. Pengaturan Java Web Start dilakukan pada project properties program Online Voting. Pada window tersebut menu Run dipilih dan pada field Main Class kelas utama yang dipilih adalah kelas Voter.java. Kelas ini dipilih karena kelas Voter
Gambar 12 Pengaturan Java Web Start pada project properties window menu Run.
13
<jnlp spec="1.0+" codebase="file:/C:/Voter/ " href="launch.jnlp">
OnlineVoting Matt <description>OnlineVoting <description kind="short">OnlineVoting
Gambar 13 Pengaturan Java Web Start pada project properties window menu Application Web Start.
<security>
<j2se version="1.5+"/> <jar href="OnlineVoting.jar" main="true" download="eager"/>
Gambar 14 Situs IPB Online Voting Centre (Bagian 1).
<argument>localhost <argument>localhost
Gambar 17 Berkas launch.jnlp untuk memunculkan aplikasi Online Voting. 2. Implementasi Pengiriman Kunci Simetri
Gambar 15 Situs IPB Online Voting Centre (Bagian 2).
Untuk mengembangkan 1024 RSA menjadi 2048 RSA, hal pertama yang dilakukan adalah membuat inisialisasi pada Kelas GenerateRandomKeys.java. Hasil pemrograman untuk kelas GenerateRandomKeys dapat dilihat pada Lampiran 1. Selanjutnya untuk memulai komunikasi antara voter dengan CTF, voter membangkirkan kunci simetri dengan algoritme Blowfish seperti yang ditujukkan pada pemrograman berikut : KeyGenerator kg = KeyGenerator.getInstance("Blowfish"); SecretKey symmetricKey = kg.generateKey();
Gambar 16 Tampilan antamuka Online Voting.
Agar pengiriman kunci simetri dapat dilakukan dengan aman maka dilakukan instansiasi variabel cipher dengan algoritme RSA seperti berikut : 14
Cipher cipher = Cipher.getInstance("RSA");
String decode64AddNonce2 displayBase64(digestIt(theDigest2));
Voter selanjutnya mengirimkan algoritme kunci simetri serta panjang kunci simetri kepada CTF. Hal ini diperlukan agar CTF dapat membangun kunci yang sama seperti kunci simetri yang dimiliki voter. Pemrograman untuk membangun kunci simetri dapat dilihat pada coding di bawah ini:
Nilai kunci simetri, Nonce, dan nilai Hash digabungkan menjadi paket 2 dan kemudian dikirimkan ke CTF:
ByteArrayOutputStream keyBytes = new ByteArrayOutputStream();
output.writeObject(cipher.doFinal(inputA ddNonce2.getBytes()));
DataOutputStream keyStream = new DataOutputStream(keyBytes); byte [] encodedKey = symmetricKey.getEncoded(); System.out.println("ini isi encoded Key:"+ encodedKey); keyStream.writeUTF(symmetricKey.getAlgor ithm()); keyStream.writeInt(encodedKey.length); keyStream.write(encodedKey, 0, encodedKey.length);
Selanjutnya kunci simetri dienkripsi menggunakan algoritme RSA dan dikirimkan menuju CTF dengan pemrograman yang dituliskan di bawah ini : cipher.init(Cipher.ENCRYPT_MODE, CLA_publicKey); byte [] test2 = cipher.doFinal(KeyBytes.toByteArray);
=
String inputAddNonce2=AddNonce2+" "+decode64AddNonce2; cipher.init(Cipher.ENCRYPT_MODE, CLA_publicKey);
Setelah serangkaian proses di atas selesai dilakukan, langkah selanjutnya adalah voter menunggu kiriman paket balasan dari CTF. Jika verifikasi pada CTF berhasil dilakukan maka voter akan mendapatkan paket dan mendekripsinya serta melakukan pemeriksaan pada nilai Nonce yang dikirimkan untuk memastikan bahwa benar CTF telah menerima kunci simetri dari voter. Pemrograman untuk langkah ini dituliskan sebagai berikut: Cipher cipherstream = Cipher.getInstance("Blowfish"); cipherstream.init(Cipher.DECRYPT_MODE, symmetricKey);
byte[] decryptedKs = cipherstream.doFinal((byte[])input.readO bject()); System.out.println("5.Voter Client menerima pesan pertama dengan Ks :"+decryptedKs.toString()); decryptedString = new
output.writeObject(test2);
String(decryptedKs);
Setelah paket pertama selesai dikirimkan, voter mengirimkan paket kedua yang berisi kunci simetri, Nonce serta nilai Hash. Kunci simetri yang dibangkitkan oleh algoritme Blowfish memiliki tipe data byte. Nilai Nonce kemudian dibangkitkan dan selanjutnya digabungkan dengan kunci simetri dengan pemrograman sebagai berikut :
int idx = 0; int tokenCount;
iNonce3 = nctf.nextInt(maxNonce+1);
// check CTF signature
AddNonce2=test2+" "+iNonce3;
String CheckSHA1 = words[0];
String words[] = new String [500]; StringTokenizer st = new StringTokenizer(decryptedString); tokenCount = st.countTokens(); while (st.hasMoreTokens()) { words[idx] = st.nextToken(); idx++; }
byte [] dataBuffer1 =
Untuk menjaga integritas pesan yang nantinya akan dikirimkan ke CTF, maka langkah selanjutnya adalah mencari nilai Hash dari pesan.
CheckSHA1.getBytes();
byte
displayBase64(digestIt(theDigest1));
[]
test3=AddNonce2.getBytes();
byte [] theDigest1 = digestIt(dataBuffer1); String decode64 =
byte [] theDigest2=digestIt(test3);
15
if (decode64.compareTo(words[1])==0) { System.out.println("6.Voter Client menerima konfirmasi Valid (Ks) :"+decryptedString);} else { System.out.println("6.Voter Client menerima konfirmasi yang salah (Ks) :"+decryptedString); System.exit(0); } int k=0;
sama dengan nilai Hash yang dihasilkan dari kombinasi kunci simetri dan nilai Nonce maka paket yang dikirimkan oleh voter terjaga integritasnya. Jika nilai Hash tidak sama maka sistem akan dihentikan dan mengeluarkan pesan bahwa verifikasi gagal dilakukan. String CheckSHA1AddNonce2 = words3[0]+" "+words3[1]; byte [] dataBuffer1AddNonce2=CheckSHA1AddNonce2. getBytes();
k=Integer.parseInt(words[2]); if (k!=iNonce3+1){
byte [] theDigest1AddNonce2=digestIt(dataBuffer1 AddNonce2);
System.out.println("Nilai INonce di kunci simetri CTF Invalid"); System.exit(0); }
String decode64New = displayBase64(digestIt(theDigest1AddNonc e2));
else System.out.println("INonce+1 valid");
if (decode64New. compareTo (words3[2])==0) {
Fungsi do_CTF untuk kelas Voter.java dapat dilihat selengkapnya pada Lampiran 2. Pada kelas CTFServer.java, CTF mendekripsi paket 1 yang dikirimkan oleh voter sebagai berikut: byte[] decryptedKeyBytes = cipher.doFinal((byte[])input.readObject( )); decryptedString = String(decryptedKeyBytes);
new
decryptedKeyBytes = cipher.doFinal((byte[])input.readObject( ));
CTF selanjutnya juga menerima paket kedua dan melakukan dekripsi terhadap paket 2:
System.out.println("6a. Server CTF-Voter menerima Key+Nonce+Hash simetri yang valid"); } else { System.out.println("6a. CTF-Voter Server menerima Key+Nonce+Hash simetri yang tidak valid"); System.out.println(" SHA1 :"+decode64New+",Length :"+decode64New.length()); System.out.println(" SHA2 :"+words3[2]+",Length :"+words3[2].length()); System.exit(0);}
byte[] z =(byte[])input.readObject();
CTF mengirimkan paket berisi nilai Nonce+1 kepada voter bersama dengan paket pesan dan nilai Hash, sebagai berikut:
byte[]decryptedKeyBytes3=cipher.doFinal( byte[])z);
String q = String.valueOf (Integer.parseInt(words3[1])+1);
decryptedString3 = (decryptedKeyBytes3);
Cipher cipherstream = Cipher.getInstance("Blowfish");
new
String
Untuk mendapatkan komponen dalam paket yang dikirimkan, CTF melakukan tokenisasi untuk mendapatkan isi dari paket 2:
cipherstream.init(Cipher.ENCRYPT_MODE, symmetricKey);
String words3[]=new String [500];
// Sign each message before send byte[] dataBuffer1 = ReplyCTF.getBytes(); byte[] theDigest1 = digestIt(dataBuffer1);
StringTokenizer st3 = new StringTokenizer(decryptedString3);
String decode64 = displayBase64(digestIt(theDigest1));
tokenCount3=st3.countTokens();
String Reply = ReplyCTF+ " "+decode64+" "+q; byte[] encryptedstream = cipherstream.doFinal(Reply.getBytes()); System.out.println("5.CTF Server mengirimkan penegasan pesan pertama dengan Ks :"+Reply);
int idx3=0; int tokenCount3;
while(st3.hasMoreTokens()){words3[idx3]= st3.nextToken();idx3++;} String q = String.valueOf(Integer. parseInt(words3[1])+1);
CTF kemudian memeriksa nilai Hash yang ada pada paket 2. Jika isi nilai Hash pada paket 2
output.writeObject(encryptedstream);
16
Selanjutnya jika seluruh proses pengiriman paket 2 sudah berhasil melewati proses pemeriksaan, proses pembentukan kunci simetri akan diproses sebagai berikut: ... ByteArrayInputStream keyBytes = new ByteArrayInputStream(decryptedKeyBytes); DataInputStream keyStream = new DataInputStream(keyBytes); String algorithm = keyStream.readUTF(); int length = keyStream.readInt(); byte[] encodedKey = new byte[length]; keyStream.readFully(encodedKey); SecretKey symmetricKey = new SecretKeySpec(encodedKey, algorithm); keyStream.close(); keyBytes.close(); ...
Fungsi main selengkapnya untuk kelas CTFServer.java dapat dilihat pada Lampiran 5.
Pengujian Pengujian terhadap sistem Online Voting ini dilakukan menggunakan Black-box testing. Pengujian dibagi ke dalam 2 tahap, yakni: 1. Tahap pengujian terhadap penggunaan Java Web Start pada sistem Online Voting. Pada tahap ini akan diuji apakah sistem sudah berjalan dengan baik dengan protokol Two Central Facilities dan apakah sistem sudah cukup stabil jika digunakan di dalam jaringan. 2. Tahap pengujian terhadap pengiriman suara voter menuju Central Tabulating Facilities (CTF) termasuk pengujian terhadap pengiriman kunci simetri yang telah dikembangkan. Pada tahap ini akan diujikan apakah pengembangan sistem pengiriman suara voter sudah dapat berjalan dengan stabil dan cukup aman terhadap ancaman kriptanalis. Hasil pengujian Java Web Start dan pengiriman kunci simetri dapat dilihat pada Tabel 1 dan 2. Pengujian sistem secara keseluruhan dapat dilihat pada Lampiran 4.
Tabel 1 Pengujian Java Web Start No.
Deskripsi Uji
Kondisi Awal
Skenario Uji
Hasil yang diharapkan
Hasil Uji
1.
Voter mengunduh Voter.rar dari situs Online Voting
Voter belum memiliki kunci simetri
Voter membuka situs Online Voting dan mengunduh Voter.rar
Voter mengunduh menyimpan Voter.rar
dapat dan berkas
Berhasil
2.
Voter mencoba menjalankan aplikasi Online Voting Java Web Start
Voter telah mengunduh Voter.rar namun belum membuka aplikasi Java Web Start
Voter menjalankan aplikasi Online Voting
Aplikasi Online Voting dapat ditampilkan di layar voter
Berhasil
3.
Voter mencoba untuk memilih dan mengirim hasil pilihan kandidat kepada CTF
Voter membuka aplikasi Online Voting dan sudah log in namun belum memilih kandidat
Voter menekan button submit Vote
Hasil pilihan kandidat berhasil dikirimkan dan diterima oleh CTF
Berhasil
17
No.
Deskripsi Uji
Kondisi Awal
4.
Voter mencoba untuk memverifikasi apakah hasil pilihannya telah dihitung oleh CTF
Voter telah memilih namun belum melakukan verifikasi pilihan
Skenario Uji
Hasil yang diharapkan
Hasil Uji
Voter menekan button verify Vote
CTF mengirimkan konfirmasi kepada Voter bahwa benar hasil pilihannya telah dihitung oleh CTF
Berhasil
Tabel Pengujian Pengiriman Kunci Simetri No.
Deskripsi Uji
Kondisi Awal
Skenario Uji
Hasil yang diharapkan
Hasil Uji
1.
Membangkitkan kunci simetri dengan Algoritme Blowfish di kelas Voter.java
Voter belum memiliki kunci simetri
Melakukan running pada kelas Voter.java
Voter memiliki kunci simetri
Berhasil
2.
Mengirimkan kunci simetri (paket 1) yang telah dienkripsi dari voter menuju CLA
CLA belum menerima kunci simetri (paket 1) dari voter
Voter mengenkripsi kunci simetri dan mengirimkannya kepada CLA
CLA kunci voter
memiliki simetri
Berhasil
3.
Mengirimkan kunci simetri+Nonce+ni lai Hash (paket 2) yang telah dienkripsi dari voter menuju CLA
CLA belum menerima kunci simetri +Nonce+Has h (paket 2) dari voter
Voter mengenkripsi paket 2 dan mengirimkannya kepada CLA
CLA kunci voter
menerima simetri
Berhasil
4.
CLA mengirimkan Nonce balasan kepada Voter
Voter belum menerima Nonce balasan
CLA mengirimkan Nonce balasan
Voter menerima Nonce balasan dari CLA
Berhasil
5.
Mengirimkan kunci simetri (paket 1) yang telah dienkripsi dari voter menuju CTF
CTF belum menerima kunci simetri (paket 1) dari voter
Voter mengenkripsi kunci simetri dan mengirimkannya kepada CTF
CTF kunci voter
memiliki simetri
Berhasil
6.
Mengirimkan kunci simetri+Nonce+ni lai Hash (paket 2) yang telah dienkripsi dari voter menuju CTF
CTF belum menerima kunci simetri +Nonce+Has h (paket 2) dari voter
Voter mengenkripsi paket 2 dan mengirimkannya kepada CTF
CTF menerima kunci simetri voter
Berhasil
18
No. 7.
Deskripsi Uji
Kondisi Awal
Skenario Uji
Hasil yang diharapkan
Hasil Uji
CTF mengirimkan Nonce balasan kepada Voter
Voter belum menerima Nonce balasan
CTF mengirimkan Nonce balasan
Voter menerima Nonce balasan dari CTF
Berhasil
KESIMPULAN DAN SARAN Kesimpulan Sistem Online Voting dengan menggunakan protokol Two Central Facilities dapat membantu penghitungan suara menjadi lebih cepat dan meningkatkan efisiensi terkait dengan sumberdaya yang meliputi waktu, biaya dan tenaga. Untuk membuat sistem Online Voting lebih mudah dan aman digunakan di dalam jaringan, beberapa pengembangan pada sistem telah dilakukan. Pada penelitian ini sistem Online Voting berhasil diintegrasikan menggunakan Java Web Start . Dengan teknologi Java Web Start pula setiap voter kini lebih mudah menjalankan aplikasi Online Voting karena voter tidak lagi harus mengunduh kelas Voter.class dan UserInterface.class seperti program Online Voting sebelumnya. Beberapa penyempurnaan untuk mengamankan pengiriman kunci simetri seperti peningkatan kunci RSA menjadi 2048 bit pun telah diimplementasikan dalam sistem IPB Online Voting. Penggunaan RSA 2048 bit memungkinkan sistem pengiriman kunci simetri dikombinasikan dengan Nonce dan SHA-1 sehingga sistem pengiriman suara dapat berjalan dengan lebih aman.
dilakukan untuk diantaranya :
penelitian
selanjutnya
•
Sistem Online Voting yang kini dikembangkan masih menggunakan wireless acces point intern departemen dalam fakultas MIPA IPB. Hal ini mengakibatkan sistem hanya dapat diimplementasikan sebatas cakupan satu departemen. Pada penelitian selanjutnya akan lebih baik jika sistem Online Voting dapat diimplementasikan dalam cakupan yang lebih luas seperti dalam jaringan seluruh kampus IPB.
•
Pengembangan kunci RSA menjadi 2048 bit menyebabkan kunci simetri dapat dikirim dengan kombinasi Nonce dan SHA-1. Namun karena tipe data kunci simetri, Nonce serta SHA-1 berbeda maka pengirman paket Nonce dan SHA-1 masih dikirimkan dalam 2 paket terpisah. Jika pengiriman kunci simetri, Nonce, dan SHA-1 dapat dikemas dalam satu paket pengiriman, tentu pengiriman kunci simetri bisa dilakukan secara lebih efisien dan optimal.
Dari penelitian yang dilakukan terlihat bahwa sistem Online Voting menggunakan Two Central Facilities memungkinkan untuk diterapkan dalam lingkungan Departemen Ilmu Komputer IPB dan dapat terus dikembangkan untuk membantu proses penyelenggaraan pemilu. Saran Seiring dengan berkembangnya teknologi kriptanalis maka peluang terjadinya ancaman terhadap sistem keamanan Online Voting terus meningkat. Pada penelitian kali ini sistem masih memiliki kelemahan dan kekurangan yang diharapkan dapat terus dikembangkan dan diperbaiki pada penelitian selanjutnya. Rekomendasi yang dapat 19
DAFTAR PUSTAKA Anderson, Ross, Security Engineering: A Guide to Building Dependable Distributed Systems, Wiley. Bishop, Matt.2003. Computer Security Art and Science, Addison-Wesley. Boneh, D.1999. Twenty Years of attacks on the RSA Cryptosystem. Notices of the American Mathematical Society (AMS). Bruce, Schneier. 1996. Applied Cryptography, Second Edition, Jon Wiley & Sons. Dan DuFeu and Jon Harris, “Online Election System,” 95.413 Project Report, Carleton University, April 2001. Kurniawan, Agus. 2008. Konsep dan Implementasi Cryptography dengan .Net, PT.Dian Rakyat,Jakarta. McLeod jr., R. & Schell, G.P. 2004. Management Information Systems, International Edition, Pearson/Prentice Hall. Sireesha, Janga & So-In Chakchai. 2005. Secure Virtual Election Booth with Two Central Facilities. Department of Computer Science Washington University in St. Louis, USA. Sun Microsystem. 2009. Java Web Start Technology. http://java.sun.com/javase/ technologies/desktop/javawebstart/index.js p (15 Juli. 2009).
20
LAMPIRAN
21
Lampiran 1 Implementasi GenerateRandomKeys.java
import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey;
import javax.crypto.*; import javax.crypto.spec.*; import java.io.*; import javax.crypto.Cipher.*; /** * This program generates a Blowfish key, retrieves its raw bytes, and * then reinstantiates a Blowfish key from the key bytes. * The reinstantiated key is used to initialize a Blowfish cipher for * encryption. */
public class GenerateRandomKeys {
public static void main(String[] args) throws Exception {
try { String userstore = "", userstorecount = ""; FileOutputStream outuserpasswdID, outuserpasswdIDcount; // declare a file output object PrintStream puserpasswdID, puserpasswdIDcount;// declare a print stream object PrivateKey cla_privateKey = null, ctf_privateKey = null, ca_privateKey = null, voter_privateKey = null; PublicKey cla_publicKey = null, ctf_publicKey = null, ca_publicKey = null, voter_publicKey = null;
// Create a secure random number generator SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
// Change from 1024 random bits to 2048 byte[] bytes = new byte[2048/8]; sr.nextBytes(bytes);
outuserpasswdID = new FileOutputStream("CLA.voters"); outuserpasswdIDcount = new FileOutputStream("CLA.voters-count");
puserpasswdID = new PrintStream( outuserpasswdID ); puserpasswdIDcount = new PrintStream( outuserpasswdIDcount ); // Create userID, passwdID, and ValidationID
22
// Create userID, passwdID, and ValidationID /* for (int i=0;i<10;i++) {
System.out.print("user"+i+" "+sr.nextLong()+" "); puserpasswdID.print ("user"+i+" "+sr.nextLong()+" "); int seedByteCount = 10; byte[] seed = sr.generateSeed(seedByteCount); sr = SecureRandom.getInstance("SHA1PRNG"); sr.setSeed(seed); SecureRandom sr2 = SecureRandom.getInstance("SHA1PRNG"); sr2.setSeed(seed); puserpasswdID.println(sr2.nextLong()); System.out.println(sr2.nextLong()); } puserpasswdID.close(); */
for (int i=0;i<10;i++) {
//System.out.print(userstore); //puserpasswdID.print ("user"+i+" "+sr.nextLong()+" "); //puserpasswdIDcount.print ("user"+i+" "+sr.nextLong()+" "); userstore = "user"+i+" "+sr.nextLong(); int seedByteCount = 10; byte[] seed = sr.generateSeed(seedByteCount); sr = SecureRandom.getInstance("SHA1PRNG"); sr.setSeed(seed); SecureRandom sr2 = SecureRandom.getInstance("SHA1PRNG"); sr2.setSeed(seed); userstore = userstore+" "+sr2.nextLong(); userstorecount = userstore+" "+0; puserpasswdID.println(userstore); puserpasswdIDcount.println(userstorecount); System.out.println(userstore); } puserpasswdID.close();
String fl1 = "CA.public"; String fl2 = "CA.private"; for (int i=3; i>=0; i--) {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
23
//diganti jadi 2048 keyGen.initialize(2048); KeyPair keypair = keyGen.genKeyPair(); PrivateKey privateKey = (RSAPrivateKey)keypair.getPrivate(); PublicKey publicKey = (RSAPublicKey)keypair.getPublic();
if (i==0) { fl1 = "CLA.public"; fl2 = "CLA.private"; cla_publicKey = publicKey; cla_privateKey = privateKey;
System.out.println("+++ Creating signature for CLA...");
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); ObjectOutputStream contentStream = new ObjectOutputStream(byteStream); contentStream.writeObject(cla_publicKey); contentStream.writeObject(new String("CLA"));
Signature sig = Signature.getInstance("SHA1withRSA"); sig.initSign(ca_privateKey); sig.update(byteStream.toByteArray()); byte[] cert = sig.sign();
contentStream.close(); byteStream.close();
// write the cert out to a file String certFileName = "CLA.cert"; System.out.println("+++ Outputting certificate to file: " + certFileName + "..."); DataOutputStream certStream = new DataOutputStream (new FileOutputStream(certFileName, false)); certStream.writeInt(cert.length); certStream.write(cert, 0, cert.length); certStream.close();
System.out.println("+++ Done...");
} else if (i==1) { fl1 = "CTF.public"; fl2 = "CTF.private"; ctf_publicKey = publicKey; ctf_privateKey = privateKey;
24
System.out.println("+++ Creating signature for CTF...");
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); ObjectOutputStream contentStream = new ObjectOutputStream(byteStream); contentStream.writeObject(ctf_publicKey); contentStream.writeObject(new String("CTF"));
Signature sig = Signature.getInstance("SHA1withRSA"); sig.initSign(ca_privateKey); sig.update(byteStream.toByteArray()); byte[] cert = sig.sign();
contentStream.close(); byteStream.close();
// write the cert out to a file String certFileName = "CTF.cert"; System.out.println("+++ Outputting certificate to file: " + certFileName + "..."); DataOutputStream certStream = new DataOutputStream (new FileOutputStream(certFileName, false)); certStream.writeInt(cert.length); certStream.write(cert, 0, cert.length); certStream.close();
System.out.println("+++ Done...");
} else if (i==2) { fl1 = "Voter.public"; fl2 = "Voter.private"; voter_publicKey = publicKey; voter_privateKey = privateKey; } else { fl1 = "CA.public"; fl2 = "CA.private"; ca_publicKey = publicKey; ca_privateKey = privateKey;
}
ObjectOutputStream publicStream = new ObjectOutputStream (new FileOutputStream(fl1, false)); publicStream.writeObject(publicKey); publicStream.close();
25
ObjectOutputStream privateStream = new ObjectOutputStream (new FileOutputStream(fl2, false)); privateStream.writeObject(privateKey); privateStream.close();
}
/* fl1 = "Voter.CA"; String test = "111111111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111111111111111111111111111111111111111111111111111111111111111111111"; System.out.println("CA0");
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); System.out.println("CA0-1"); byte[] caencrypted = null; System.out.println("nProvider is: " + cipher.getProvider().getInfo());
cipher.init(Cipher.ENCRYPT_MODE, ca_privateKey);
caencrypted = cipher.doFinal(test.getBytes()); ObjectOutputStream privateStream = new ObjectOutputStream (new FileOutputStream(fl1, false)); privateStream.writeObject(caencrypted); privateStream.close(); */
/* Cipher cipher = Cipher.getInstance( "RSA"); cipher.init(Cipher.ENCRYPT_MODE, ca_privateKey); byte[] caencrypted = null; byte[] tempencrypted= null; for (int i=0; i<2; i++) {
System.out.println("CA1"); if (i==0) { fl1 = "Voter.CA"; tempencrypted = voter_publicKey.getEncoded(); System.out.println("CA2"); } else if (i==1) { fl1 = "CLA.CA"; tempencrypted = cla_publicKey.getEncoded();
26
System.out.println("CA3");
} else { fl1 = "CTF.CA"; tempencrypted = ctf_publicKey.getEncoded(); System.out.println("CA4"); }
System.out.println("CA5"); caencrypted = cipher.doFinal(tempencrypted);
ObjectOutputStream privateStream = new ObjectOutputStream (new FileOutputStream(fl1, false)); privateStream.writeObject(caencrypted); privateStream.close(); } System.out.println("CA3"); */ //Add Candidate list BufferedWriter out = new BufferedWriter(new FileWriter("CTF.candidate")); out.write("Fadhliy,Boyke"+" "+0+"\n"); out.write("Fajri,Hasanul"+" "+0+"\n"); out.write("Hardhienata,Medria"+" "+0+"\n"); out.write("Supiyandi,Abi"+" "+0+"\n"); out.write("Wardhani,Dina "+" "+0+"\n"); out.close();
//Add Candidate list (count for vote) BufferedWriter out1 = new BufferedWriter(new FileWriter("CTF.candidatevote")); out1.write("Fadhliy,Boyke "+" "+0+"\n"); out1.write("Fajri,Hasanul "+" "+0+"\n"); out1.write("Hardhienata,Medria "+" "+0+"\n"); out1.write("Eisenhower,Dwight"+" "+0+"\n"); out1.write("Wardhani,Dina"+" "+0+"\n"); out1.close();
} catch (NoSuchAlgorithmException e) { } } }
27
Lampiran 2 Implementasi Voter.java untuk Fungsi do_CTF ... public void do_CTF(String mode) { String Request = "VoterID-CTFID"; String RequestCandidate = "ReqCandidate"; String RequestmyVote = "ReqmyVote"; String RequestVote = "ReqVote"; Random nctf = new Random(); String RequestandN = null; String myVote = null; int maxNonce = 9999999; int iNonce=0; //Inisialisasi Nonce dan AddNonce2 tambahan int iNonce3=0; String AddNonce2=null; try { Socket clientSocket = new Socket(m_CTFServerName, VOTER_TO_CTF_PORT); ObjectOutputStream output = new ObjectOutputStream(clientSocket.getOutputStream()); ObjectInputStream input = new ObjectInputStream(clientSocket.getInputStream());
// Begin 3-way handshake (Request to vote and ask for Server Public Key) System.out.println("1.Voter Client Send out Request to Vote :"+Request); //output.writeObject(new String(inputwithsig)); output.writeObject(new String(Request)); CTF_publicKey = (RSAPublicKey)input.readObject();
/************** * Insert code here to read in the certificate and check * */
byte[] ctfCert = (byte[])input.readObject(); // here we verify the userKey and "CTF" pair ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); ObjectOutputStream contentStream = new ObjectOutputStream(byteStream); contentStream.writeObject(CTF_publicKey); contentStream.writeObject(new String("CTF"));
// verify the certificate sent by the CTF System.out.println("+++ Memverifikasi tanda tangan CA's RSA dari CTF's certificate"); Signature sig = Signature.getInstance("SHA1withRSA"); sig.initVerify(CA_publicKey);
28
sig.update(byteStream.toByteArray()); if(!sig.verify(ctfCert)) { user.getResultsArea().append("- Maaf sebuah pemeriksaan keamaanan pada Central Tabulating Facility failed gagal\n\n"); System.out.println("*** sertifikat CTF gagal\n"); clientSocket.close(); System.exit(0); } Else { System.out.println("+++ sertifikasi CTF berhasil"); } contentStream.close(); byteStream.close(); System.out.println("2.Voter Client Receive PublicKey :"+CTF_publicKey.getEncoded()); Cipher cipher1 = Cipher.getInstance( "RSA"); cipher1.init(Cipher.ENCRYPT_MODE, CTF_publicKey); byte[] encrypted1 = cipher1.doFinal(Request.getBytes()); output.writeObject(encrypted1); System.out.println("3.Voter Client Send Message with PU :"+Request);
//end 3 way-handshake // KEY---------------------------------------// Send over the symmetric key encrypted with the cla public key
KeyGenerator kg = KeyGenerator.getInstance("Blowfish"); SecretKey symmetricKey = kg.generateKey(); Cipher cipher = Cipher.getInstance( "RSA"); ByteArrayOutputStream keyBytes = new ByteArrayOutputStream(); DataOutputStream keyStream = new DataOutputStream(keyBytes); byte [] encodedKey = symmetricKey.getEncoded(); keyStream.writeUTF(symmetricKey.getAlgorithm()); keyStream.writeInt(encodedKey.length); keyStream.write(encodedKey, 0, encodedKey.length); // encrypt and send the symmetric key cipher.init(Cipher.ENCRYPT_MODE, CTF_publicKey); byte test2[]=keyBytes.toByteArray(); output.writeObject(cipher.doFinal(test2)); //***********************batas awal tambahan pengembangan kunci simetri //1. Membangkitkan nilai Nonce iNonce3 = nctf.nextInt(maxNonce+1); //2. Menggabungkan nilai kunci simetri dan Nonce AddNonce2=test2+" "+iNonce3; byte [] test3=AddNonce2.getBytes(); byte [] theDigest2=digestIt(test3);
29
//3. Mencari nilai Hash dari Kunci Simetri + Nonce String decode64AddNonce2=displayBase64(digestIt(theDigest2)); //4. Menggabungkan nilai kunci simetri, Nonce, dan Hash String inputAddNonce2=AddNonce2+" "+decode64AddNounc //5. Mengenkripsi kunci simetri, Nonce, dan nilai Hash dalam satu paket cipher.init(Cipher.ENCRYPT_MODE,CTF_publicKey); //6. Mengirimkan paket ke CTF output.writeObject(cipher.doFinal(inputAddNonce2.getBytes())); //***********************batas akhir tambahan keyStream.close(); keyBytes.close(); System.out.println("4.Voter Client mengirimkan Ks :"+ symmetricKey.getEncoded()); // communicate to CTF by symmetric key Cipher cipherstream = Cipher.getInstance("Blowfish"); cipherstream.init(Cipher.DECRYPT_MODE, symmetricKey); byte[] decryptedKs = cipherstream.doFinal((byte[])input.readObject()); System.out.println("5.Voter Client menerima pesan pertama dengan Ks :"+decryptedKs.toString()); decryptedString = new String(decryptedKs); int idx = 0; int tokenCount; String words[] = new String [500]; StringTokenizer st = new StringTokenizer(decryptedString); tokenCount = st.countTokens(); while (st.hasMoreTokens()) { words[idx] = st.nextToken(); idx++; } System.out.println("Ini isi komponen 1 pesan "+words[0]); System.out.println("Ini isi komponen 2 pesan "+words[1]); // check CTF signature String CheckSHA1 = words[0]; byte [] dataBuffer1 = CheckSHA1.getBytes(); byte [] theDigest1 = digestIt(dataBuffer1); String decode64 = displayBase64(digestIt(theDigest1)); if (decode64.compareTo(words[1])==0) { System.out.println("6.Voter Client menerima konfirmasi Valid (Ks) :"+decryptedString); } else { System.out.println("6.Voter Client menerima konfirmasi yang salah (Ks) :"+decryptedString); System.exit(0); } //************************************Batas awal pemeriksaan Nonce //7. Melakukan Pemeriksaan nilai Nonce int k=0; k=Integer.parseInt(words[2]); if (k!=iNonce3+1){ System.out.println("Nilai INonce di kunci simetri CTF Invalid"); } else
30
System.out.println("INonce+1 valid"); //************************************Batasan akhir // Create Signature for each message iNonce = nctf.nextInt(maxNonce+1); RequestandN = RequestCandidate+" "+m_validationId+" "+Request+" "+iNonce; dataBuffer1 = RequestandN.getBytes(); theDigest1 = digestIt(dataBuffer1); decode64 = displayBase64(digestIt(theDigest1)); String inputwithsig; byte[] encryptedstream; int tempNonce; String ReceiveN; if(mode=="CANDIDATE_LIST") { inputwithsig = RequestandN+" "+decode64; cipherstream.init(Cipher.ENCRYPT_MODE, symmetricKey); encryptedstream = cipherstream.doFinal(inputwithsig.getBytes()); System.out.println("7.Voter Client mengirimkan permintaan melakukan pemilihan :"+inputwithsig); output.writeObject(encryptedstream); cipherstream.init(Cipher.DECRYPT_MODE, symmetricKey); decryptedKs = cipherstream.doFinal((byte[])input.readObject()); decryptedString = new String(decryptedKs); idx = 0; tokenCount=0; st = new StringTokenizer(decryptedString); tokenCount = st.countTokens(); while (st.hasMoreTokens()){ words[idx] = st.nextToken(); idx++; } // Check if Nonce is invalid tempNonce = Integer.parseInt(words[2]); if (tempNonce!=iNonce+1) { System.out.println("8.Voter Client Invalid Nonce :"); System.exit(0); } // Check if it is singed by CTF (SHA1) ReceiveN = words[0]+" "+words[1]+" "+words[2]; for (int i=3;i
31
} else { System.out.println("8.Voter Client Invalid ValidationID (SHA1):"+decryptedString); System.out.println("
SHA1 :"+decode64+",Length :"+decode64.length());
System.out.println(" 1].length());
SHA2 :"+words[tokenCount-1]+",Length :"+words[tokenCount-
System.exit(0); } System.out.println("Candidate List:"+(tokenCount-4)); user.getResultsArea().append("- Menerima daftar kandidat yang valid\n\n"); for (int i=0; i
;
inputwithsig = RequestandN+" "+decode64; cipherstream.init(Cipher.ENCRYPT_MODE, symmetricKey); encryptedstream = cipherstream.doFinal(inputwithsig.getBytes()); output.writeObject(encryptedstream); System.out.println("7.Voter Client mengirimkan ASKWHO :"+inputwithsig); cipherstream.init(Cipher.DECRYPT_MODE, symmetricKey); decryptedKs = cipherstream.doFinal((byte[])input.readObject()); decryptedString = new String(decryptedKs); idx = 0; tokenCount=0; st = new StringTokenizer(decryptedString); tokenCount = st.countTokens(); while (st.hasMoreTokens()){ words[idx] = st.nextToken(); idx++; } tempNonce = Integer.parseInt(words[3]); if (tempNonce!=iNonce+1) { System.out.println("8.Voter Client Invalid Nonce :"); System.exit(0); } //
Check if it is singed by CTF (SHA1)
ReceiveN = words[0]+" "+words[1]+" "+words[2]+" "+words[3]; //System.out.println(new String(dataBuffer1)); dataBuffer1 = ReceiveN.getBytes(); //System.out.println(new String(dataBuffer1)); theDigest1 = digestIt(dataBuffer1); decode64 = displayBase64(digestIt(theDigest1));
32
if (decode64.compareTo(words[4])==0) { System.out.println("8.Voter Client menerima Vote yang valid (Ks) :"+decryptedString); } else { System.out.println("8.Voter Client Invalid Vote (SHA1):"+decryptedString); System.out.println("
SHA1 :"+decode64+",Length :"+decode64.length());
System.out.println("
SHA2 :"+words[4]+",Length :"+words[4].length());
System.exit(0); } if (words[0].compareTo(validID)==0) { System.out.println("8.Voter Client Vote Invalid ValidationID :"+decryptedString); user.getResultsArea().append("Terdapat Kesalahan teknis-------maaf"); } else if (words[0].compareTo(DupVOTE)==0) { System.out.println("8.Voter Client melakukan duplikasi pilihan :"+decryptedString); user.getResultsArea().append("Anda hanya bisa memilih sekali-------maaf");} else if (words[0].compareTo(FALSEConnect)==0) { System.out.println("8.Koneksi Voter Client Vote ditolak :"+decryptedString); user.getResultsArea().append("koneksi reset maaf");} else { System.out.println("8.Anda memberikan pilihan kepada :"+decryptedString); user.getResultsArea().append("Anda memilih untuk "+words[2]+"\n") } } else if(mode=="VOTE")
{
myVote = candidateId; candidateId=null; iNonce = nctf.nextInt(maxNonce+1); RequestandN = RequestVote+" "+m_validationId+" "+myVote+" "+Request+" "+iNonce; dataBuffer1 = RequestandN.getBytes(); theDigest1 = digestIt(dataBuffer1); decode64 = displayBase64(digestIt(theDigest1)); inputwithsig = RequestandN+" "+decode64; cipherstream.init(Cipher.ENCRYPT_MODE, symmetricKey); encryptedstream = cipherstream.doFinal(inputwithsig.getBytes()); output.writeObject(encryptedstream); System.out.println("7.Voter Client mengirimkan WHO :"+inputwithsig); cipherstream.init(Cipher.DECRYPT_MODE, symmetricKey); decryptedKs = cipherstream.doFinal((byte[])input.readObject()); decryptedString = new String(decryptedKs); System.out.println("My String: "+decryptedString); idx = 0; tokenCount=0; st = new StringTokenizer(decryptedString); tokenCount = st.countTokens(); while (st.hasMoreTokens()){ words[idx] = st.nextToken(); idx++; // Modify to see if my vote is counted // Check if Nonce is invalid
33
tempNonce = Integer.parseInt(words[6]); if (tempNonce!=iNonce+1) { System.out.println("8.Voter Client Invalid Nonce :"); System.exit(0); } //
Check if it is singed by CTF (SHA1)
ReceiveN = words[0]+" "+words[1]+" "+words[2]+" "+words[3]+" "+words[4]+" "+words[5]+" "+words[6]; //System.out.println(new String(dataBuffer1)); dataBuffer1 = ReceiveN.getBytes(); //System.out.println(new String(dataBuffer1)); theDigest1 = digestIt(dataBuffer1); decode64 = displayBase64(digestIt(theDigest1)); if (decode64.compareTo(words[7])==0) { System.out.println("8.Voter Client menerima Vote valid (Ks) :"+decryptedString); else {
}
System.out.println("8.Voter Client Invalid Vote (SHA1):"+decryptedString); System.out.println("
SHA1 :"+decode64+",Panjang :"+decode64.length());
System.out.println("
SHA2 :"+words[7]+",Panjang :"+words[7].length());
System.exit(0); } if (words[1].compareTo(validID)==0) { System.out.println("8.Voter Client Vote Invalid ValidationID :"+decryptedString); user.getResultsArea().append("Kesalahan teknis-------maaf"); } else if (words[1].compareTo(DupVOTE)==0) { System.out.println("8.Voter Client Vote Duplicate :"+decryptedString); user.getResultsArea().append("Anda hanya bisa melakukan pemilihan sekali-------maaf");} else if (words[1].compareTo(FALSEConnect)==0) { System.out.println("8.Koneksi Voter Client gagal:"+decryptedString); user.getResultsArea().append("Koneksi reset maaf");} else { System.out.println("8.Pemilihan Voter Client success :"+decryptedString); //put it on screen System.out.println("8.Saya memilih untuk :"+words[2]+", HAsil penghitungan :"+words[3]+", Hasil penghitungan terbaru :"+words[4]); user.getResultsArea().append("-- Saya memilih untuk : "+words[2]+"\n"+"-- Penghitungan saat ini :"+words[3]+" Hasil penghitungan terbaru :"+words[4]+"\n"); user.getResultsArea().append("Vote sukses : Anda dapat melakukan logout sekarang"+"\n"); } } clientSocket.close(); catch (Exception e) { e.printStackTrace();
} }
...
34
Lampiran 3 Implementasi CTF.java untuk Fungsi Main ... public static void main(String[] argv)
{
String ReplyCTF = "CTFID-VoterID"; String ValidationID = "ValidationID"; String decryptedString = null; String decryptedString3 = null; Random nvoter = new Random(); Random nctf = new Random(); String RequestandN = null; String Replycandidate = "ReplyCandidate"; String ReplymyVote = "ReplymyVote"; String ReplyVote = "ReplyVote"; int maxNonce = 9999999; int iNonce=0; if (argv.length!=3) help(); try { /** The private key for CTFServer */ RSAPrivateKey m_privateKey = null; /** The public key for CTFServer */ RSAPublicKey m_publicKey = null; // Reading in CLA public key ObjectInputStream stream = new ObjectInputStream(new FileInputStream("CTF.public")); m_publicKey = (RSAPublicKey)stream.readObject(); stream.close(); // Reading in CLA private key stream = new ObjectInputStream (new FileInputStream("CTF.private")); m_privateKey = (RSAPrivateKey)stream.readObject(); stream.close(); int serverPortforVoter= Integer.parseInt(argv[0]); int serverPortforCLA= Integer.parseInt(argv[2]); ServerSocket voterSocket = new ServerSocket(serverPortforVoter); while (true) { Socket connectionSocket = voterSocket.accept(); ObjectOutputStream output = new ObjectOutputStream(connectionSocket.getOutputStream()); ObjectInputStream input = new ObjectInputStream(connectionSocket.getInputStream()); // Begin 3-way handshake (deploy PublicKey) String voter = (String)input.readObject(); System.out.println("1.CTF Server menerima permintaan :"+ voter); /************* * * Certficate * */ System.out.println("+++ Membaca sertifikat dari berkas: CTF.cert..."); DataInputStream certStream = new DataInputStream (new FileInputStream("CTF.cert")); int certLength = certStream.readInt(); m_publicKeyCert = new byte[certLength];
35
certStream.read(m_publicKeyCert, 0, m_publicKeyCert.length); certStream.close(); /**************/ output.writeObject(m_publicKey); output.writeObject(m_publicKeyCert); System.out.println("2.CTF Server mengeluarkan kunci publik :"+m_publicKey.getEncoded()); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, m_privateKey); byte[] decryptedKeyBytes = cipher.doFinal((byte[])input.readObject()); decryptedString = new String(decryptedKeyBytes); System.out.println("3.CTF Server mendeskripsikan pesan dengan PU :"+decryptedString); // end 3-way handshake // Receieve Ks from Voter decryptedKeyBytes = cipher.doFinal((byte[])input.readObject()); System.out.println("4.CTF Server menerima kunci simetri :"+decryptedKeyBytes.toString()); // ***************************Batas awal tambahan pengembangan sistem // 1. Mendekripsi paket 2 (kunci simetri,nilai Nonce, dan nilai Hash byte[] z =(byte[])input.readObject(); byte []decryptedKeyBytes3=cipher.doFinal((byte[])z); decryptedString3 = new String (decryptedKeyBytes3); int idx3=0; int tokenCount3; String words3[]= new String [500]; StringTokenizer st3 = new StringTokenizer(decryptedString3); tokenCount3=st3.countTokens(); while (st3.hasMoreTokens()){words3[idx3]=st3.nextToken();idx3++;} String q =String.valueOf(Integer.parseInt(words3[1])+1); //2. Melakukan pemeriksaan nilai Hash yang dikirimkan String CheckSHA1AddNonce2 = words3[0]+" "+words3[1]; byte [] dataBuffer1AddNonce2=CheckSHA1AddNonce2.getBytes(); byte [] theDigest1AddNonce2=digestIt(dataBuffer1AddNonce2); String decode64New=displayBase64(digestIt(theDigest1AddNonce2)); if (decode64New.compareTo(words3[2])==0) { System.out.println("6a. Server CTF-Voter menerima Key+Nonce+Hash simetri yang valid"); } else { System.out.println("6a. valid");
CTF-Voter Server menerima Key+Nonce+Hash simetri yang tidak
System.out.println("
SHA1 :"+decode64New+",Length :"+decode64New.length());
System.out.println("
SHA2 :"+words3[2]+",Length :"+words3[2].length());
System.exit(0); } //****************************Batas akhir tambahan yteArrayInputStream keyBytes = new ByteArrayInputStream(decryptedKeyBytes); DataInputStream keyStream = new DataInputStream(keyBytes); // Recreate the users symmetric key String algorithm = keyStream.readUTF(); int length = keyStream.readInt(); byte[] encodedKey = new byte[length]; keyStream.readFully(encodedKey); SecretKey symmetricKey = new SecretKeySpec(encodedKey, algorithm);
36
keyStream.close(); keyBytes.close(); // From now on use Ks exchange message // Encrypt Data with Voter' Ks (Blowfish) Cipher cipherstream = Cipher.getInstance("Blowfish"); cipherstream.init(Cipher.ENCRYPT_MODE, symmetricKey); // Mengirimkan nilai Nonce+1 kepada voter /output.writeObject(q); // Sign each message before send byte[] dataBuffer1 = ReplyCTF.getBytes(); byte[] theDigest1 = digestIt(dataBuffer1); String decode64 = displayBase64(digestIt(theDigest1)); String Reply = ReplyCTF+ " "+decode64+" "+q; byte[] encryptedstream = cipherstream.doFinal(Reply.getBytes()); System.out.println("5.CTF Server mengirimkan penegasan pesan pertama dengan Ks :"+Reply); output.writeObject(encryptedstream); cipherstream.init(Cipher.DECRYPT_MODE, symmetricKey); byte[] decryptedKs = cipherstream.doFinal((byte[])input.readObject()); decryptedString = new String(decryptedKs); int idx = 0; int tokenCount; String words[] = new String [500]; StringTokenizer st = new StringTokenizer(decryptedString); tokenCount = st.countTokens(); while (st.hasMoreTokens()) { words[idx] = st.nextToken(); idx++; } //Sireesha edit String inputwithsig ; String CheckSHA1; if(words[0].compareTo("ReqCandidate")==0){ // Check if Voter sign a message (SHA) CheckSHA1 = words[0]+" "+words[1]+" "+words[2]+" "+words[3]; dataBuffer1 = CheckSHA1.getBytes(); theDigest1 = digestIt(dataBuffer1); decode64 = displayBase64(digestIt(theDigest1)); if (decode64.compareTo(words[4])==0) { System.out.println("6.CTF Server menerima permintaan daftar kandidat yang valid (Ks) :"+decryptedString); } else { System.out.println("6.CTF Server permintaan daftar kandidat tidak valid (SHA1) :"+decryptedString); System.out.println("
SHA1 :"+decode64+",Length :"+decode64.length());
System.out.println("
SHA2 :"+words[4]+",Length :"+words[4].length());
System.exit(0); } // Retrive valid ValidationID from CLA.voters String CLAvalidID = CheckValidIDwithCLA(words[1],argv[1], serverPortforCLA); if (CLAvalidID.compareTo("InValidID")==0) { Replycandidate = "InValidID";} // Retrive valid ValidationID from CLA.voters String candidateList = RetriveCandidate();
37
//Create Signature for each message and send CandidateList back with Voter'Nonce (SHA) RequestandN = Replycandidate+" "+ReplyCTF+" "+String.valueOf( Integer.parseInt (words[3])+1)+candidateList; System.out.println(RequestandN); dataBuffer1 = RequestandN.getBytes(); System.out.println(new String(dataBuffer1)); theDigest1 = digestIt(dataBuffer1); decode64 = displayBase64(digestIt(theDigest1)); inputwithsig = RequestandN+" "+decode64; cipherstream.init(Cipher.ENCRYPT_MODE, symmetricKey); encryptedstream = cipherstream.doFinal(inputwithsig.getBytes()); System.out.println("7.Server mengirimkan ValidationID (Ks) :"+inputwithsig); output.writeObject(encryptedstream); } else if(words[0].compareTo("ReqmyVote")==0) { // Check if Voter sign a message (SHA) CheckSHA1 = words[0]+" "+words[1]+" "+words[2]+" "+words[3]; dataBuffer1 = CheckSHA1.getBytes(); theDigest1 = digestIt(dataBuffer1); decode64 = displayBase64(digestIt(theDigest1)); if (decode64.compareTo(words[4])==0) { System.out.println("6.CTF Server menerima permintaan myVote yang valid (Ks) :"+decryptedString);} else { System.out.println("6.CTF Server menerima permintaan myVote yang tidak valid (SHA1) :"+decryptedString); System.out.println("
SHA1 :"+decode64+",Length :"+decode64.length());
System.out.println("
SHA2 :"+words[4]+",Length :"+words[4].length());
System.exit(0); } // Retrive valid ValidationID from CLA.voters String CLAvalidID = CheckValidIDwithCLA(words[1],argv[1], serverPortforCLA); if (CLAvalidID.compareTo("InValidID")==0) { ReplymyVote = "InValidID"; } String myVote = RetrivemyVote(words[1]); //Create Signature for each message and send CandidateList back with Voter'Nonce (SHA) RequestandN = ReplymyVote+" "+ReplyCTF+" "+myVote+" "+String.valueOf( Integer.parseInt(words[3])+1); System.out.println(RequestandN); dataBuffer1 = RequestandN.getBytes(); //System.out.println(new String(dataBuffer1)); theDigest1 = digestIt(dataBuffer1); decode64 = displayBase64(digestIt(theDigest1)); inputwithsig = RequestandN+" "+decode64; cipherstream.init(Cipher.ENCRYPT_MODE, symmetricKey); encryptedstream = cipherstream.doFinal(inputwithsig.getBytes()); System.out.println("7.Server mengirimkan myVote (Ks) :"+inputwithsig); output.writeObject(encryptedstream); } else { // Check if Voter sign a message (SHA)
38
CheckSHA1 = words[0]+" "+words[1]+" "+words[2]+" "+words[3]+" "+words[4]; dataBuffer1 = CheckSHA1.getBytes(); theDigest1 = digestIt(dataBuffer1); decode64 = displayBase64(digestIt(theDigest1)); if (decode64.compareTo(words[5])==0) { System.out.println("6.CTF Server mengirimkan Vote yang valid (Ks) :"+decryptedString); } else { System.out.println("6.CTF Server Vote tidak valid (SHA1) :"+decryptedString); System.out.println("
SHA1 :"+decode64+",Length :"+decode64.length());
System.out.println("
SHA2 :"+words[5]+",Length :"+words[5].length());
System.exit(0);} // Retrive valid ValidationID from CLA.voters //System.out.println("Prepare to check ValidationID with CLA"); //
Check ValidationID from CLA Server
String CLAvalidID = "Valid"; String candidatestatuscount = ""; CLAvalidID = CheckValidIDwithCLA(words[1],argv[1], serverPortforCLA); if (CLAvalidID.compareTo("InValidID")==0) { } else { if (CheckDupVote(CLAvalidID).compareTo("OK")==0) { candidatestatuscount = StoreValidationID(words[1], words[2], words[5]); } else { CLAvalidID = "DupVote"; candidatestatuscount = words[2]+" 0 0"; }} // Create Signature for each message and send CandidateList back with Voter'Nonce (SHA) System.out.println(candidatestatuscount); if (candidatestatuscount.length()>1) { RequestandN = ReplyVote+ " "+CLAvalidID+" "+candidatestatuscount+" "+ReplyCTF+" "+String.valueOf( Integer.parseInt(words[4])+1) ; } else {RequestandN = ReplyVote+ " "+CLAvalidID+" "+words[1]+" "+ReplyCTF+" "+String.valueOf( Integer.parseInt(words[4])+1);} System.out.println(RequestandN); dataBuffer1 = RequestandN.getBytes(); //System.out.println(new String(dataBuffer1)); theDigest1 = digestIt(dataBuffer1); decode64 = displayBase64(digestIt(theDigest1)); inputwithsig = RequestandN+" "+decode64; cipherstream.init(Cipher.ENCRYPT_MODE, symmetricKey); encryptedstream = cipherstream.doFinal(inputwithsig.getBytes()); System.out.println("7.CTF Server mengirimkan penegasan Vote (Ks) :"+inputwithsig); output.writeObject(encryptedstream); }}}catch (Exception e) { e.printStackTrace();}}}
Lampiran 4 Black Box Testing Tabel Pengujian Situs IPB Online Voting
39
No.
Deskripsi Uji
Kondisi Awal
Skenario Uji
Hasil yang diharapkan
Hasil Uji
1.
Membuka halaman utama
Halaman utama belum diakses oleh user
User membuka halaman utama
Halaman utama dapat ditampilkan
Berhasil
2.
Menampilkan diagram hasil pemilu
Halaman utama belum diakses oleh user
User membuka halaman utama
Tampil diagram hasil pemilu
Berhasil
3.
Melakukan registrasi sebagai pemilih (voter)
Form registrasi masih dalam keadaan kosong
User melakukan input data sebagai berikut : • Nama depan • Nama belakang • Nrp • Nama ibu kandung • Email
Data tersimpan dalam basis data CLA
Berhasil
4.
Membuka halaman profil kandidat
Halaman profil kandidat belum diakses oleh user
User membuka halaman profil kandidat
Halaman profil kandidat dapat ditampilkan
Berhasil
5.
Membuka halaman pemilihan umum
Halaman pemilihan umum belum diakses oleh user
User membuka halaman pemilihan umum
Halaman pemilihan umum dapat ditampilkan
Berhasil
6.
Membuka halaman tentang kami
Halaman tentang kami belum diakses oleh user
User membuka halaman tentang kami
Halaman tentang kami dapat ditampilkan
Berhasil
Tabel Pengujian Basis Data CLA dan GUI Online Voting No.
Deskripsi Uji
Kondisi Awal
Skenario Uji
Hasil yang Diharapkan
Hasil Uji
1.
Melakukan login
Field username dan password masih kosong
Memasukkan username dan password
Voter dapat memasukkan username dan password, voter masuk ke sistem
Berhasil
2.
Melakukan pemilihan kandidat
Voter sudah melakukan login
Voter Memilih kandidat pada daftar yang
Pilihan voter masuk ke sistem
Berhasil
40
telah disediakan 3.
Melakukan logout
Voter dalam kondisi log in
Voter mengklik tombol log out
Voter keluar sistem
Berhasil
4.
Membangkitkan random key
Basis data dan berkas yang akan dibangkitkan belum tersedia
Menjalankan kelas Generate Randomkeys
Semua berkas yang dibutuhkan telah tersedia dan berkas CLA.Voters tersimpan pada basis data
Berhasil
Deskripsi Uji
Kondisi Awal
Skenario Uji
Hasil yang diharapkan
Hasil Uji
1.
Voter mengunduh Voter.rar dari situs Online Voting
Voter belum memiliki kunci simetri
Voter membuka situs Online Voting dan mengunduh Voter.rar
Voter dapat mengunduh dan menyimpan file Voter.rar
Berhasil
2.
Voter mencoba menjalankan aplikasi Online Voting Java Web Start
Voter telah mengunduh Voter.rar namun belum membuka aplikasi Java Web Start
Voter menjalankan aplikasi Online Voting
Aplikasi Online Voting dapat ditampilkan di layar voter
Berhasil
3.
Voter mencoba untuk memilih dan mengirim hasil pilihan kandidat kepada CTF
Voter membuka aplikasi Online Voting dan sudah log in namun belum memilih kandidat
Voter menekan button submit Vote
Hasil pilihan kandidat berhasil dikirimkan dan diterima oleh CTF
Berhasil
4.
Voter mencoba untuk memverifikasi apakah hasil pilihannya telah dihitung oleh CTF
Voter telah memilih namun belum melakukan verifikasi pilihan
Voter menekan button verify Vote
CTF mengirimkan konfirmasi kepada Voter bahwa benar hasil pilihannya telah dihitung oleh CTF
Berhasil
Tabel Pengujian Java Web Start No.
Tabel Pengujian Pengiriman Kunci Simetri
41
No.
Deskripsi Uji
Kondisi Awal
Skenario Uji
Hasil yang diharapkan
Hasil Uji
1.
Membangkitkan kunci simetri dengan Algoritme Blowfish di kelas Voter.java
Voter belum memiliki kunci simetri
Melakukan running pada kelas Voter.java
Voter memiliki kunci simetri
Berhasil
2.
Mengirimkan kunci simetri (paket 1) yang telah dienkripsi dari voter menuju CLA
CLA belum menerima kunci simetri (paket 1) dari voter
Voter mengenkripsi kunci simetri dan mengirimkannya kepada CLA
CLA memiliki kunci simetri voter
Berhasil
3.
Mengirimkan kunci simetri+Nonce+ni lai Hash (paket 2) yang telah dienkripsi dari voter menuju CLA
CLA belum menerima kunci simetri +Nonce+Hash (paket 2) dari voter
Voter mengenkripsi paket 2 dan mengirimkannya kepada CLA
CLA menerima kunci simetri voter
Berhasil
4.
CLA mengirimkan Nonce balasan kepada Voter
Voter belum menerima Nonce balasan
CLA mengirimkan Nonce balasan
Voter menerima Nonce balasan dari CLA
Berhasil
5.
Mengirimkan kunci simetri (paket 1) yang telah dienkripsi dari voter menuju CTF
CTF belum menerima kunci simetri (paket 1) dari voter
Voter mengenkripsi kunci simetri dan mengirimkannya kepada CTF
CTF memiliki kunci simetri voter
Berhasil
6.
Mengirimkan kunci simetri+Nonce+ni lai Hash (paket 2) yang telah dienkripsi dari voter menuju CTF
CTF belum menerima kunci simetri +Nonce+Hash (paket 2) dari voter
Voter mengenkripsi paket 2 dan mengirimkannya kepada CTF
CTF menerima kunci simetri voter
Berhasil
7.
CTF mengirimkan Nonce balasan kepada Voter
Voter belum menerima Nonce balasan
CTF mengirimkan Nonce balasan
Voter menerima Nonce balasan dari CTF
Berhasil
Tabel Pengujian Koneksi CTF ke Basis Data 42
No.
Deskripsi Uji
Keadaan Awal
Skenario Uji
Hasil yang Diharapkan
Hasil Uji
1.
Pengiriman hasil pemilihan kandidat ke basis data CTF
Jumlah suara kandidat di basis data belum bertambah
Pemilih memilih salah satu kandidat
Jumlah suara kandidat terpilih di basis data bertambah
Berhasil
2.
Menampilkan diagram hasil pemilihan suara
Jumlah suara kandidat pada diagram belum bertambah
Pemilih memilih salah satu kandidat
Jumlah suara kandidat terpilih pada diagram bertambah
Berhasil
43
44