TEKNIK PENGAMANAN DATA MENGGUNAKAN ALGORITMA BLOWFISH
oleh PRASETYO BAWONO M0103045
SKRIPSI Ditulis dan diajukan untuk memenuhi sebagian persyaratan Memperoleh gelar Sarjana Sains Matematika
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM UNIVERSITAS SEBELAS MARET SURAKARTA 2010
ii
SKRIPSI TEKNIK PENGAMANAN DATA MENGGUNAKAN ALGORITMA BLOWFISH yang disiapkan dan disusun oleh PRASETYO BAWONO NIM. M0103045
dibimbing oleh Pembimbing I,
Pembimbing II,
Drs. YS. Palgunadi, M.Sc
Drs. Siswanto, M.Si
NIP. 19560407 198303 1 004
NIP. 19670813 199203 1 002
telah dipertahankan di depan Dewan Penguji pada hari Kamis, tanggal 28 Januari 2010 dan dinyatakan telah memenuhi syarat. Anggota Tim Penguji
Tanda Tangan
1. Titin Sri Martini, S.Si, M.Kom
1. ……………………………………...
NIP. 19750120 200812 2 001 2. Bowo Winarno, S.Si, M.Kom
2. ……………………………………...
NIP. 19810430 200812 1 001 3. DR. Sutanto, DEA
3. ……………………………………...
NIP. 19710302 199603 1 001
Disahkan oleh Fakultas Matematika dan Ilmu Pengetahuan Alam Dekan,
Ketua Jurusan Matematika
Prof. Drs. Sutarno, M.Sc, Ph.D
Drs. Sutrima, M.Si
NIP. 19600809 198612 1 001
NIP. 19661007 199302 1 001
Prasetyo Bawono, S.Si Universitas Sebelas Maret
iii
ABSTRAK
Prasetyo Bawono, 2010. TEKNIK PENGAMANAN DATA MENGGUNAKAN ALGORITMA BLOWFISH. Fakultas Matematika dan Ilmu Pengetahuan Alam, Universitas Sebelas Maret. Kriptografi merupakan suatu ilmu untuk menjaga kerahasiaan data / pesan sehingga data tidak dapat diketahui oleh pihak lain. Algoritma Blowfish merupakan salah satu algoritma kriptografi modern yang telah teruji dan banyak dipakai oleh berbagai pihak. Sistem operasi OpenBSD memasukkan Blowfish sebagai algoritma enkripsi utama dalam mengamankan user di dalam sistemnya (user authentication). Selain itu, PuTTY sebuah program SSH (Secure Shell) Client untuk Microsoft® Windows® pun juga menggunakan Blowfish sebagai salah satu metode enkripsinya. Algoritma Blowfish merupakan algoritma yang berjalan pada mode cipher blok dengan operasi yang sangat sederhana. Blowfish menggunakan operasi penambahan, ekslusif OR (XOR) dan penelusuran tabel. Tujuan penelitian ini adalah membuat aplikasi sederhana enkripsi data teks (pesan) dengan menggunakan algoritma Blowfish dalam empat mode enkripsi cipher blok: ECB (Electronic Code Book), CBC (Cipher Block Chainning), CFB (Cipher FeedBack) dan OFB (Output FeedBack). Metode yang digunakan dalam menulis skripsi adalah studi literatur tentang keamanan data, kriptografi (algoritma Blowfish), perencanaan sistem, pembuatan aplikasi algoritma Blowfish, pengujian dan analisa aplikasi algoritma Blowfish dengan notasi Big O. Evaluasi terhadap aplikasi enkripsi pesan menggunakan algoritma Blowfish dalam empat mode terhadap tiga buah file dengan ukuran yang berbedabeda (22 bytes, 202 Kilobytes dan 1,1 Megabytes) menunjukkan hasil selisih waktu yang tidak jauh berbeda. Sedangkan untuk kompleksitas waktu dari keempat mode adalah O(n), dimana n merupakan banyaknya karakter yang dienkripsi. Kata kunci : sistem enkripsi data, algoritma kunci simetri, mode enkripsi cipher blok, Blowfish, kriptografi
Prasetyo Bawono, S.Si Universitas Sebelas Maret
iv
ABSTRACT
Prasetyo Bawono, 2010. DATA SECURITY SYSTEM USING BLOWFISH ALGORITHM. Faculty of Mathemathics and Natural Sciences, Sebelas Maret University. Cryptography is a science aiming to keep the data confidentiality hindering it from being eavesdropped by other parties. One of modern cryptography using a symmetric key method that has been tested and widely used is Blowfish algorithm. It is included in OpenBSD as main encryption algorithm to secure users in the system (user authentication). PuTTY, a SSH (Secure Shell) Client program for Microsoft® Windows® also uses Blowfish as one of its encryption method. Blowfish is an algorithm that runs on a block cipher with a very simple operation. It uses addition operation, XOR and look-up tables. The purpose of this research is to create a simple application of text data (messages) encryption by using Blowfish algorithm in four block cipher encryption modes: ECB (Electronic Code Book), CBC (Cipher Block Chaining), CFB (Cipher FeedBack), and OFB (Output FeedBack). The method used in writing this thesis is a literature study on data security, cryptography (especially Blowfish algorithm), system planning, developing of Blowfish algorithm application, and tests and analysis of Blowfish algorithm application using Big Oh notation. Evaluation of the messages encryption application using Blowfish algorithm in four modes to three files with different sizes (22 bytes, 202 Kilobytes, and 1,1 Megabytes) showed that there was no significant difference in the run time. However, the time complexity of the all four modes was O(n), where n was the total characters encrypted. Keywords : data encryptions system, symmetric key algorithm, block cipher encryption mode, Blowfish, cryptography.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
v
KATA PENGANTAR Assalamu’alaikum Warahmatullahi Wabarokatuh. Bismillahirrahmaanirrahiim. Segala puji hanya milik Allah ‘Azza Wa Jalla. Rabb semesta alam yang telah memberikan segala nikmat, sehingga skripsi yang berjudul “Teknik Pengamanan Data Menggunakan Algoritma Blowfish” dapat terselesaikan. Penulis juga menyadari akan keterbatasan yang dimiliki, ketergantungan akan bantuan dan dukungan pribadi-pribadi disekitarnya. Terselesaikannya skripsi ini tidak terlepas dari bantuan berbagai pihak. Untuk itu, penulis mengucapkan terima kasih kepada : 1. Drs. YS. Palgunadi, M.Sc, selaku pembimbing I dan Drs. Siswanto, M.Si, selaku pembimbing II yang telah meluangkan waktunya untuk membimbing, mengarahkan, dan memberikan motivasi kepada penulis dalam penyusunan skripsi ini. 2. Umi Salamah, S.Si, M.Kom, selaku dosen pembimbing akademik atas segala kesabarannya selama ini. 3. Drs. Sutrimo, M.Si, selaku Ketua Jurusan Matematika, Fakultas Matematika dan Ilmu Pengetahuan Alam, Universitas Sebelas Maret. 4. Prof. Drs. Sutarno, M.Sc, Ph.D, selaku Dekan Fakultas Matematika dan Ilmu Pengetahuan Alam, Universitas Sebelas Maret. 5. Ibunda, Ayahanda, kakak-kakakku, adikku, dan seluruh keluarga yang telah mendoakan, dan banyak memberikan bantuan, serta dukungan kepada penulis. 6. DR. Sutanto, DEA., selaku kepala UPT PUSKOM UNS, yang telah menyediakan berbagai fasilitas kepada penulis. 7. Titin Sri Martini, S.Si, M.Kom dan Bowo Winarno, S.Si, M.Kom selaku dosen penguji. 8. Rekan-rekan di UPT PUSKOM UNS dan di PT. Javatechno Mandiri Indonesia, atas motivasi, dukungan dan bantuannya selama ini.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
vi
9. Saudaraku di jurusan Matematika FMIPA UNS dan Syiar Kegiatan Islam (SKI) FMIPA UNS. 10. Saudaraku di Wisma Madina. 11. Dan semua pihak yang tidak dapat disebutkan satu persatu dalam tulisan ini.
Penulis menyadari bahwa skripsi ini masih jauh dari sempurna, untuk itu saran dan kritik yang bersifat membangun sangat diharapkan. Akhirnya semoga karya tulis ini dapat bermanfaat bagi pembaca dan dapat memberikan sumbangan kebaikan pada perkembangan peradaban ilmu pengetahuan dan teknologi informasi. Wassalamu’alaikum Warahmatullahi Wabarokatuh.
Surakarta,
Januari 2010
Penulis
Prasetyo Bawono, S.Si Universitas Sebelas Maret
vii
DAFTAR ISI Halaman HALAMAN JUDUL ..................................................................................
i
PENGESAHAN ..........................................................................................
ii
ABSTRAK .................................................................................................
iii
ABSTRACT ...............................................................................................
iv
KATA PENGANTAR ...............................................................................
v
DAFTAR ISI ..............................................................................................
vii
DAFTAR GAMBAR ..................................................................................
ix
DAFTAR TABEL ......................................................................................
x
DAFTAR LAMPIRAN ..............................................................................
xi
BAB I. PENDAHULUAN 1.1 Latar Belakang Masalah .............................................................
1
1.2 Perumusan Masalah ....................................................................
2
1.3 Batasan Masalah..........................................................................
2
1.4 Tujuan Penelitian .......................................................................
2
1.5 Manfaat Penelitian .....................................................................
3
BAB II. LANDASAN TEORI 2.1 Tinjauan Pustaka ........................................................................
4
2.1.1
Algoritma .......................................................................
4
2.1.2
Lambang Diagram Alir (Flowchart) ..............................
4
2.1.3
Keamanan Data ..............................................................
4
2.1.4
Kriptografi ......................................................................
6
2.1.5
Cipher Blok ....................................................................
10
2.1.6
Cipher Berulang .............................................................
12
2.1.7
Jaringan Feistel (Feistel Network) .................................
12
2.1.8
Kotak-S (S-Box) .............................................................
13
2.1.9
Algoritma Kriptografi Blowfish .....................................
14
2.1.10 Mode Operasi Enkripsi Cipher Blok ..............................
17
2.2 Kerangka Pemikiran ...................................................................
23
Prasetyo Bawono, S.Si Universitas Sebelas Maret
viii
BAB III. METODOLOGI PENELITIAN .................................................
24
BAB IV. PEMBAHASAN 4.1 Analisis Sistem ...........................................................................
26
4.2 Diagam Alir (Flowchart) Aplikasi .............................................
27
4.3 Perancangan Sistem ...................................................................
28
4.3.1
Rancangan Database ......................................................
28
4.3.2
Rancangan Form Login ..................................................
28
4.3.3
Rancangan Form Enkripsi dan Dekripsi ........................
29
4.3.4
Validasi Data Masukan ..................................................
30
4.4 Implementasi Sistem ..................................................................
31
4.5 Evaluasi Sistem ..........................................................................
36
4.5.1
Struktur Algoritma Blowfish .........................................
36
4.5.2
Uji Coba Aplikasi ...........................................................
40
4.5.3
Analisis Algoritma dengan Notasi Big O .......................
41
BAB V. PENUTUP 5.1 Kesimpulan ................................................................................
45
5.2 Saran ...........................................................................................
46
DAFTAR PUSTAKA ................................................................................
47
LAMPIRAN ...............................................................................................
48
Prasetyo Bawono, S.Si Universitas Sebelas Maret
ix
DAFTAR GAMBAR Halaman Gambar 2.1 Simbol Umum Flowchart ..................................................... 4 Gambar 2.2 Skema Enkripsi dan Dekripsi ...............................................
8
Gambar 2.3 Skema Tipe-tipe Cipher ........................................................
9
Gambar 2.4 Kriptologi, Kriptografi dan Kriptanalisis....................................
10
Gambar 2.5 Enkripsi Pada Cipher Blok ...................................................
11
Gambar 2.6 Dekripsi Pada Cipher Blok ...................................................
11
Gambar 2.7 Skema Jaringan Feistel Secara Umum .................................
13
Gambar 2.8 Skema Fungsi F pada algoritma Blowfish ............................
16
Gambar 2.9 Skema Enkripsi dan Dekripsi dengan Mode ECB ...............
18
Gambar 2.10 Skema Enkripsi dan Dekripsi dengan Mode CBC ...............
20
Gambar 2.11 Skema Enkripsi dan Dekripsi dengan Mode CFB 8-Bit ......
21
Gambar 2.12 Skema Enkripsi dan Dekripsi dengan Mode OFB 8-bit ......
23
Gambar 4.1 Alur Sistem Pengamanan Data Teks ....................................
26
Gambar 4.2 Diagram Alir Aplikasi Sistem Pengamanan Data Teks .......
27
Gambar 4.3 Rancangan Form Sistem Login ............................................
28
Gambar 4.4 Rancangan Form Sistem Enkripsi ........................................
29
Gambar 4.5 Rancangan Form Sistem Dekripsi ........................................
30
Gambar 4.6 Tampilan Form Login ..........................................................
31
Gambar 4.7 Tampilan Form Utama .........................................................
32
Gambar 4.8 Tampilan Form Enkripsi ......................................................
33
Gambar 4.9 Pesan Pemberitahuan Enkripsi yang Berhasil ......................
33
Gambar 4.10 Pesan Peringatan Kesalahan Input Kunci .............................
34
Gambar 4.11 Dialog Simpan Cipherteks Berekstensi .cip ..........................
34
Gambar 4.12 Pesan Konfirmasi Cipherteks Berhasil Disimpan ................
35
Gambar 4.13 Tampilan Form Dekripsi ......................................................
35
Gambar 4.14 Pesan pemberitahuan dekripsi berhasil disimpan .................
36
Gambar 4.15 Skema Jaringan Feistel Pada Algoritma Blowfish ................
37
Gambar 4.16 Chart Waktu Enkripsi Tiap Mode ........................................
40
Gambar 4.17 Chart Waktu Dekripsi Tiap Mode .......................................
41
Prasetyo Bawono, S.Si Universitas Sebelas Maret
x
DAFTAR TABEL
Halaman Tabel 2.1 Beberapa Contoh Blok Cipher ..................................................
11
Tabel 3.1 Spesifikasi Hardware ...............................................................
24
Tabel 3.2 Spesifikasi Software .................................................................
25
Tabel 4.1 Tabel User ................................................................................
28
Tabel 4.2 Pseudo Code Jaringan Feistel Algoritma Blowfish .................
38
Tabel 4.3 Pseudo Code fungsi iterasi F() .................................................
38
Tabel 4.4 Pseudo Code Pembangkitan Sub-kunci ...................................
39
Tabel 4.5 Data Masukan Uji Coba Aplikasi Proses Enkripsi ..................
40
Tabel 4.6 Data Masukan Uji Coba Aplikasi Proses Dekripsi ..................
41
Tabel 4.7 Kompleksitas Waktu Algoritma Blowfish ................................
43
Tabel 4.8 Kompleksitas Waktu Tiap-tiap Mode ......................................
43
Prasetyo Bawono, S.Si Universitas Sebelas Maret
xi
DAFTAR LAMPIRAN
Halaman Lampiran 1 8366 Digit HEX dari Pi (Key Expansion) ...........................
48
Lampiran 2 Form Login (LoginForm.java) .............................................
51
Lampiran 3 Form Utama (FuguView.java) .............................................
54
Lampiran 4 Form Enkripsi (BlowfishEnc.java) .......................................
57
Lampiran 5 Form Dekripsi (BlowfishDec.java) ......................................
69
Lampiran 6 Class Koneksi Database (DriverConnection.java) ...............
80
Lampiran 7 Class Algoritma Blowfish (BlowfishEngine.java) ...............
82
Lampiran 8 Class Mode Enkripsi CBC (CBCBlockCipher.java) ............
95
Lampiran 9 Class Mode Enkripsi CFB (CFBBlockCipher.java) .............
101
Lampiran 10 Class Mode Enkripsi OFB (OFBBlockCipher.java) ............
107
Prasetyo Bawono, S.Si Universitas Sebelas Maret
1
BAB I PENDAHULUAN
1.1 Latar Belakang Masalah Perkembangan Information and Communication Technology (ICT) atau Teknologi Informasi dan Komunikasi (TIK) dari waktu ke waktu kian meningkat. Kebutuhan manusia akan perangkat informasi dan komunikasi seakan menjadi kebutuhan yang tidak terpisahkan dalam kehidupan sehari-hari. Setiap hari, inovasi dalam bidang ini senantiasa dinamis. Salah satu contohnya adalah komunikasi data pada jaringan komputer. Jaringan komputer pada awalnya dikembangkan untuk menghubungkan antar pihak yang saling mempercayai, dengan tujuan untuk saling menukar informasi (data). Namun seiring berjalannya waktu dan berkembangnya ilmu pengetahuan, ada salah satu aspek pendukung yang sangat diperlukan, yaitu masalah keamanan data. Dibalik kemudahan serta efisiensi biaya dalam hal berkomunikasi, berbagai macam jenis komunikasi data yang ada belum tentu aman untuk digunakan, karena belum tentu adanya standar keamanan yang diterapkan untuk masing-masing perangkat komunikasi data tersebut. Salah satu contoh yang pernah terjadi adalah adanya penyadapan pembicaraan melalui telepon antara Presiden B.J. Habibie dan Jaksa Agung Andi Ghalib pada tahun 1999, sebagaimana yang termuat dalam majalah Panji Masyarakat tanggal 24 Februari 1999. Hal ini semakin membuktikan bahwa keamanan data (pada contoh ini adalah data suara) sangat dibutuhkan. Apalagi jika percakapan informasi yang terjadi adalah bersifat rahasia dan diterapkan dalam ruang lingkup kenegaraan. Solusi yang dapat dilakukan adalah dengan cara mengengkripsi data (teks, suara dan visual). Teknik ini memiliki tingkat keamanan yang jauh lebih tinggi. Enkripsi dilakukan pada data sebelum data tersebut dikirimkan, sehingga pihak yang tidak berhak tidak dapat memahami data yang dikirimkan tersebut meskipun data yang telah terenkripsi berhasil diakses/didapatkan. Proses selanjutnya adalah
1 Prasetyo Bawono, S.Si Universitas Sebelas Maret
2
dekripsi, yaitu kebalikan dari proses enkripsi. Mengubah data yang terenkripsi menjadi data semula. Dekripsi hanya bisa dilakukan oleh pihak yang berhak. Enkripsi dan dekripsi merupakan bagian dari kinerja sebuah algoritma kriptografi. Algoritma enkripsi yang akan digunakan dalam tugas akhir ini adalah algoritma Blowfish.
1.2 Perumusan Masalah Berdasarkan latar belakang masalah, rumusan masalah dalam penulisan skripsi ini adalah 1. Bagaimana menentukan proses enkripsi
dan dekripsi
data teks
menggunakan algoritma Blowfish ? 2. Bagaimana membuat program aplikasi komputer yang dapat melakukan enkripsi dan dekripsi data berdasarkan algoritma Blowfish ?
1.3 Batasan Masalah Batasan masalah yang digunakan dalam penulisan skripsi ini adalah 1. Data yang akan dienkripsi dan dekripsi adalah data digital, terutama data teks. 2. Perangkat lunak penerapan teknik pengamanan data ini dibuat dengan menggunakan bahasa pemrograman Java 2 Standard Edition (J2SE).
1.4 Tujuan Penelitian Tujuan penelitian dalam skripsi ini adalah 1. Dapat menentukan proses enkripsi dan dekripsi menggunakan algoritma Blowfish. 2. Dapat membuat program aplikasi komputer yang dapat melakukan enkripsi dan dekripsi data berdasarkan algoritma Blowfish.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
3
1.5 Manfaat Penelitian Manfaat penelitian dari skripsi adalah 1. Manfaat teoritis Secara teoritis, manfaat yang diperoleh adalah dapat memahami proses enkripsi dan dekripsi data menggunakan algoritma Blowfish. 2. Manfaat praktis Sedangkan manfaat praktis yang diperoleh adalah dapat membangun aplikasi perangkat lunak yang akan mengenkripsi data teks menggunakan algoritma Blowfish. Serta mengetahui, mempermudah dan mempercepat proses pengamanan data dengan menggunakan perangkat lunak tersebut.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
4
BAB II LANDASAN TEORI
2.1 Tinjauan Pustaka 2.1.1 Algoritma Menurut Budiyanto (2003), algoritma adalah urutan langkah-langkah logis penyelesaian masalah yang disusun secara sistematis dan logis.
2.1.2 Lambang Flowchart (Diagram Alir) Arti dari lambang yang digunakan dalam pembuatan flowchart yaitu, Simbol Terminator
Simbol Proses
Simbol Keputusan
Simbol Alur
Simbol Dokumen
Gambar 2.1. Simbol Umum Flowchart
2.1.3 Keamanan Data Secara umum data dibagi menjadi dua, yaitu: data yang bersifat rahasia dan tidak bersifat rahasia. Dalam hal ini, pesan yang diperhatikan dan perlu diamankan adalah pesan yang bersifat rahasia. Beberapa ancaman dan serangan yang harus diperhatikan dalam sistem keamanan data menurut Susanto (2004), adalah sebagai berikut :
4 Prasetyo Bawono, S.Si Universitas Sebelas Maret
5
1. Leakage (kebocoran) adalah pengambilan informasi oleh penerima yang tidak berhak. 2. Tampering adalah pengubahan informasi yang tidak legal 3. Vandalism adalah gangguan operasi sistem tertentu, pelaku tidak mengharap keuntungan apapun. Metode penyerangan yang biasa digunakan untuk mengganggu keamanan data menurut Susanto (2004), antara lain : 1. Eavesdropping, mendapatkan duplikasi pesan tanpa ijin. 2. Masquerading, mengirim atau menerima pesan menggunakan identitas lain tanpa ijin mereka. 3. Message Tampering, mencegat atau menangkap pesan dan mengubah isinya sebelum dilanjutkan ke pihak penerima sebenarnya. ”Man in the middle attack” adalah bentuk message tampering dengan mencegat pesan pertama pada pertukaran kunci enkripsi pada pembentukan suatu saluran yang aman. Penyerang menyisipkan kunci lain yang memungkinkan dia untuk mendekripsi pesan berikutnya sebelum dienkripsi oleh penerima. 4. Replaying, menyimpan pesan yang ditangkap untuk pemakaian berikutnya. 5. Denial of service, membanjiri saluran atau sumber lain dengan beberapa pesan yang bertujuan untuk menggagalkan pengaksesan oleh pemakai lain. Dalam keamanan data perlu diadakan pemisahan antara kebijakan dan mekanisme
kemanan,
yang
akan
membantu
memisahkan
kebutuhan
implementasinya, karena kebijakan dapat menspesifikasikan kebutuhan dan mekanisme dapat menerapkan spesifikasi kebijakan tersebut. Menurut Susanto (2004), sebuah kebijakan keamanan meliputi : 1. Access Control, yaitu perlindungan data terhadap pemakaian tak legal. 2. Authentication, yaitu menyediakan jaminan identitas seseorang. 3. Confidentially (kerahasiaan), yaitu pengungkapan terhadap identitas tak legal. 4. Nonrepudiation (penyangkalan), yaitu melindungi terhadap penolakan komunikasi yang sudah pernah dilakukan. Untuk mencapai keamanan tersebut menurut Susanto (2004), langkah atau cara yang bisa ditempuh, yaitu :
Prasetyo Bawono, S.Si Universitas Sebelas Maret
6
1. Enkripsi,
dapat
digunakan
untuk
menyediakan
kerahasiaan
pesan,
Authentication dan perlindungan identitas. 2. Digital Signature (tanda tangan digital), dapat digunakan untuk menyediakan authentication, perlindungan identitas, dan nonrepudiation 3. Checksum
Algorithm
(Hash),
dapat
digunakan
untuk
menyediakan
perlindungan integritas.
2.1.4 Kriptografi Menurut Schneier (1996), kriptografi adalah ilmu dan seni untuk menjaga keamanan pesan. Menurut Menezes et al (1996), kriptografi adalah ilmu yang mempelajari teknik-teknik matematika yang berhubungan dengan aspek keamanan informasi seperti kerahasiaan, integritas data, serta otentikasi. Menurut Munir (2006), kriptografi (cryptography) berasal dari Bahasa Yunani: ”cryptos” artinya ”secret” (rahasia), sedangkan ”graphein” artinya ”writing” (tulisan), Jadi, kriptografi berarti ”secret writing” (tulisan rahasia). Definisi yang digunakan di dalam buku-buku yang lama (sebelum tahun 1980-an) menyatakan bahwa kriptografi adalah ilmu dan seni untuk menjaga kerahasiaan pesan dengan cara menyandikannya ke dalam bentuk yang tidak dapat dimengerti lagi maknanya. Definisi ini mungkin cocok pada masa lalu di mana kriptografi digunakan untuk keamanan komunikasi penting seperti komunikasi di kalangan militer, diplomat, dan mata-mata (spy). Namun saat ini kriptografi lebih dari sekadar privacy, tetapi juga untuk tujuan data integrity, authentication, dan nonrepudation. Menurut Munir (2006), di dalam kriptografi terdapat beberapa terminologi/istilah penting yang perlu diketahui yaitu : 1. Pesan, Plainteks, dan Cipherteks Pesan (message) adalah data atau informasi yang dapat dibaca atau dimengerti maknanya. Nama lain untuk pesan adalah plainteks (plaintext) atau teks jelas (cleartext). Pesan dapat berupa data atau informasi yang dikirim (melalui kurir, saluran telekomunikasi, dsb) atau yang disimpan di dalam media
Prasetyo Bawono, S.Si Universitas Sebelas Maret
7
perekam (kertas, storage, dsb). Pesan yang tersimpan tidak hanya berupa teks, tetapi juga dapat berbentuk citra (image), suara/bunyi (audio), dan video, atau berkas biner lainnya. Agar pesan tidak dapat dimengerti maknanya oleh pihak lain, maka pesan perlu disandikan ke bentuk lain yang tidak dapat dipahami. Bentuk pesan yang tersandi disebut cipherteks (ciphertext) atau kriptogram (cryptogram). Cipherteks harus dapat ditransformasikan kembali menjadi plainteks semula agar pesan yang diterima bisa dibaca. 2. Pengirim dan penerima Komunikasi data melibatkan pertukaran pesan antara dua entitas. Pengirim (sender) adalah entitas yang mengirim pesan kepada entitas lainnya. Penerima (receiver) adalah entitas yang menerima pesan. Entitas disini dapat berupa orang, mesin (komputer), kartu kredit, dan sebagainya. Pengirim tentu menginginkan pesan yang dikirim tidak dapat dibaca/diketahui oleh pihak lain, kecuali yang berhak menerimanya. Maka, pesan harus disandikan menjadi cipherteks. 3. Enkripsi dan Dekripsi Proses
menyandikan
plainteks
menjadi
cipherteks
disebut
enkripsi
(encryption) atau enciphering (standard nama menurut ISO 7498-2). Sedangkan proses mengembalikan cipherteks menjadi plainteks semula dinamakan dekripsi (decryption) atau deciphering (standard nama menurut ISO 7498-2). Istilah encryption of data in motion mengacu pada enkripsi pesan yang ditransmisikan melalui saluran komunikasi. Sedangkan istilah encryption of data at-rest mengacu pada enkripsi dokumen yang disimpan di dalam storage. 4. Cipher dan Kunci Algoritma kriptografi disebut juga cipher, yaitu aturan untuk enciphering dan deciphering, atau fungsi matematika yang digunakan untuk enkripsi dan dekripsi. Kunci (key) adalah parameter yang digunakan untuk transformasi enciphering dan deciphering. Kunci biasanya berupa string atau deretan bilangan.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
8
Kunci
Plainteks
Kunci
Enkripsi
Cipherteks
Dekripsi
Plainteks
Gambar 2.2. Skema Enkripsi dan Dekripsi Plainteks merupakan data masukan berupa teks berkode standar ASCII (American Standard Code for Information Interchange). ASCII merupakan suatu standar internasional dalam kode huruf dan simbol seperti halnya Hex dan Unicode, tetapi ASCII lebih bersifat universal. Kode ASCII memiliki komposisi bilangan biner sebanyak 8 bit. Dimulai dari 00000000 hingga 11111111. Total kombinasi yang dihasilkan sebanyak 256, yang dimulai dari kode 0 hingga 255 dalam sistem bilangan Desimal.
Menurut Anjar Syafari (2007), Proses enkripsi dan deskripsi secara matematis diterangkan sebagai berikut : EK (M) = C (Proses Enkripsi) DK (C) = M (Proses Deskripsi) Keterangan : EK
: Enkripsi.
DK
: Deskripsi.
M
: Message (Pesan sebelum dienkripsi)
C
: Cipher (Pesan setelah dienkrisi)
Prasetyo Bawono, S.Si Universitas Sebelas Maret
9
Tipe-tipe cipher : Ciphers
Classical
Rotor Machine
Substitution
Transposition
Modern
Public Key
Private Key
Stream Chiper
Block Cipher
Gambar 2.3. Skema Tipe-tipe Cipher Menurut Munir (2006), Algoritma kunci simetri mengacu pada metode enkripsi yang dalam hal ini baik pengirim maupun penerima memiliki kunci yang sama. Algoritma kunci simetri modern beroperasi dalam mode bit dan dapat dikelompokkan menjadi dua kategori: a. Cipher aliran (Stream Cipher) Algoritma kriptografi beroperasi pada plainteks/cipherteks dalam bentuk bit tunggal yang dalam hal ini rangkaian bit dienkripsikan/didekripsikan bit per bit. Cipher aliran mengenkripsi satu bit setiap kali. b. Cipher blok (Block Cipher) Algoritma kriptografi beroperasi pada plainteks/cipherteks dalam bentuk blok bit, yang dalam hal ini rangkaian bit dibagi menjadi blok-blok bit yang panjangnya sudah ditentukan sebelumnya. Misalnya, panjang blok adalah 64 bit, maka itu berarti algoritma enkripsi memperlakukan 8 karakter setiap kali enkripsi (1 karakter = 8 bit dalam pengkodean ASCII). Cipher blok mengenkripsi satu blok bit setiap kali. 5. Sistem Kriptografi (cryptosystem) Menurut Schneier (1996), kriptografi membentuk sebuah sistem yang dinamakan sistem kriptografi. Sistem kriptografi (cryptosystem) adalah kumpulan yang terdiri dari algoritma kriptografi, semua plainteks dan cipherteks yang mungkin, dan kunci.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
10
6. Penyadap Penyadap (eavesdropper) adalah orang yang mencoba menangkap pesan selama ditransmisikan. Tujuan penyadap adalah untuk mendapatkan informasi sebanyak-banyaknya mengenai sistem kriptogafi yang digunakan untuk berkomunikasi dengan maksud untuk memecahkan cipherteks. Nama lain penyadap: enemy, adversary, intruder, interceptor, bad guy. 7. Kriptoanalis dan Kriptologi Kriptografi berkembang sedemikian rupa sehingga melahirkan bidang yang berlawanan yaitu kriptanalisis. Kriptanalisis (cryptanalysis) adalah ilmu dan seni untuk memecahkan cipherteks menjadi plainteks tanpa mengetahui kunci yang digunakan. Pelakunya disebut kriptanalis. Kriptologi (cryptology) adalah studi mengenai kriptografi dan kriptanalisis. Kriptologi
Kriptografi
Kriptanalis
Ilmu dan seni untuk menjaga keamanan pesan
Ilmu dan seni untuk memecahkan pesan yang terenkripsi (cipherteks)
Gambar 2.4. Kriptologi, Kriptografi dan Kriptanalisis
2.1.5 Cipher Blok Pada cipher blok, plainteks dibagi menjadi beberapa blok dengan panjang tetap. Ketika melakukan enkripsi, cipher blok mungkin saja menerima masukan 128-bit plainteks dan mengeluarkan 128-bit keluaran cipherteks. Transformasi selengkapnya dikontrol menggunakan masukan kedua, yaitu kunci. Begitu pula halnya dengan proses dekripsi, algoritma untuk melakukan dekripsi akan menerima masukan 128-bit cipherteks dan kunci kemudian menghasilkan keluaran 128-bit plainteks aslinya. Cipher blok mengenkripsi satu blok bit setiap kali.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
11
Tabel 2.1 Beberapa contoh blok cipher Cipher Blok
Ukuran Kunci (Bits)
Ukuran Blok
Tahun
DES
56
64
1976
3DES
112 atau 168
64
1978
AES
128, 192 atau 256
128
1998
128
1998
64
1993
128
1998
Minimum 0, maksimum 2040,
RC6
multiple 8 bits, default 128 bits
Blowfish
CAST-256
Minimum 32, maksimum 448, multiple 8 bits, default 128 bits Minimum 128, maksimum 256, multiple 32 bits, default 128 bits
Untuk lebih jelasnya, proses enkripsi dan dekripsi pada cipher blok dapat dilihat pada gambar berikut : Plainteks
Kunci
Enkripsi Cipher Blok
Cipherteks
Gambar 2.5. Enkripsi Pada Cipher Blok Cipherteks
Kunci
Dekripsi Cipher Blok
Plainteks
Gambar 2.6. Dekripsi Pada Cipher Blok
Prasetyo Bawono, S.Si Universitas Sebelas Maret
12
2.1.6 Cipher Berulang Menurut Randy (2006), cipher berulang merupakan fungsi transformasi sederhana yang mengubah plainteks menjadi cipherteks dengan proses perulangan sejumlah kali. Pada setiap putaran digunakan kunci putaran yang dikombinasikan dengan plainteks. Secara formal, cipher berulang dinyatakan sebagai berikut : Ci = f(Ci-1, Pi) Keterangan : i
= 1, 2, ..., r (r adalah jumlah putaran)
Pi
= subkunci pada putaran ke-i
fi
= fungsi transformasi (di dalamnya terdapat fungsi substitusi, permutasi, dan/atau ekspansi, kompresi)
Plainteks dinyatakan dengan C0 dan cipherteks dinyatakan dengan Cr.
2.1.7 Jaringan Feistel (Feistel Network) Menurut Randy (2006), model jaringan Feistel digunakan oleh hampir semua algoritma cipher blok. Jaringan ini ditemukan oleh Horst Feistel pada tahun 1970. Secara formal, operasi transformasi pada jaringan Feistel secara umum dapat dinyatakan sebagai:
(XL)i = (XR)i -1 (XR)i = (XL)i - 1⊕ f ((XR)i -1, Pi) Keterangan : XL
= n-bit plainteks bagian kiri
XR
= n-bit plainteks bagian kanan
Dengan X (blok plainteks) = XL + XR , n merupakan setengah dari blok plainteks X Proses enkripsi dan dekripsi dapat menggunakan model jaringan Feistel yang sama. Model jaringan Feistel bersifat reversible (dua arah) untuk proses enkripsi dan dekripsi. Sifat reversible ini memungkinkan mendekripsi cipherteks menjadi plainteks tanpa membuat algoritma baru. Contoh:
Prasetyo Bawono, S.Si Universitas Sebelas Maret
13
(XL)i – 1 ⊕ f((XR)i – 1, Pi) ⊕ f((XR)i – 1, Pi) = (XL)i – 1 Selain itu, sifat reversible tidak bergantung pada fungsi f sehingga fungsi f dapat dibuat serumit mungkin. Skema jaringan Feistel dapat dilihat pada Gambar 2.7. Pi
(XL)i - 1
(XR)i - 1
F
(XL)i
(XR)i
Gambar 2.7. Skema Jaringan Feistel Secara Umum
2.1.8 Kotak-S (S-Box) Menurut Munir (2006), Kotak-S adalah matriks yang berisi substitusi sederhana yang memetakan satu atau lebih bit dengan satu atau lebih bit yang lain. Pada kebanyakan algoritma cipher blok, Kotak-S memetakan m bit masukan menjadi n bit keluaran, sehingga Kotak-S tersebut dinamakan kotak m x n S-Box. Kotak-S merupakan satu-satunya langkah nirlanjar (non-linear) di dalam algoritma, karena operasinya adalah look-up table. Masukan dari operasi look-up table dijadikan sebagai indeks Kotak-S, dan keluarannya adalah masukan di dalam Kotak-S. Perancangan Kotak-S menjadi isu penting karena Kotak-S harus dirancang sedemikian
sehingga
kekuatan
kriptografinya
bagus
dan
mudah
diimplementasikan. Ada empat cara (pendekatan) yang dapat digunakan dalam mengisi Kotak-S: 1. Dipilih secara acak Untuk Kotak-S yang kecil, cara pengisian secara acak tidak aman, namun untuk Kotak-S yang besar cara ini cukup baik.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
14
2. Dipilih secara acak lalu diuji Sama halnya seperti sebelumnya, namun nilai acak yang bangkit akan diuji apakah memenuhi sifat tertentu. 3. Dibuat oleh orang (man-made) Masukan di dalam Kotak-S dibangkitkan dengan teknik yang lebih intuitif. 4. Dihitung secara matematis (math-mode) Masukan di dalam Kotak-S dibangkitkan berdasarkan prinsip matematika yang terbukti aman dari serangan kriptanalis.
2.1.9 Algoritma Kriptografi Blowfish Menurut Randy (2006), Blowfish adalah sebuah algoritma kriptografi yang beroperasi pada mode blok. Algoritma Blowfish merupakan algoritma yang diciptakan oleh seorang cryptanalyst bernama Bruce Schneier pada tahun 1993. Algoritma Blowfish termasuk ke dalam kriptografi kunci simetrik (Symmetric Cryptosystem), dan metoda enkripsinya serupa dengan DES (Data Encryption Standard-Like Cipher). Algoritma ini ditujukan untuk mikroprosessor besar (32 bit ke atas dengan cache data yang besar). Algoritma Blowfish terdiri dari dua bagian yaitu ekspansi kunci dan enkripsi data. Ekspansi kunci mengubah sebuah kunci dengan panjang maksimal 448 bit kepada beberapa array subkunci dengan ukuran total 4168 byte. Secara umum, algoritma Blowfish dikembangkan untuk memenuhi kriteria sebagai berikut : a) Cepat, pada implementasi yang optimal Blowfish dapat mencapai kecepatan 26 clock cycle per byte b) Ringan, Blowfish dapat berjalan pada memori kurang dari 5KB c) Sederhana, Blowfish hanya menggunakan operasi yang sederhana, yakni : penambahan (addition), XOR (Ekslusif OR), dan penelusuran tabel (table lookup) pada bilangan yang di operasikan (operand) 32-bit d) Tingkat keamanan yang variatif, panjang kunci Blowfish dapat bervariasi (minimum 32 bit, maksimum 448 bit, multiple (kelipatan) 8 bit, default 128 bit).
Prasetyo Bawono, S.Si Universitas Sebelas Maret
15
Algoritma Blowfish merupakan algoritma yang kuat, dan sampai saat ini belum ditemukan kelemahan yang berarti. Algoritma Blowfish pun dapat digabungkan dengan algoritma-algoritma enkripsi lainnya dalam mengenkripsi sebuah informasi/pesan untuk lebih menjamin isi dari pesan tersebut. Enkripsi data terdiri dari sebuah fungsi sederhana yang mengalami putaran atau iterasi sebanyak 16 kali. Setiap putaran terdiri dari sebuah permutasi yang bergantung pada kunci dan substitusi yang bergantung pada kunci dan data. Seluruh operasi berupa penambahan dan XOR (⊕) dengan kata sepanjang 32 bit. Operasi tambahan yang digunakan hanya berupa data look-up terhadap array dengan empat indeks yang dilakukan setiap putaran. Blowfish menggunakan sejumlah besar subkunci. Kunci-kunci tersebut harus dibangkitkan terlebih dahulu sebelum proses enkripsi dan dekripsi data dilakukan. Menurut Sukmawan (2000), alur proses enkripsi algoritma Blowfish dapat dijelaskan sebagai berikut: 1. P-array terdiri dari 18 buah subkunci dengan ukuran 32 bit: P1, P2, ..., P18 2. Empat buah Kotak-S dengan ukuran 32 bit mempunyai masukan sebanyak 256 buah. Kotak-kotak tersebut adalah: S1,0, S1,1, ..., S1,255 S2,0, S2,1, ..., S2,255 S3,0, S3,1, ..., S3,255 S4,0, S4,1, ..., S4,255 Subkunci dibangkitkan dengan menggunakan algoritma Blowfish. 3. Masukan terhadap jaringan Feistel ini adalah X, yang merupakan elemen data (plainteks) dengan ukuran 64-bit. Bila kurang dari 64-bit, maka akan dilakukan proses padding (penambahan bit). 4. Bagi X menjadi setengah bagian, yaitu dengan ukuran 32-bit. 32-bit pertama disebut XL, 32-bit yang kedua disebut XR.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
16
5. Lakukan langkah-langkah berikut dalam 16 putaran (iterasi): XL = XL ⊕ Pi XR = F(XL) ⊕ XR Kemudian tukar XL dengan XR. Keterangan: i
= 1, 2, …, 16 (menunjukkan nomor putaran/iterasi)
6. Setelah melakukan perulangan yang ke-16, lakukan lagi proses penukaran XL dengan XR. 7. Lakukan operasi XOR (⊕), yaitu : XR = XR ⊕ P17 8. Lakukan operasi XOR (⊕), yaitu : XL = XL ⊕ P18 9. Gabungkan kembali XL dan XR, yaitu : X = XR + XL Fungsi F yang terdapat pada jaringan Feistel didefinisikan sebagai berikut: 1. Bagi XL menjadi empat bagian yang berukuran 8 bit. Keempat bagian yang dihasilkan adalah a, b, c, dan d. 2. Fungsi F(XL) didefinisikan sebagai berikut: F(XL) = ((S1,a + S2,b mod 232) ⊕ S3,c) + S4,d mod 232 Proses dekripsi dilakukan dengan langkah yang sama dengan proses enkripsi, kecuali P1, P2, ..., P18 digunakan dengan urutan terbalik dari proses enkripsi. 8 bits
8 bits
8 bits
8 bits
S-Box 1 32 bits
S-Box 2 32 bits
S-Box 3 32 bits
S-Box 4 32 bits
Gambar 2.8 Skema fungsi F pada algoritma Blowfish
Prasetyo Bawono, S.Si Universitas Sebelas Maret
17
Implementasi algoritma Blowfish yang memerlukan waktu cepat harus mengurangi jumlah putaran dan memastikan bahwa semua subkunci tersimpan dalam cache (penyimpanan sementara). Karena algoritma ini merupakan algoritma yang sudah termasuk lama, tentu saja ada beberapa usaha kriptanalisis yang dilakukan terhadap algoritma ini, antara lain adalah: 1.
John Kelsey membuat sebuah attack yang dapat mematahkan 3 iterasi Blowfish, namun tidak dapat mengembangkannya lebih lanjut. Attack ini melakukan eksploitasi pada fungsi f dan fakta bahwa penambahan mod 232 dan XOR tidak commute.
2.
Vikramjit Singh Chhabra mencari cara untuk menerapkan brute-force key search machine.
3.
Serge Vaudenay melakukan penelitian pada varian Blowfish yang telah disederhanakan, dengan S-aBox yang diketahui, dan tidak key-dependent. Untuk varian ini, attack yang berbeda dapat menemukan P-Array dengan 28r+1 plainteks yang telah dipilih (r merupakan jumlah iterasi). Attack ini tidak mungkin dilakukan pada Blowfish dengan 8-iterasi dan lebih, karena lebih banyak plainteks yang dibutuhkan daripada yang dapat dibangkitkan dengan 64-bit cipher blok.
4.
Tesis Ph.D milik Vincent Rijmen mencantumkan second-order differential attack pada 4 iterasi Blowfish. Namun, attack tersebut tidak dapat dilanjutkan lagi untuk iterasi selanjutnya.
2.1.10 Mode Operasi Enkripsi Cipher Blok Pada algoritma kriptografi yang beroperasi pada cipher blok, dikenal beberapa mode operasi. Empat mode operasi yang lazim digunakan pada cipher blok adalah: 1. Electronic Code Book (ECB) Pada mode ECB, setiap mode plainteks Mi dienkripsi secara individual dan independen menjadi blok cipherteks Ci. Secara matematis proses enkripsi dengan mode ECB dapat dinyatakan sebagai berikut:
Prasetyo Bawono, S.Si Universitas Sebelas Maret
18
Ci = EK (Mi) dan proses dekripsi sebagai berikut: Mi = DK (Ci) Dalam hal ini, Mi dan Ci merupakan blok plainteks dan cipherteks ke-i. Skema enkripsi dan dekripsi dengan mode ECB dapat dilihat pada Gambar 2.9 ENKRIPSI Blok Plainteks M1
DEKRIPSI Blok Cipherteks
m1 m2 m.. mn
c1
M = (m1, m2, …, mn)
Kunci
Blok Cipherteks
c1
c2
c...
C1 cn
C = (c1, c2, …, cn)
c...
cn
C = (c1, c2, …, cn) Kunci
E
K
c2
C1
E
K
Blok Plainteks
m1 m2
M1 m.. mn
M = (m1, m2, …, mn)
Gambar 2.9 Skema Enkripsi dan Dekripsi dengan Mode ECB Mode ini merupakan mode termudah dari keempat mode yang telah disebutkan di atas. Setiap blok plainteks dienkripsi secara independen, sehingga proses enkripsi tidak harus berlangsung secara linear atau proses enkripsi dapat dilakukan pada blok-blok secara tidak berurutan. Keuntungan mode ECB lainnya adalah kesalahan satu bit pada satu blok hanya akan mempengaruhi blok cipherteks yang berkorespondensi pada proses dekripsi. Tetapi mode ECB lemah terhadap serangan. Dalam dunia nyata, kebanyakan bagian-bagian pesan cenderung akan muncul secara berulang di dalam sebuah teks. Dengan mode ECB, yang mengenkripsikan blok-blok secara independen, maka perulangan pesan pada plainteks mempunyai peluang yang besar untuk muncul berulang pula pada cipherteks. Dengan mengetahui informasi ini, kriptanalis dapat melakukan serangan dengan metode statistik secara mudah. Selain itu, mode ECB juga sangat rentan terhadap manipulasi cipherteks yang bertujuan untuk mengelabui pihak penerima pesan.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
19
2. Cipher Block Chaining (CBC) Pada mode operasi CBC, terdapat mekanisme umpan balik pada sebuah blok, yaitu blok plainteks current di-XOR-kan terlebih dahulu dengan blok cipherteks hasil enkripsi sebelumnya. Selanjutnya hasil operasi XOR ini dimasukkan ke dalam fungsi enkripsi. Dengan demikian pada mode CBC, setiap blok cipherteks bergantung tidak hanya pada blok plainteksnya, tapi juga pada seluruh blok plainteks sebelumnya. Dekripsi dilakukan dengan cara memasukkan blok cipherteks current ke dalam fungsi dekripsi, kemudian meng-XOR-kan hasilnya dengan blok cipherteks sebelumnya. Secara matematis proses enkripsi dapat dinyatakan sebagai berikut: Ci = EK (Mi⊕Ci-1) sedangkan proses dekripsi dapat dinyatakan sebagai berikut: Mi = DK (Ci)⊕Ci-1 yang dalam hal ini, C0 = IV (Initialization Vector). IV dapat diberikan oleh pengguna atau dibangkitkan secara acak oleh aplikasi. IV ini merupakan rangkaian bit yang tidak bermakna dan hanya digunakan sebagai inisialisasi untuk membuat setiap blok cipherteks menjadi unik. Jadi, untuk menghasilkan
blok
cipherteks
pertama
(C1),
IV
digunakan
untuk
menggantikan blok cipherteks sebelumnya, C0. Sebaliknya pada proses dekripsi, blok plainteks diperoleh dengan cara meng-XOR-kan IV dengan hasil dekripsi terhadap blok cipherteks pertama. Dengan mode operasi CBC, kesalahan pada satu bit plainteks akan mempengaruhi blok cipherteks yang berkoresponden dan blok-blok cipherteks selanjutnya. Sedangkan kesalahan satu bit pada cipherteks hanya akan mempengaruhi satu blok plainteks yang berkoresponden dan satu bit pada blok berikutnya dengan posisi bit yang berkoresponden pula.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
20
DEKRIPSI
ENKRIPSI
Ci-2 Kunci
K
Mi-1
Mi-1
⊕
⊕
EK
EK
Kunci
K Ci-2
Ci-1
Ci
Ci-1
Ci
DK
DK
⊕
⊕
Mi-1
Mi
Gambar 2.10. Skema Enkripsi dan Dekripsi dengan Mode CBC Terlepas dari kekurangan yang telah disebutkan di atas, mode CBC dapat mengatasi kelemahan yang timbul pada mode ECB. Dengan mode ECB, blok-blok plainteks yang sama tidak menghasilkan blok-blok cipherteks yang sama. Karena itulah kriptanalisis lebih sulit untuk dilakukan pada mode CBC. 3. Cipher FeedBack (CFB) Mode CBC memiliki kelemahan, yaitu proses enkripsi hanya dapat dilakukan pada ukuran blok yang utuh, sehingga mode CBC tidak efisien jika diterapkan pada aplikasi komunikasi data. Permasalahan ini dapat diatasi pada mode CFB. Mode CFB mengenkripsikan data dalam unit yang lebih kecil daripada ukuran blok. Sehingga enkripsi dapat dilakukan meskipun data yang diterima belum lengkap. Proses enkripsi pada unit yang lebih kecil daripada ukuran blok ini membuat mode CFB berlaku seperti cipher aliran (stream cipher). Karena hal inilah, mode CFB dapat diterapkan pada aplikasi komunikasi data. Unit yang dienkripsi dapat berupa bit per bit, 2 bit, 3 bit dan seterusnya. Bila unit yang dienkripsi berupa satu karakter setiap kalinya, maka mode CFB ini disebut CFB 8-bit. Mode ini membutuhkan sebuah antrian yang berukuran sama dengan ukuran blok masukan. Secara formal, proses enkripsi mode CFB n-bit dapat dinyatakan sebagai berikut: Ci = Mi ⊕ MSBb (EK(Xi)) Xi+1 = LSBb-u (Xi) || Ci
Prasetyo Bawono, S.Si Universitas Sebelas Maret
21
sedangkan untuk proses dekripsi dapat dinyatakan sebagai berikut: Mi = Ci ⊕ MSBb (DK(Xi)) Xi+1 = LSBb-u (Xi) || Ci Keterangan: Xi
: isi antrian dengan Xi adalah IV
EK
: fungsi enkripsi
DK
: fungsi dekripsi
K
: kunci
b
: panjang blok enkripsi
u
: panjang unit enkripsi
||
: operasi penyambungan (concatenation)
MSB : Most Significant Byte LSB
: Least Significant Byte Secara umum, CFB u-bit mengenkripsi plainteks sebanyak u-bit setiap
kalinya, yang mana u b (b=ukuran blok). Mode CFB membutuhkan sebuah antrian (queue) yang berukuran sama dengan ukuran blok masukan. Mode CFB mempunyai keunikan tersendiri, yaitu untuk proses enkripsi dan dekripsi digunakan fungsi yang sama. Skema enkripsi dan dekripsi dengan mode CFB 8-bit dapat dilihat pada Gambar 2.10 ENKRIPSI
DEKRIPSI
Antrian 8-byte
Antrian 8-byte
K
K
EK
Left-most byte
mi
Left-most byte
pi ⊕
DK
ci
ci
pi ⊕
mi
Gambar 2.11. Skema Enkripsi dan Dekripsi dengan Mode CFB 8-Bit
Prasetyo Bawono, S.Si Universitas Sebelas Maret
22
Pada mode CFB pun terdapat perambatan kesalahan baik pada proses enkripsi maupun proses dekripsi. Pada proses enkripsi, kesalahan satu bit pada plainteks mempengaruhi blok cipherteks yang berkoresponden dan blokblok cipherteks berikutnya. Sedangkan kesalahan satu bit pada blok cipherteks akan bit yang berkoresponden dan bit-bit lainnya selama bit error tersebut terdapat di dalam pergeseran bit (shift register). Pada mode CFB 8bit dan ukuran blok 64 bit, maka kesalahan satu byte pada blok cipherteks akan mempengaruhi satu byte plainteks yang berkoresponden dan delapan byte berikutnya (lama byte error yang terdapat dalam shift register adalah delapan putaran). 4. Output FeedBack (OFB) Mode OFB bekerja dengan cara yang mirip dengan mode CFB, kecuali n-bit dari hasil fungsi enkripsi terhadap antrian disalin menjadi elemen paling kanan antrian. Secara formal, mode OFB n-bit dapat dinyatakan sebagai berikut: Ci = Mi ⊕ MSBb (EK(Xi)) Xi+1 = LSBb-u (Xi) || MSBb (EK(Xi)) sedangkan proses dekripsi dapat dinyatakan sebagai berikut: Mi = Ci ⊕ MSBb (DK(Xi)) Xi+1 = LSBb-u (Xi) || MSBb (EK(Xi)) Pada mode OFB tidak terdapat perambatan kesalahan. Kesalahan satu bit pada plainteks hanya mengakibatkan kesalahan satu bit yang berkoresponden pada cipherteks. Sebaliknya, kesalahan satu bit pada cipherteks hanya mengakibatkan kesalahan satu bit yang berkoresponden pada plainteks. Gambar 2.11 menunjukkan skema enkripsi dan dekripsi pada cipher blok untuk mode OFB 8-bit
Prasetyo Bawono, S.Si Universitas Sebelas Maret
23
ENKRIPSI
DEKRIPSI
Antrian 8-byte
Antrian 8-byte
K
K
EK
Left-most byte
DK
Left-most byte
pi mi
⊕
pi ci
ci
⊕
mi
Gambar 2.12 Skema Enkripsi dan Dekripsi pada mode OFB 8-Bit
Penggunaan mode-mode operasi tersebut tidak merubah fungsi enkripsi dan dekripsi yang telah didefinisikan.
2.2 Kerangka Pemikiran Berdasarkan pendahuluan dan mengacu pada tinjauan pustaka, dapat disusun suatu kerangka pemikiran penulisan skripsi sebagai berikut: 1.
Dilakukan analisis sistem terhadap aplikasi teknik pengamanan data teks menggunakan algoritma Blowfish.
2.
Dengan adanya tahapan analisis sistem, dapat ditentukan kebutuhan sistem sehingga dapat dilakukan pembuatan aplikasi enkripsi dan dekripsi data teks menggunakan algoritma Blowfish.
3.
Data teks dan kunci (private key) merupakan data masukan, yang kemudian di enkripsi dengan algoritma Blowfish dan disimpan menjadi sebuah file teks cipher. File teks cipher tersebut akan dibuka kembali dengan aplikasi yang sudah dibuat, kemudian dilakukan proses dekripsi, sehingga data teks semua berubah seperti semula.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
24
`BAB III METODE PENELITIAN
Metode penelitian yang digunakan dalam penulisan skripsi ini adalah pengembangan sistem dan disertai dengan studi literatur. Langkah-langkah yang dilakukan untuk mencapai tujuan skripsi ini adalah sebagai berikut: 1. Melakukan studi literatur tentang algoritma Blowfish dan penerapannya. 2. Perencanaan sistem. 3. Analisis sistem teknik pengamanan data dengan menggunakan algoritma Blowfish untuk mengidentifikasi masalah, memahami cara kerja sistem dan mengenali kebutuhan. 4. Perancangan sistem, yaitu perancangan flowchart, form masukan dan form keluaran. 5. Implementasi sistem. Sistem dibangun berdasarkan algoritma yang telah ada menggunakan bahasa pemrograman Java 2 Standard Edition (J2SE). 6. Evaluasi sistem. Evaluasi sistem dilakukan untuk menguji tingkat efisiensi sistem. 7. Dalam membuat dan melakukan evaluasi sistem diperlukan seperangkat alat komputer. Adapun spesifikasi alat komputer yang digunakan sebagai berikut: a. Hardware Tabel 3.1 Spesifikasi Hardware Jenis
Spesifikasi
Notebook
Notebook Hewlett Packard 520
Processor
Intel(R) Celeron(R) 420 1.60Gz
Memory
RAM DDR2 1.5GB
VGA Card
Mobile Intel(R) 945 Express Chipset Family
24 Prasetyo Bawono, S.Si Universitas Sebelas Maret
25
b. Software Tabel 3.2 Spesifikasi Software Jenis Sistem Operasi
Spesifikasi -
Microsoft(R) Windows(R) eXPerience (XP) Professional SP3
Bahasa Pemrograman
Ubuntu 9.10 Karmic Koala
Java 2 Standard Edition -
Java Development Kit (JDK) 1.6.0_11
-
Java Runtime Environment (JRE) 6
IDE
Netbeans 6.5
Database Server
MySQL Server 5.1
Database Manager Navicat Lite 8 for MySQL
Prasetyo Bawono, S.Si Universitas Sebelas Maret
26
BAB IV PEMBAHASAN
4.1 Analisis Sistem Dalam melakukan analisis sistem, perlu diketahui terlebih dahulu alur sistem pengamanan data yang akan dibuat. Secara umum, alur sistem pengamanan data dapat digambarkan seperti Gambar 4.1. Kunci (Private Key)
Plainteks
Teks ter-Enkripsi
Kunci (Private Key) File Cipherteks
Teks ter-Dekripsi
Plainteks
Gambar 4.1 Alur Sistem Pengamanan Data Teks Berdasarkan Gambar 4.1 dengan mengacu pada Gambar 2.1, plainteks merupakan data teks berkode ASCII (American Standard Code for Information Interchange) dimana setiap karakter memiliki nilai setara dengan 8 bits (1 byte). Sistem (perangkat lunak) akan dijalankan dalam dua mode, yaitu mode enkripsi dan mode dekripsi. Di tiap-tiap mode akan memiliki data masukan berupa plainteks (bisa berupa teks yang langsung di tulis, maupun dalam bentuk file teks), kunci (private key), dan memilih mode operasi enkripsi (ECB, CBC, OFB, atau CFB). Untuk menghindari adanya weak key (kunci lemah) dalam penggunaan algoritma Blowfish, maka kunci dibuat dengan minimal 8 karakter. Setelah mengisi semua data masukan, selanjutnya dilakukan proses enkripsi dengan algoritma Blowfish. Hasil dari proses enkripsi ini dapat disimpan ke dalam file berekstensi .cip, yang selanjutnya akan menjadi cipherteks.
26 Prasetyo Bawono, S.Si Universitas Sebelas Maret
27
4.2 Diagram Alir (Flowchart) Aplikasi Berikut flowchart (diagram alir) dari sistem perangkat lunak yang akan di buat:
Begin
Login Tidak
Sukses ?
Ya
Enkripsi
Enkripsi / Dekripsi ?
Dekripsi
Ya
Ya
Input Data
Input Data
Plainteks
Cipherteks
Mode Enkripsi Cipher Blok (ECB, CBC, CFB, OFB)
Mode Enkripsi Cipher Blok (ECB, CBC, CFB, OFB)
Kunci
Kunci Ya
Ya
Kunci = 0 / Kunci < 8 ?
Kunci = 0 / Kunci < 8 ?
Tidak Tidak
Tidak
Proses Enkripsi (Blowfish)
Proses Dekripsi (Blowfish)
Cipherteks
Plainteks
Logout?
Logout?
Tidak
Tidak
Quit?
Quit?
Ya
End
Ya
Gambar 4.2 Diagram Alir Aplikasi Sistem Pengamanan Data Teks
Prasetyo Bawono, S.Si Universitas Sebelas Maret
28
4.3
Perancangan Sistem
4.3.1
Rancangan Database
Basis data yang dibutuhkan dalam sistem pengamanan data dengan algoritma Blowfish hanya digunakan untuk memvalidasi user dan password untuk login aplikasi. Basis data yang digunakan adalah MySQL. Struktur tabel basis data dalam sistem hanya berisi tabel user, yang berisi data username dan password untuk menjalankan program. Tabel 4.1. Tabel User Nama Fields
Tipe Fields
Panjang Fields Keterangan
user_id
Varchar
24
ID username (primary key)
pass_id
Varchar
24
kata kunci (password)
name
Char
24
nama lengkap pengguna
4.3.2
Rancangan Form Login
Program login adalah form login pengguna sistem pengamanan data. Login dibutuhkan sebagai sistem verifikasi pengguna (authentication) yang memperbolehkan atau tidaknya pemakai mempergunakan sistem. Form login ini akan dihubungkan dengan database MySQL melalui penghubung JDBC (Java Database Connectivity). username
password login
Gambar 4.3 Rancangan Form Sistem Login
Prasetyo Bawono, S.Si Universitas Sebelas Maret
29
4.3.3
Rancangan Form Enkripsi dan Dekripsi
Program enkripsi adalah form masukan data teks yang akan di proses untuk di enkripsi. Ada tiga jenis data yang akan dimasukkan, yaitu: plainteks, kunci (plainteks) dan mode enkripsi (ECB, CBC, CFB atau OFB). Plainteks bisa dibuka dari file teks yang sudah ada, atau bisa langsung memasukkannya secara manual.
reset
Kunci (Private Key) Mode Enkripsi :
ECB
CBC
OFB
CFB
plainteks
Size: ___ Bytes
New
Save
Open
Enkripsi
cipherteks
Size: ___ Bytes
Time: __________ ms
Gambar 4.4 Rancangan Form Sistem Enkripsi
Prasetyo Bawono, S.Si Universitas Sebelas Maret
Save Cipher
30
reset
Kunci (Private Key) Mode Dekripsi :
ECB
CBC
OFB
CFB
cipherteks
Size: ___ Bytes
Reset
Save
Open
Dekripsi
plainteks
Size: ___ Bytes
Time: __________ ms
Save Plain
Gambar 4.5 Rancangan Form Sistem Dekripsi
4.3.4 Validasi Data Masukan Ketika user memasukkan data sebagai data masukan, dimungkinkan terjadinya kesalahan-kesalahan, yaitu: kunci kosong (blank password), plainteks bukan dalam standar ASCII (Sebagai contoh: huruf katakana dan hiragana). Oleh karena itu, untuk menghindari terjadinya hal tersebut, diperlukan beberapa langkah validasi. Ketentuan-ketentuan yang digunakan dalam validasi data masukan adalah 1. tidak diperbolehkan tidak mengisi kata kunci (kunci kosong), 2. tidak diperbolehkan memasukkan karakter lain selain standar ASCII
Prasetyo Bawono, S.Si Universitas Sebelas Maret
31
4.4
Implementasi Sistem
Sistem dibangun berdasarkan algoritma Blowfish yang telah ada menggunakan bahasa pemrograman Java 2 Standard Edition dengan basis data MySQL Server 5.1 dan dukungan penghubung JDBC (Java Database Connectivity) serta Navicat Lite 8 for MySQL sebagai database manager. Aplikasi ini diberi nama FUGU, bahasa Jepang untuk Ikan Kembung (Blowfish). Form-form yang ada pada sistem adalah sebagai berikut. 1. Form Login 2. Form Utama 3. Form Enkripsi 4. Form Dekripsi 5. Form Tentang Program Form login merupakan tampilan utama ketika sistem dijalankan. Form ini digunakan untuk mengecek pengguna yang dapat menggunakan sistem. Tampilan form login seperti pada Gambar 4.6. Setelah otentikasi berhasil, pengguna akan dibawa ke form utama. Form utama memuat pilihan mode sistem, yaitu: mode enkripsi atau mode dekripsi. Tampilan form utama seperti pada gambar 4.7.
Gambar 4.6 Tampilan Form Login
Prasetyo Bawono, S.Si Universitas Sebelas Maret
32
Gambar 4.7 Tampilan Form Utama Form Enkripsi merupakan form inti dari sistem pengamanan data teks. Pada form ini, pengguna akan diminta memasukkan plainteks, kunci (private key), dan mode enkripsi cipher blok (ECB, CBC, CFB, atau OFB). Plainteks yang dimasukkan bisa berupa berkas teks yang tersimpan, maupun pesan teks secara langsung. Berkas teks umumnya berupa dokumen teks berformat ASCII (Contoh: *.txt, *.java, *.py, *.pl, *.sh, *.cnf, dan sebagainya). Tampilan form enkripsi terdapat pada Gambar 4.8.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
33
Gambar 4.8 Tampilan Form Enkripsi
Gambar 4.9 Pesan Pemberitahuan Enkripsi yang Berhasil
Prasetyo Bawono, S.Si Universitas Sebelas Maret
34
Gambar 4.10 Pesan Peringatan Kesalahan Input Kunci Ketika
pengguna
melakukan
input
data
dimungkinkan
terjadi
kesalahan/kelalaian, salah satunya adalah tidak memasukkan kunci private. Oleh karena itu diperlukan validasi untuk menangani kesalahan tersebut. Jika pengguna sengaja/tidak sengaja tidak mengisi kunci, maka akan muncul pesan kesalahan seperti pada Gambar 4.10. Apabila kunci, plainteks serta mode enkripsi telah diisi dengan benar, maka proses enkripsi dapat dilanjutkan. Gambar 4.9 menujukkan proses enkripsi telah berhasil dilakukan. Selanjutnya adalah menyimpan cipherteks ke dalam berkas berekstensi .cip sebagaimana terdapat pada Gambar 4.11.
Gambar 4.11 Dialog Simpan Cipherteks Berekstensi .cip
Prasetyo Bawono, S.Si Universitas Sebelas Maret
35
Gambar 4.12 Pesan Konfirmasi Cipherteks Berhasil Disimpan Pada proses dekripsi, data masukan berupa berkas cipherteks (berkas dengan ekstensi .cip), kunci (private key), dan mode dekripsi cipher blok (ECB, CBC, CFB atau OFB).
Gambar 4.13 Tampilan Form Dekripsi
Prasetyo Bawono, S.Si Universitas Sebelas Maret
36
Perlu diperhatikan bahwa pada saat enkripsi dan dekripsi data, mode enkripsi cipher blok yang dipilih harus sama dengan mode dekripsi cipher blok. Jika tidak, maka akan terjadi kesalahan dalam proses dekripsinya.
Gambar 4.14 Pesan pemberitahuan dekripsi berhasil disimpan
4.5 Evaluasi Sistem 4.5.1 Struktur Algoritma Blowfish Blowfish adalah algoritma kunci simetri, yang berarti menggunakan kunci yang sama untuk melakukan enkripsi dan dekripsi berkas. Blowfish juga merupakan cipher blok, yang berarti selama proses enkripsi dan dekripsi, Blowfish akan membagi pesan menjadi blok-blok dengan ukuran yang sama panjang. Panjang blok untuk algoritma Blowfish adalah 64-bit, yang merupakan multiple (kelipatan) dari 8-bit. Jika bukan merupakan kelipatan dari 8-bit, maka akan ditambahkan bit-bit tambahan (padding) sehingga ukuran untuk tiap blok sama. Algoritma dalam Blowfish terbagi menjadi dua bagian, yaitu ekspansi kunci (key expansion) dan enkripsi data (data encryption). Proses ekspansi kunci akan melakukan konversi sebuah kunci mulai dari 56-byte (448-bit) sampai beberapa beberapa array sub kunci dengan total mencapai 4168-byte. Sedangkan proses enkripsi data terjadi pada jaringan Feistel, yang mengandung fungsi pengulangan (iterasi) sebanyak enam belas kali. Blowfish menggunakan jaringan Feistel yang terdiri dari 16 buah putaran. Skema jaringan Feistel pada algoritma Blowfish dapat dilihat pada Gambar 4.15.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
37
Plainteks / X (64-bit)
XR (32-bit)
XL (32-bit)
P1 F(XL) = ((S1,a + S2,b mod 232) ⊕ S3,c) + S4,d mod 232 XL(32-bit)= a(8-bit),b(8-bit),c(8-bit),d(8-bit)
F
P2
F
13 Putaran
P16
F
P18
P17
Cipherteks (64-bit)
Gambar 4.15. Skema Jaringan Feistel Pada Algoritma Blowfish
Prasetyo Bawono, S.Si Universitas Sebelas Maret
38
Tabel 4.2. Pseudo Code Jaringan Feistel Algoritma Blowfish Line
Pseudo Code
1 2
Begin
3 4
Input: X
5 6 7 8 9 10 11 12
// 64 bit plainteks (8 Karakter ASCII)
P1, P2, ..., P18 // 18 sub-keys, Pi dengan i = iterasi F() // Fungsi iterasi Output: C: 64 bits of cipher text Algorithm: (xL, xR) = X
// Bagi X menjadi 2 bagian, 32-bit/bagian
13 14
Loop on i from = 1 to 16 xL = xL XOR Pi
15 16
xR = F(xL) XOR xR Swap xL and xR
// Lakukan iterasi // Operasi XOR xL dgn Pi // Operasi XOR F(xL) dgn xR // Tukar xL dgn xR
17 18
End of loop Swap xL and xR
19 20
xR = xR XOR P17 xL = xL XOR P18
// Operasi XOR xR dgn P17 -> xR // Operasi XOR xL dgn P18 -> xL
21 22
C = (xL, xR)
// 64 bit cipherteks
23
// Akhir looping // Tukar lagi xL dgn xR
End
Tabel 4.3. Pseudo Code fungsi iterasi F() Line
Pseudo Code
1
Begin
2 3
Input:
4 5 6 7 8 9 10 11 12 13 14 15
xL, xR // 32-bit data masukan S1[], S2[], S3[], S4[] // 4 Kotak-S table lookup @ 256 entri Output F(xL) or F(xR)
// 32-bit output data
Algorithm (a, b, c, d) = xL // Bagi xL (xR) jadi 4 bagian, @ 8-bit F(xL) = ((S1[a] + S2[b] mod 2**32) XOR S3[c]) + S[d] mod 2**32 // ** Operasi Pangkat End
Prasetyo Bawono, S.Si Universitas Sebelas Maret
39
Tabel 4.4. Pseudo Code Pembangkitan Sub-kunci Line
Pseudo Code
1
Begin
2 3
Input:
4 5
K PI
// Kunci (private) - 32 bit atau lebih // Bagian biner terkecil dari "pi"
6 7
= 3.1415927... - 3.0 = 2/16 + 4*/16**2 + 3/16**3 + 15/16**4 + ...
8 9
= 0x243f6a8885a308d313198a2e03707344...
10 11 12 13 14 15
Output: P1, P2, ..., P18 // 18 32-bit sub-kunci S1[], S2[], S3[], S4[] // 4 Kotak-S, 32-bit @256 elemen arrays Algorithm: (P1, P2, ..., P18, S1[], S2[], S3[], S4[]) = PI
16 17
K' = (K, K, K, ...) // Ulangi kuncinya -> panjang 18*32 bit (P1, P2, ..., P18) = (P1, P2, ..., P18) XOR K'
18 19
X = (0x000000, 0x000000) // Setting inisialiasi plainteks X = Blowfish(X) // Menerapkan algoritma Blowfish
20 21
(P1, P2) = X X = Blowfish(X)
// Perbarui dua sub-kunci pertama P1 & P2 // Terapkan kembali algoritma Blowfish
22 23
(P3, P4) = X ......
// Perbarui dua sub-kunci P3 & P4
24 25
X = Blowfish(X) (P17, P18) = X
// Terapkan kembali algoritma Blowfish // Perbarui dua sub-kunci P17 & P18
26 27
X = Blowfish(X) // Terapkan kembali algoritma Blowfish (S1[0], S1[1]) = X // Perbarui 2 Kotak-S pertama S1[0] & S1[1]
28 29
X = Blowfish(X) // Terapkan kembali algoritma Blowfish (S1[2], S1[3]) = X // Perbarui 2 Kotak-S S1[2] & S1[3]
30 31
...... X = Blowfish(X)
32 33
(S1[254], S1[255]) = X // Perbarui 2 Kotak-S S1[254] & S1[255] X = Blowfish(X) // Terapkan kembali algoritma Blowfish
34 35
(S2[0], S2[1]) = X // Perbarui 2 Kotak-S pertama S2[0] & S2[1] ......
36 37
X = Blowfish(X) // Terapkan kembali algoritma Blowfish (S4[254], S4[255]) = X // Perbarui 2 Kotak-S S4[254] & S4[255]
38 39
End
Prasetyo Bawono, S.Si Universitas Sebelas Maret
// Terapkan kembali algoritma Blowfish
40
Perlu diketahui bahwa: 1.
Untuk menginisalisasi 18 sub-kunci dan 4 Kotak-S, diperlukan (18*32 + 4*256*32) = (576 + 32768) = 33344 digit biner dari Pi, atau 33344/4 = 8366 digit hex dari PI. Untuk mengetahui 8366 digit hex dari Pi, dapat dilihat pada lampiran kode program (Lampiran 1).
2.
Untuk menyelesaikan ke 18 sub-kunci dan 4 Kotak-S, diperlukan penerapan algoritma Blowfish sebanyak (18+(4*256))/2 = 521 kali.
4.5.2
Uji Coba Aplikasi
Berdasarkan sistem yang telah dibuat, dilakukan evaluasi dan uji coba sistem dengan data masukan sebagai berikut: Tabel 4.5. Data Masukan Uji Coba Aplikasi Proses Enkripsi Performance I
Performance II
Performance III
(22 B)
(206.076 B / 202 KB)
(1.052.629 B / 1 MB)
Mode C
T (ms)
C
T (ms)
C
T (ms)
ECB
24
703
206.080
955
1.052.632
1.297
CBC
24
700
206.080
969
1.052.632
1.328
CFB
22
738
206.076
968
1.052.629
1.344
OFB
22
693
206.076
969
1.052.629
1.312
1400 1200 1000 800 Perf 1
Time (ms) 600
Perf 2 Perf 3
400 200 0 ECB
CBC
CFB
OFB
Mode Enkripsi
Gambar 4.16. Chart Waktu Enkripsi Tiap Mode
Prasetyo Bawono, S.Si Universitas Sebelas Maret
41
Tabel 4.6. Data Masukan Uji Coba Aplikasi Proses Dekripsi Performance I
Performance II
Performance III
(22 B)
(206.076 B / 202 KB)
(1.052.629 B / 1 MB)
Mode C
T (ms)
C
T (ms)
C
T (ms)
ECB
24
781
206.080
1.078
1.052.632
1.140
CBC
24
781
206.080
1.094
1.052.632
1.187
CFB
22
797
206.076
1.000
1.052.629
1.187
OFB
22
782
206.076
1.078
1.052.629
1.156
1200
Time (ms)
1000 800 Perf 1
600
Perf 2 400
Perf 3
200 0 ECB
CBC
CFB
OFB
Mode Dekripsi
Gambar 4.17 Chart Waktu Dekripsi Tiap Mode Berdasarkan data-data di atas, terlihat bahwa running time tiap-tiap mode enkripsi dan dekripsi tidak berbeda jauh secara signifikan.
4.5.3
Analisis Algoritma dengan Notasi big-O
Notasi big O (juga dikenal sebagai Big Oh, notasi Landau, atau notasi Bachmann-Landau) merupakan notasi yang digunakan untuk menggambarkan batasan perilaku dari sebuah fungsi algoritma ketika variabel cenderung ke arah nilai yang tak terbatas. Secara sederhana, notasi big O digunakan untuk menghitung
running
time
dari
sebuah
algoritma.
Walaupun
awalnya
dikembangkan sebagai bagian dari bidang matematika murni, namun saat ini notasi big O sering digunakan dalam teori kompleksitas komputasi untuk menggambarkan pemakaian algoritma terhadap sumber daya komputasi (computational resources). Prasetyo Bawono, S.Si Universitas Sebelas Maret
42
Tata cara pemakaian notasi big O dalam sebuah fungsi algoritma: a.
Kurangi semua faktor konstanta dan kembalikan ke nilai 1 Contoh: 10n 2 9 120n 400 n 2 1 n 1
b.
Buang semua konstanta kecuali satu Contoh: n 2 1 n 1 n 2 n 1
c.
Buang semua variabel kecuali satu yang paling dominan Contoh: n 2 n 1 n 2 . Sehingga nilai notasi big O-nya adalah O( n 2 ) Aturan untuk menentukan kompleksitas waktu asimptotik big O dalam
sebuah pseudo code: a.
Pengisian nilai (assignment), perbandingan, operasi aritmatik, read, write membutuhkan running time O(1)
b.
Pengaksesan elemen array atau memilih field tertentu dari sebuah record membutuhkan running time O(1)
c.
Perulangan (loop) for. Kompleksitas waktu loop for adalah jumlah pengulangan dikali dengan kompleksitas waktu badan (body) loop. Sederhananya: 1. Normal loop memiliki running time, O(n) 2. Dua buah loop (bersarang) memiliki running time, O( n 2 ) 3. Tiga buah loop (bersarang) memiliki running time, O( n 3 )
Prasetyo Bawono, S.Si Universitas Sebelas Maret
43
Berikut analisis algoritma Blowfish dengan menggunakan notasi big O: Table 4.7. Kompleksitas Waktu Algoritma Blowfish Line
Pseudo Code
1 2
Begin Algorithm:
3 4
O()
(xL, xR) = X // Bagi X menjadi 2 bagian, 32-bit/bagian Loop on i from = 1 to 16 // Lakukan iterasi
5 6
xL = xL XOR Pi xR = F(xL) XOR xR
O(1) 0(n)
// Operasi XOR xL dgn Pi // Operasi XOR F(xL) dgn xR
7 8
Swap xL and xR End of loop
9 10
Swap xL and xR xR = xR XOR P17
// Tukar lagi xL dgn xR // Operasi XOR xR dgn P17 -> xR
0(1) 0(1)
11 12
xL = xL XOR P18 C = (xL, xR)
// Operasi XOR xL dgn P18 -> xL // 64 bit cipherteks
0(1) O(1)
13
// Tukar xL dgn xR // Akhir looping
End
Kompleksitas waktu asimptotiknya : = O(1) + O( n ) + O(1) + O(1) + O(1) + O(1) = O(1) + O( n ) + O(max(1,1,1)) = O(1) + O( n ) + O(1) = O(max(1, n ,1)) = O( n ) linier, dengan n adalah banyaknya karakter yang dienkripsi Sedangkan untuk kompleksitas waktu dari masing-masing mode enkripsi cipher blok yang digunakan dalam sistem ini adalah sebagai berikut: Tabel 4.8. Kompleksitas Waktu Tiap-tiap Mode Mode ECB
Method init() proccessBlock() EncryptBlock() DecryptBlock()
CBC
init() EncryptBlock() DecryptBlock()
CFB
init()
OFB
init() proccessBlock()
Prasetyo Bawono, S.Si Universitas Sebelas Maret
O() O(1) O(1) O( n ) O( n ) O(1) O( n ) O( n ) O( n ) O( n ) O( n )
O(max()) O( n )
O( n ) O( n ) O( n )
44
Berdasarkan hasil perhitungan running time dari masing-masing mode enkripsi di atas, terlihat bahwa semua mode enkripsi mempunyai running time yang tidak jauh berbeda. Sehingga algoritma Blowfish dengan mode enkripsi ECB, CBC, CFB dan OFB dengan notasi big O = O( n ) atau linier, sama baiknya berdasarkan running time yang ada. Running time bersifat linier, yang berarti bahwa running time akan selalu berbanding lurus dengan besarnya input. Hal ini terbukti dari hasil percobaan pada Tabel 4.5 dan Tabel 4.6.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
45
BAB V PENUTUP
5.1 Kesimpulan Berdasarkan pembahasan dapat diambil kesimpulan sebagai berikut: 1. Telah dibuat sistem pengamanan data dengan menggunakan algoritma Blowfish, khususnya data teks. 2. Aplikasi yang dibuat memiliki pilihan mode enkripsi cipher blok. 3. Blowfish merupakan salah satu solusi yang baik untuk mengatasi masalah keamanan dan kerahasiaan data yang pada umumnya diterapkan dalam saluran komunikasi dan berkas. 4. Algoritma Blowfish merupakan algoritma dengan operasi yang sederhana dan menggunakan jaringan Feistel 5. Tingkat keamanan algoritma Blowfish ditentukan oleh jumlah iterasi dan panjang kunci yang digunakan. 6. Algoritma Blowfish merupakan algoritma yang kuat, yang belum ditemukan titik lemahnya. 7. Tidak ada perbedaan waktu enkripsi yang signifikan antara mode-mode enkripsi yang ada, dengan hasil-hasil sebagai berikut: a) Waktu enkripsi dengan mode ECB (Electronic Code Book) untuk data 22 byte sebesar 703 ms (millisecond), data 206.080 byte sebesar 955 ms, data 1.052.632 byte sebesar 1.297 ms. b) Waktu enkripsi dengan mode CBC (Cipher Block Chainning) untuk data 22 byte sebesar 700 ms (millisecond), data 206.080 byte sebesar 969 ms, data 1.052.632 byte sebesar 1.328 ms. c) Waktu enkripsi dengan mode CFB (Cipher Feed Back) untuk data 22 byte sebesar 738 ms (millisecond), data 206.080 byte sebesar 968 ms, data 1.052.632 byte sebesar 1.344 ms. d) Waktu enkripsi dengan mode OFB (Output Feed Back) untuk data 22 byte sebesar 693 ms (millisecond), data 206.080 byte sebesar 969 ms, data 1.052.632 byte sebesar 1.312 ms.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
45
46
e) Waktu dekripsi dengan mode ECB (Electronic Code Book) untuk data 24 byte sebesar 781 ms (millisecond), data 206.080 byte sebesar 1078 ms, data 1.052.632 byte sebesar 1.297 ms. f) Waktu dekripsi dengan mode CBC (Cipher Block Chainning) untuk data 24 byte sebesar 781 ms (millisecond), data 206.080 byte sebesar 1094 ms, data 1.052.632 byte sebesar 1.328 ms. g) Waktu dekripsi dengan mode CFB (Cipher Feed Back) untuk data 22 byte sebesar 797 ms (millisecond), data 206.076 byte sebesar 1000 ms, data 1.052.629 byte sebesar 1.344 ms. h) Waktu dekripsi dengan mode OFB (Output Feed Back) untuk data 22 byte sebesar 782 ms (millisecond), data 206.076 byte sebesar 1078 ms, data 1.052.629 byte sebesar 1.312 ms.
5.2 Saran Pada penulisan skripsi ini dibuat sistem pengamanan data dengan menggunakan algoritma Blowfish dengan teks sebagai data masukannya. Untuk selanjutnya dapat dikembangkan lagi sistem yang mampu menerima input berkas tidak hanya teks, namun juga bisa berkas suara, video maupun yang lainnya.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
47
DAFTAR PUSTAKA
Budiyanto,
A.
(2003).
Pengantar
Algoritma
dan
Pemrograman.
Ilmukomputer.com. Menezes, Alfred J., Paul C Van Oorschot, dan Scott A. Vanstone (1996). Handbook of Applied Cryptography. Penerbit CRC Press. Munir, Rinaldi. (2006). Kriptografi. Penerbit Informatika Bandung. Randy, Adhitya (2006). Studi Perbandingan Algoritma Blowfish dan Twofish, pp. 1-17. Schneier, Bruce (1996). Applied Cryptography 2nd. Penerbit John Willey & Sons Sukmawan,
Budi
(2000).
Metoda
Enkripsi
Blowfish.
Keamanan
Jaringan
http://bdg.centrin.net.id/~budskman/artikel.htm Tanggal akses: 1 April 2008 pukul 10.35 WIB Susanto,
Budi.
(2004)
Jaringan
Komputer,
http://lecturer.ukdw.ac.id/budsus/ Tanggal akses: 1 April 2008 pukul 10.45 WIB Syafari, Anjar (2007). Sekilas Tentang Enkripsi Blowfish. http://ilmukomputer.com/2007/07/21/sekilas-tentang-enkripsi-blowfish/ Tanggal akses: 1 April 2008 pukul 10.15 WIB
Prasetyo Bawono, S.Si Universitas Sebelas Maret
47
48
LAMPIRAN
1.
Lampiran 1 : 8366 Digit Hex dari Pi (Key Expansions) 243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89 452821E638D01377BE5466CF34E90C6CC0AC29B7C97C50DD3F84D5B5B5470917 9216D5D98979FB1BD1310BA698DFB5AC2FFD72DBD01ADFB7B8E1AFED6A267E96 BA7C9045F12C7F9924A19947B3916CF70801F2E2858EFC16636920D871574E69 A458FEA3F4933D7E0D95748F728EB658718BCD5882154AEE7B54A41DC25A59B5 9C30D5392AF26013C5D1B023286085F0CA417918B8DB38EF8E79DCB0603A180E 6C9E0E8BB01E8A3ED71577C1BD314B2778AF2FDA55605C60E65525F3AA55AB94 5748986263E8144055CA396A2AAB10B6B4CC5C341141E8CEA15486AF7C72E993 B3EE1411636FBC2A2BA9C55D741831F6CE5C3E169B87931EAFD6BA336C24CF5C 7A325381289586773B8F48986B4BB9AFC4BFE81B6628219361D809CCFB21A991 487CAC605DEC8032EF845D5DE98575B1DC262302EB651B8823893E81D396ACC5 0F6D6FF383F442392E0B4482A484200469C8F04A9E1F9B5E21C66842F6E96C9A 670C9C61ABD388F06A51A0D2D8542F68960FA728AB5133A36EEF0B6C137A3BE4 BA3BF0507EFB2A98A1F1651D39AF017666CA593E82430E888CEE8619456F9FB4 7D84A5C33B8B5EBEE06F75D885C12073401A449F56C16AA64ED3AA62363F7706 1BFEDF72429B023D37D0D724D00A1248DB0FEAD349F1C09B075372C980991B7B 25D479D8F6E8DEF7E3FE501AB6794C3B976CE0BD04C006BAC1A94FB6409F60C4 5E5C9EC2196A246368FB6FAF3E6C53B51339B2EB3B52EC6F6DFC511F9B30952C CC814544AF5EBD09BEE3D004DE334AFD660F2807192E4BB3C0CBA85745C8740F D20B5F39B9D3FBDB5579C0BD1A60320AD6A100C6402C7279679F25FEFB1FA3CC 8EA5E9F8DB3222F83C7516DFFD616B152F501EC8AD0552AB323DB5FAFD238760 53317B483E00DF829E5C57BBCA6F8CA01A87562EDF1769DBD542A8F6287EFFC3 AC6732C68C4F5573695B27B0BBCA58C8E1FFA35DB8F011A010FA3D98FD2183B8 4AFCB56C2DD1D35B9A53E479B6F84565D28E49BC4BFB9790E1DDF2DAA4CB7E33 62FB1341CEE4C6E8EF20CADA36774C01D07E9EFE2BF11FB495DBDA4DAE909198 EAAD8E716B93D5A0D08ED1D0AFC725E08E3C5B2F8E7594B78FF6E2FBF2122B64 8888B812900DF01C4FAD5EA0688FC31CD1CFF191B3A8C1AD2F2F2218BE0E1777 EA752DFE8B021FA1E5A0CC0FB56F74E818ACF3D6CE89E299B4A84FE0FD13E0B7 7CC43B81D2ADA8D9165FA2668095770593CC7314211A1477E6AD206577B5FA86 C75442F5FB9D35CFEBCDAF0C7B3E89A0D6411BD3AE1E7E4900250E2D2071B35E 226800BB57B8E0AF2464369BF009B91E5563911D59DFA6AA78C14389D95A537F 207D5BA202E5B9C5832603766295CFA911C819684E734A41B3472DCA7B14A94A 1B5100529A532915D60F573FBC9BC6E42B60A47681E6740008BA6FB5571BE91F F296EC6B2A0DD915B6636521E7B9F9B6FF34052EC585566453B02D5DA99F8FA1 08BA47996E85076A4B7A70E9B5B32944DB75092EC4192623AD6EA6B049A7DF7D 9CEE60B88FEDB266ECAA8C71699A17FF5664526CC2B19EE1193602A575094C29 A0591340E4183A3E3F54989A5B429D656B8FE4D699F73FD6A1D29C07EFE830F5 4D2D38E6F0255DC14CDD20868470EB266382E9C6021ECC5E09686B3F3EBAEFC9 3C9718146B6A70A1687F358452A0E286B79C5305AA5007373E07841C7FDEAE5C 8E7D44EC5716F2B8B03ADA37F0500C0DF01C1F040200B3FFAE0CF51A3CB574B2 25837A58DC0921BDD19113F97CA92FF69432477322F547013AE5E58137C2DADC C8B576349AF3DDA7A94461460FD0030EECC8C73EA4751E41E238CD993BEA0E2F
Prasetyo Bawono, S.Si Universitas Sebelas Maret
49
3280BBA1183EB3314E548B384F6DB9086F420D03F60A04BF2CB8129024977C79 5679B072BCAF89AFDE9A771FD9930810B38BAE12DCCF3F2E5512721F2E6B7124 501ADDE69F84CD877A5847187408DA17BC9F9ABCE94B7D8CEC7AEC3ADB851DFA 63094366C464C3D2EF1C18473215D908DD433B3724C2BA1612A14D432A65C451 50940002133AE4DD71DFF89E10314E5581AC77D65F11199B043556F1D7A3C76B 3C11183B5924A509F28FE6ED97F1FBFA9EBABF2C1E153C6E86E34570EAE96FB1 860E5E0A5A3E2AB3771FE71C4E3D06FA2965DCB999E71D0F803E89D65266C825 2E4CC9789C10B36AC6150EBA94E2EA78A5FC3C531E0A2DF4F2F74EA7361D2B3D 1939260F19C279605223A708F71312B6EBADFE6EEAC31F66E3BC4595A67BC883 B17F37D1018CFF28C332DDEFBE6C5AA56558218568AB9802EECEA50FDB2F953B 2AEF7DAD5B6E2F841521B62829076170ECDD4775619F151013CCA830EB61BD96 0334FE1EAA0363CFB5735C904C70A239D59E9E0BCBAADE14EECC86BC60622CA7 9CAB5CABB2F3846E648B1EAF19BDF0CAA02369B9655ABB5040685A323C2AB4B3 319EE9D5C021B8F79B540B19875FA09995F7997E623D7DA8F837889A97E32D77 11ED935F166812810E358829C7E61FD696DEDFA17858BA9957F584A51B227263 9B83C3FF1AC24696CDB30AEB532E30548FD948E46DBC312858EBF2EF34C6FFEA FE28ED61EE7C3C735D4A14D9E864B7E342105D14203E13E045EEE2B6A3AAABEA DB6C4F15FACB4FD0C742F442EF6ABBB5654F3B1D41CD2105D81E799E86854DC7 E44B476A3D816250CF62A1F25B8D2646FC8883A0C1C7B6A37F1524C369CB7492 47848A0B5692B285095BBF00AD19489D1462B17423820E0058428D2A0C55F5EA 1DADF43E233F70613372F0928D937E41D65FECF16C223BDB7CDE3759CBEE7460 4085F2A7CE77326EA607808419F8509EE8EFD85561D99735A969A7AAC50C06C2 5A04ABFC800BCADC9E447A2EC3453484FDD567050E1E9EC9DB73DBD3105588CD 675FDA79E3674340C5C43465713E38D83D28F89EF16DFF20153E21E78FB03D4A E6E39F2BDB83ADF7E93D5A68948140F7F64C261C94692934411520F77602D4F7 BCF46B2ED4A20068D40824713320F46A43B7D4B7500061AF1E39F62E97244546 14214F74BF8B88404D95FC1D96B591AF70F4DDD366A02F45BFBC09EC03BD9785 7FAC6DD031CB850496EB27B355FD3941DA2547E6ABCA0A9A28507825530429F4 0A2C86DAE9B66DFB68DC1462D7486900680EC0A427A18DEE4F3FFEA2E887AD8C B58CE0067AF4D6B6AACE1E7CD3375FECCE78A399406B2A4220FE9E35D9F385B9 EE39D7AB3B124E8B1DC9FAF74B6D185626A36631EAE397B23A6EFA74DD5B4332 6841E7F7CA7820FBFB0AF54ED8FEB397454056ACBA48952755533A3A20838D87 FE6BA9B7D096954B55A867BCA1159A58CCA9296399E1DB33A62A4A563F3125F9 5EF47E1C9029317CFDF8E80204272F7080BB155C05282CE395C11548E4C66D22 48C1133FC70F86DC07F9C9EE41041F0F404779A45D886E17325F51EBD59BC0D1 F2BCC18F41113564257B7834602A9C60DFF8E8A31F636C1B0E12B4C202E1329E AF664FD1CAD181156B2395E0333E92E13B240B62EEBEB92285B2A20EE6BA0D99 DE720C8C2DA2F728D012784595B794FD647D0862E7CCF5F05449A36F877D48FA C39DFD27F33E8D1E0A476341992EFF743A6F6EABF4F8FD37A812DC60A1EBDDF8 991BE14CDB6E6B0DC67B55106D672C372765D43BDCD0E804F1290DC7CC00FFA3 B5390F92690FED0B667B9FFBCEDB7D9CA091CF0BD9155EA3BB132F88515BAD24 7B9479BF763BD6EB37392EB3CC1159798026E297F42E312D6842ADA7C66A2B3B 12754CCC782EF11C6A124237B79251E706A1BBE64BFB63501A6B101811CAEDFA 3D25BDD8E2E1C3C9444216590A121386D90CEC6ED5ABEA2A64AF674EDA86A85F BEBFE98864E4C3FE9DBC8057F0F7C08660787BF86003604DD1FD8346F6381FB0 7745AE04D736FCCC83426B33F01EAB71B08041873C005E5F77A057BEBDE8AE24 55464299BF582E614E58F48FF2DDFDA2F474EF388789BDC25366F9C3C8B38E74 B475F25546FCD9B97AEB26618B1DDF84846A0E79915F95E2466E598E20B45770
Prasetyo Bawono, S.Si Universitas Sebelas Maret
50
8CD55591C902DE4CB90BACE1BB8205D011A862487574A99EB77F19B6E0A9DC09 662D09A1C4324633E85A1F0209F0BE8C4A99A0251D6EFE101AB93D1D0BA5A4DF A186F20F2868F169DCB7DA83573906FEA1E2CE9B4FCD7F5250115E01A70683FA A002B5C40DE6D0279AF88C27773F8641C3604C0661A806B5F0177A28C0F586E0 006058AA30DC7D6211E69ED72338EA6353C2DD94C2C21634BBCBEE5690BCB6DE EBFC7DA1CE591D766F05E4094B7C018839720A3D7C927C2486E3725F724D9DB9 1AC15BB4D39EB8FCED54557808FCA5B5D83D7CD34DAD0FC41E50EF5EB161E6F8 A28514D96C51133C6FD5C7E756E14EC4362ABFCEDDC6C837D79A323492638212 670EFA8E406000E03A39CE37D3FAF5CFABC277375AC52D1B5CB0679E4FA33742 D382274099BC9BBED5118E9DBF0F7315D62D1C7EC700C47BB78C1B6B21A19045 B26EB1BE6A366EB45748AB2FBC946E79C6A376D26549C2C8530FF8EE468DDE7D D5730A1D4CD04DC62939BBDBA9BA4650AC9526E8BE5EE304A1FAD5F06A2D519A 63EF8CE29A86EE22C089C2B843242EF6A51E03AA9CF2D0A483C061BA9BE96A4D 8FE51550BA645BD62826A2F9A73A3AE14BA99586EF5562E9C72FEFD3F752F7DA 3F046F6977FA0A5980E4A91587B086019B09E6AD3B3EE593E990FD5A9E34D797 2CF0B7D9022B8B5196D5AC3A017DA67DD1CF3ED67C7D2D281F9F25CFADF2B89B 5AD6B4725A88F54CE029AC71E019A5E647B0ACFDED93FA9BE8D3C48D283B57CC F8D5662979132E28785F0191ED756055F7960E44E3D35E8C15056DD488F46DBA 03A161250564F0BDC3EB9E153C9057A297271AECA93A072A1B3F6D9B1E6321F5 F59C66FB26DCF3197533D928B155FDF5035634828ABA3CBB28517711C20AD9F8 ABCC5167CCAD925F4DE817513830DC8E379D58629320F991EA7A90C2FB3E7BCE 5121CE64774FBE32A8B6E37EC3293D4648DE53696413E680A2AE0810DD6DB224 69852DFD09072166B39A460A6445C0DD586CDECF1C20C8AE5BBEF7DD1B588D40 CCD2017F6BB4E3BBDDA26A7E3A59FF453E350A44BCB4CDD572EACEA8FA6484BB 8D6612AEBF3C6F47D29BE463542F5D9EAEC2771BF64E6370740E0D8DE75B1357 F8721671AF537D5D4040CB084EB4E2CC34D2466A0115AF84E1B0042895983A1D 06B89FB4CE6EA0486F3F3B823520AB82011A1D4B277227F8611560B1E7933FDC BB3A792B344525BDA08839E151CE794B2F32C9B7A01FBAC9E01CC87EBCC7D1F6 CF0111C3A1E8AAC71A908749D44FBD9AD0DADECBD50ADA380339C32AC6913667 8DF9317CE0B12B4FF79E59B743F5BB3AF2D519FF27D9459CBF97222C15E6FC2A 0F91FC719B941525FAE59361CEB69CEBC2A8645912BAA8D1B6C1075EE3056A0C 10D25065CB03A442E0EC6E0E1698DB3B4C98A0BE3278E9649F1F9532E0D392DF D3A0342B8971F21E1B0A74414BA3348CC5BE7120C37632D8DF359F8D9B992F2E E60B6F470FE3F11DE54CDA541EDAD891CE6279CFCD3E7E6F1618B166FD2C1D05 848FD2C5F6FB2299F523F357A632762393A8353156CCCD02ACF081625A75EBB5 6E16369788D273CCDE96629281B949D04C50901B71C65614E6C6C7BD327A140A 45E1D006C3F27B9AC9AA53FD62A80F00BB25BFE235BDD2F671126905B2040222 B6CBCF7CCD769C2B53113EC01640E3D338ABBD602547ADF0BA38209CF746CE76 77AFA1C52075606085CBFE4E8AE88DD87AAAF9B04CF9AA7E1948C25C02FB8A8C 01C36AE4D6EBE1F990D4F869A65CDEA03F09252DC208E69FB74E6132CE77E25B 578FDFE33AC372E6
Prasetyo Bawono, S.Si Universitas Sebelas Maret
51
2.
Lampiran 2 : Form Login (LoginForm.java)
/* * LoginForm.java * * *
host="localhost"; dataBaseName="fugu";
* *
password="bismillah"; userId="nixnux";
* * @ Prasetyo Bawono * @
[email protected] * nb: Semua konstruktor swing tidak disertakan. * Full Source: http://ono.web.id/fugu * Created on Apr 15, 2009, 8:30:05 AM */ package fugu; import java.awt.Dimension; import java.awt.Toolkit; import java.sql.SQLException; import javax.swing.JOptionPane; import fugu.dbase.*; /** * * @author prasetyo bawono */ public class LoginForm extends javax.swing.JDialog { /** Creates new form LoginForm */ public LoginForm(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); Dimension
screenSize
=
Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = this.getSize(); if (frameSize.height > screenSize.height){ frameSize.height = screenSize.height; } if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width; } this.setLocation((screenSize.width (screenSize.height - frameSize.height) / 2);
Prasetyo Bawono, S.Si Universitas Sebelas Maret
-
frameSize.width)
/
2,
52
this.setTitle("Login Form"); } private
void
btn_cancelActionPerformed(java.awt.event.ActionEvent
evt) {//GEN-FIRST:event_btn_cancelActionPerformed FuguApp.getApplication().ShowMainMenu(); FuguApp.getInstanceMainMenu().setAuthentication(false); this.dispose(); }//GEN-LAST:event_btn_cancelActionPerformed private void btn_goActionPerformed(java.awt.event.ActionEvent {//GEN-FIRST:event_btn_goActionPerformed
evt)
try{ Login(); } catch(SQLException sqle) { System.err.println(sqle); } }//GEN-LAST:event_btn_goActionPerformed /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { LoginForm javax.swing.JFrame(), true);
dialog
=
new
LoginForm(new
dialog.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } }); dialog.setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btn_cancel; private javax.swing.JButton btn_go; private javax.swing.JLabel fugu; private javax.swing.JLabel iduser; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3;
Prasetyo Bawono, S.Si Universitas Sebelas Maret
53
private javax.swing.JLabel jLabel4; private javax.swing.JSeparator jSeparator1; private javax.swing.JSeparator jSeparator2; private javax.swing.JLabel password; private javax.swing.JTextField txt_id_user; private javax.swing.JPasswordField txt_pass; // End of variables declaration//GEN-END:variables private void Login() throws SQLException{ DBQuery q1 = new DBQuery(FuguApp.getConnection()); String strSql ="select * from tbl_user where user_id = '" + txt_id_user.getText() +"' AND pass_id = ('" + String.copyValueOf(txt_pass.getPassword(),0, txt_pass.getPassword().length) + "')"; q1.setStrSql(strSql); q1.makeActive(true); if(q1.getRowCount()>0){ FuguApp.getInstanceMainMenu().setAuthentication(true); FuguApp.getApplication().ShowMainMenu(); this.dispose(); } else { JOptionPane.showMessageDialog(LoginForm.this, Password Salah Bro !", "ERROR", JOptionPane.ERROR_MESSAGE); } } }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
"Username
dan
54
3.
Lampiran 3 : Form Utama (FuguView.java)
/* * FuguView.java * Menu Utama * @ Prasetyo Bawono * @
[email protected] * nb: Semua konstruktor swing tidak disertakan. * Full Source: http://ono.web.id/fugu */ package fugu; import fugu.mode.BlowfishDec; import fugu.mode.BlowfishEnc; import org.jdesktop.application.Action; import org.jdesktop.application.SingleFrameApplication; import org.jdesktop.application.FrameView; import javax.swing.JDialog; import javax.swing.JFrame; /** * The application's main frame. */ public class FuguView extends FrameView { public FuguView(SingleFrameApplication app) { super(app); initComponents(); } @Action public void showAboutBox() { if (aboutBox == null) { JFrame mainFrame = FuguApp.getApplication().getMainFrame(); aboutBox = new FuguAboutBox(mainFrame); aboutBox.setLocationRelativeTo(mainFrame); } FuguApp.getApplication().show(aboutBox); } private void mn_logoutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mn_logoutActionPerformed setAuthentication(false); }//GEN-LAST:event_mn_logoutActionPerformed
Prasetyo Bawono, S.Si Universitas Sebelas Maret
55
private void mn_loginActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mn_loginActionPerformed mn_logoutActionPerformed(evt); new LoginForm(new javax.swing.JFrame(),true).setVisible(true); }//GEN-LAST:event_mn_loginActionPerformed private
void
menuNotepadDecryptActionPerformed(java.awt.event.ActionEvent evt) {//GENFIRST:event_menuNotepadDecryptActionPerformed // TODO add your handling code here: setEnc(true); new BlowfishDec(new javax.swing.JFrame(),true).setVisible(true); }//GEN-LAST:event_menuNotepadDecryptActionPerformed private
void
menuNotepadEncryptActionPerformed(java.awt.event.ActionEvent evt) {//GENFIRST:event_menuNotepadEncryptActionPerformed // TODO add your handling code here: setEnc(true); new BlowfishEnc(new javax.swing.JFrame(),true).setVisible(true); }//GEN-LAST:event_menuNotepadEncryptActionPerformed private
void
btnEncModeActionPerformed(java.awt.event.ActionEvent
evt) {//GEN-FIRST:event_btnEncModeActionPerformed // TODO add your handling code here: setEnc(true); new BlowfishEnc(new javax.swing.JFrame(),true).setVisible(true); }//GEN-LAST:event_btnEncModeActionPerformed private void btnDecModeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDecModeActionPerformed // TODO add your handling code here: setEnc(true); new BlowfishDec(new javax.swing.JFrame(),true).setVisible(true); }//GEN-LAST:event_btnDecModeActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnDecMode; private javax.swing.JButton btnEncMode; private javax.swing.JMenu fileMenu; private javax.swing.JMenu helpMenu; private javax.swing.JLabel jLabel1; private javax.swing.JMenu jMenu1; private javax.swing.JLabel lblChoose; private javax.swing.JLabel lblExit; private javax.swing.JLabel lblLogout; private javax.swing.JPanel mainPanel;
Prasetyo Bawono, S.Si Universitas Sebelas Maret
56
private javax.swing.JMenuBar menuBar; private javax.swing.JMenuItem menuNotepadDecrypt; private javax.swing.JMenuItem menuNotepadEncrypt; private javax.swing.JMenuItem mn_login; private javax.swing.JMenuItem mn_logout; private javax.swing.JLabel statusAnimationLabel; private javax.swing.JLabel statusMessageLabel; private javax.swing.JPanel statusPanel; private javax.swing.JMenu systemMenu; // End of variables declaration//GEN-END:variables //
private final Timer messageTimer;
// //
private final Timer busyIconTimer; private final Icon idleIcon;
// //
private final Icon[] busyIcons = new Icon[15]; private int busyIconIndex = 0; private JDialog aboutBox; public void setAuthentication(boolean value){ fileMenu.setEnabled(value); helpMenu.setEnabled(value); if(value==true){ mn_login.setEnabled(false); mn_logout.setEnabled(true); btnEncMode.setEnabled(true); btnDecMode.setEnabled(true); } else{ mn_login.setEnabled(true); mn_logout.setEnabled(false); btnEncMode.setEnabled(false); btnDecMode.setEnabled(false); } } public void setEnc(boolean value){ if(value==true){ mn_enc.setEnabled(false);
// //
mn_dec.setEnabled(false); } else{ fileMenu.setEnabled(true); helpMenu.setEnabled(true); } }
}
Prasetyo Bawono, S.Si Universitas Sebelas Maret
57
4.
Lampiran 4 : Form Enkripsi (BlowfishEnc.java)
/* * BlowfishEnc.java * @ Prasetyo Bawono * @
[email protected] * nb: Semua konstruktor swing tidak disertakan. * Full Source: http://ono.web.id/fugu */ package fugu.mode; import fugu.FuguApp; import java.awt.Color; import java.awt.Dimension; import java.awt.Toolkit; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.InputStreamReader; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.filechooser.FileNameExtensionFilter; import org.jdesktop.application.Application; import org.jdesktop.application.ResourceMap; /** * * @author prasetyo bawono */ public class BlowfishEnc extends javax.swing.JDialog { final static int TESTBUFSIZE = 100000; final static int TESTLOOPS = 10000; /** Creates new form Encryption */ public BlowfishEnc(java.awt.Frame parent, boolean modal){ super(parent, modal); initComponents(); Dimension screenSize Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = this.getSize();
Prasetyo Bawono, S.Si Universitas Sebelas Maret
=
58
if (frameSize.height > screenSize.height){ frameSize.height = screenSize.height; } if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width; } this.setLocation((screenSize.width
-
frameSize.width)
/
2,
(screenSize.height - frameSize.height) / 2); this.setTitle("Encryption Mode"); // Define Clickable textAreaPlain.setEnabled(false); ResourceMap resourceMap
=
Application.getInstance(fugu.FuguApp.class).getContext().getResourceMap(B lowfishEnc.class); textAreaPlain.setBackground(resourceMap.getColor("textAreaCipher.backgrou nd")); btnNewPlainText.setEnabled(true); btnSavePlainText.setEnabled(false); btnOpenPlainText.setEnabled(false); btnEncryptPlainText.setEnabled(false); btnSaveCipherText.setEnabled(false); btnResetPrivKey.setEnabled(false); txtPassword.setEnabled(false); btnNewPlainText.requestFocus(); } private void btnNewPlainTextActionPerformed(java.awt.event.ActionEvent evt) {//GENFIRST:event_btnNewPlainTextActionPerformed // TODO add your handling code here: if (evt.getSource() == this.btnNewPlainText){ // Define Clickable textAreaPlain.setEnabled(true); textAreaPlain.setBackground(Color.WHITE); btnNewPlainText.setEnabled(false); btnSavePlainText.setEnabled(true); btnOpenPlainText.setEnabled(true); btnEncryptPlainText.setEnabled(true); btnResetPrivKey.setEnabled(true); txtPassword.setEnabled(true);
Prasetyo Bawono, S.Si Universitas Sebelas Maret
59
//
setAuthPlainText(true); this.textAreaPlain.setText(""); this.textAreaCipher.setText(""); this.txtPassword.setText(""); this.tfBenchmark.setText(""); this.tfCipherSize.setText(""); } }//GEN-LAST:event_btnNewPlainTextActionPerformed private
void
btnSavePlainTextActionPerformed(java.awt.event.ActionEvent FIRST:event_btnSavePlainTextActionPerformed
evt)
{//GEN-
if (evt.getSource() == this.btnSavePlainText){ JFileChooser savePlainText = new JFileChooser(); FileNameExtensionFilter filter = FileNameExtensionFilter("Text Documents (*.txt)", "txt", "java");
new
savePlainText.setFileFilter(filter); savePlainText.setDialogTitle("Save PlainText to File"); int option = savePlainText.showSaveDialog(this); // Jika OK if (option == JFileChooser.APPROVE_OPTION){ try { // Buat buffered writer untuk menulis BufferedWriter out = new BufferedWriter(new FileWriter(savePlainText.getSelectedFile().getPath())); // BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(savePlainText.getSelectedFile().getPath()),"UTF-8")); out.write(this.textAreaPlain.getText()); out.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); } JOptionPane.showMessageDialog(null,
"Sukses
File "+savePlainText.getSelectedFile().getName()+"\nLokasi "+savePlainText.getSelectedFile(),"PlainText
Menyimpan File: Saved!",
JOptionPane.INFORMATION_MESSAGE); } else JOptionPane.showMessageDialog(null, "Something Happened?", "Gagal Menyimpan File", JOptionPane.ERROR_MESSAGE); } }//GEN-LAST:event_btnSavePlainTextActionPerformed private menuNotepadQuitActionPerformed(java.awt.event.ActionEvent FIRST:event_menuNotepadQuitActionPerformed // TODO add your handling code here:
Prasetyo Bawono, S.Si Universitas Sebelas Maret
evt)
void {//GEN-
60
FuguApp.getApplication().ShowMainMenu(); FuguApp.getInstanceMainMenu().setAuthentication(true); this.dispose(); }//GEN-LAST:event_menuNotepadQuitActionPerformed private
void
btnOpenPlainTextActionPerformed(java.awt.event.ActionEvent FIRST:event_btnOpenPlainTextActionPerformed
evt)
{//GEN-
JFileChooser openPlainText = new JFileChooser(); openPlainText.setFileSelectionMode(JFileChooser.FILES_ONLY); openPlainText.setDialogTitle("Open Plain Text File(s)"); FileNameExtensionFilter filterFile = FileNameExtensionFilter("Text Documents (*.txt)", "txt", "java");
new
openPlainText.setFileFilter(filterFile); try { if (openPlainText.showOpenDialog(this)==JFileChooser.APPROVE_OPTION) { File openPlainText.getSelectedFile();
selectedFile
=
if(selectedFile.canRead() && selectedFile.exists()){ FileInputStream fis =
new
FileInputStream(selectedFile); InputStreamReader in= new InputStreamReader(fis); char[] buffer
= new char[4194304]; // 4Mb
buffer int n String plainText
= in.read(buffer); = new String(buffer,0,n);
textAreaPlain.setText(plainText); long sizePlain String s
= selectedFile.length(); = String.valueOf(sizePlain);
tfPlainSize.setText(s); in.close(); } } } catch (Exception e) { e.printStackTrace(); } }//GEN-LAST:event_btnOpenPlainTextActionPerformed private btnResetPrivKeyActionPerformed(java.awt.event.ActionEvent FIRST:event_btnResetPrivKeyActionPerformed // TODO add your handling code here: if (evt.getSource() == this.btnResetPrivKey) this.txtPassword.setText(""); }//GEN-LAST:event_btnResetPrivKeyActionPerformed
Prasetyo Bawono, S.Si Universitas Sebelas Maret
void evt)
{//GEN-
61
private
void
btnEncryptPlainTextActionPerformed(java.awt.event.ActionEvent {//GEN-FIRST:event_btnEncryptPlainTextActionPerformed
evt)
//
Encrypt:
// //
======== Plain(String) -> Plain(String->Byte Array[]) -> Cipher(Byte
Array[]->String) -> Cipher(String)
long charCount
= textAreaPlain.getText().length();
String s = String.valueOf(charCount); tfPlainSize.setText(s); if (evt.getSource()==this.btnEncryptPlainText) { if (textAreaPlain.getText().length()>0) { if(txtPassword.getPassword().length==0){ try { JOptionPane.showMessageDialog(null, "Private key tidak boleh kosong!", "Error Message", JOptionPane.ERROR_MESSAGE); btnResetPrivKey.setEnabled(true); txtPassword.setEnabled(true); txtPassword.requestFocus(); } catch (IllegalArgumentException e) { System.err.print(e); } } if(txtPassword.getPassword().length<8 txtPassword.getPassword().length>0){
&&
try { JOptionPane.showMessageDialog(null, key minimal 8 karakter", "Error", JOptionPane.ERROR_MESSAGE); btnResetPrivKey.setEnabled(true); txtPassword.setEnabled(true); txtPassword.requestFocus(); } catch (Exception e) { System.err.print(e); } } if (txtPassword.getPassword().length>=8) { Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); String textPlainStr = textAreaPlain.getText(); char[] textPassword = txtPassword.getPassword();
Prasetyo Bawono, S.Si Universitas Sebelas Maret
"Private
62
byte[] textPlainStrByte = textPlainStr.getBytes(); byte[] textPasswordByte =
(new
String(textPassword)).getBytes(); // ECB MODE if (rbECB.isSelected()) { try { long ecbStart; long ecbEnd; long ecbTime; ecbStart = System.currentTimeMillis(); SecretKeySpec key = SecretKeySpec(textPasswordByte, "Blowfish"); Cipher
cipher
new =
Cipher.getInstance("Blowfish/ECB/PKCS5Padding","BC"); // Encryption cipher.init(Cipher.ENCRYPT_MODE, key); byte[] cipher.doFinal(textPlainStrByte);
cipherText
int cipher.update(textPlainStrByte, 0);
=
ctLength 0,
textPlainStrByte.length,
ctLength
+=
= cipherText,
cipher.doFinal(cipherText,
ctLength); textAreaCipher.setText(new String(cipherText)); String
ctLengthStr
=
Integer.toString(ctLength); tfCipherSize.setText(ctLengthStr); // Benchmark for performance ecbEnd = System.currentTimeMillis(); Encryption processing time (ms) ecbTime = (ecbEnd - ecbStart);
//
// nano to
milli String b 9223372036854775807 9223372036854775807
= String.valueOf(ecbTime);
tfBenchmark.setText(b); } catch (Exception e) { System.err.println(e); } } // CBC MODE
Prasetyo Bawono, S.Si Universitas Sebelas Maret
//
63
if (rbCBC.isSelected()){ try { long cbcStart; long cbcEnd; long cbcTime; // Inisialization Vector byte[] ivBytes
= new byte[]{ 0x07, 0x06,
0x05,
0x04,
0x03, 0x02, 0x01, 0x00 }; // Define Algorithm and Mode cbcStart = System.currentTimeMillis(); SecretKeySpec key = SecretKeySpec(textPasswordByte, "Blowfish"); IvParameterSpec
ivSpec
=
new new
IvParameterSpec(ivBytes); Cipher
cipher
=
Cipher.getInstance("Blowfish/CBC/PKCS5Padding", "BC"); // Encryption cipher.init(Cipher.ENCRYPT_MODE,
key,
ivSpec); byte[]
cipherText
=
cipher.doFinal(textPlainStrByte); int cipher.update(textPlainStrByte,
0,
ctLength textPlainStrByte.length,
= cipherText,
0); ctLength
+=
cipher.doFinal(cipherText,
ctLength); textAreaCipher.setText(new String(cipherText)); String
ctLengthStr
=
Integer.toString(ctLength); tfCipherSize.setText(ctLengthStr); // Benchmark for performance cbcEnd = System.currentTimeMillis();
//
Encryption processing time (ms) cbcTime = (cbcEnd - cbcStart); String b 9223372036854775807 9223372036854775807
= String.valueOf(cbcTime);
tfBenchmark.setText(b); } catch (Exception e) { System.err.println(e); }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
//
64
} // OFB MODE if (rbOFB.isSelected()){ try { long ofbStart; long ofbEnd; long ofbTime; // Initialization Vector IV byte[] ivBytes = new byte[]{ 0x07,
0x06,
0x05,
0x04,
0x03, 0x02, 0x01, 0x00 }; // Define Algorithm ofbStart = System.currentTimeMillis(); SecretKeySpec key SecretKeySpec(textPasswordByte, "Blowfish"); IvParameterSpec
= ivSpec
=
new new
IvParameterSpec(ivBytes); Cipher cipher Cipher.getInstance("Blowfish/OFB/NoPadding", "BC");
=
// Encryption cipher.init(Cipher.ENCRYPT_MODE,
key,
ivSpec); byte[] cipher.doFinal(textPlainStrByte);
cipherText
int cipher.update(textPlainStrByte, 0);
=
ctLength 0,
textPlainStrByte.length,
ctLength
+=
= cipherText,
cipher.doFinal(cipherText,
ctLength); textAreaCipher.setText(new String(cipherText)); String
ctLengthStr
=
Integer.toString(ctLength); tfCipherSize.setText(ctLengthStr); // Benchmark for performance ofbEnd = System.currentTimeMillis();
//
Encryption processing time (ms) ofbTime = (ofbEnd - ofbStart); String b 9223372036854775807 9223372036854775807
= String.valueOf(ofbTime);
tfBenchmark.setText(b);
Prasetyo Bawono, S.Si Universitas Sebelas Maret
//
65
} catch (Exception e) { System.err.println(e); } } // CFB MODE if (rbCFB.isSelected()){ try { long cfbStart; long cfbEnd; long cfbTime; // Initialization Vector IV byte[] ivBytes
= new byte[]{ 0x07, 0x06,
0x05,
0x04,
0x03, 0x02, 0x01, 0x00 }; // Define Algorithm cfbStart = System.currentTimeMillis(); SecretKeySpec key = SecretKeySpec(textPasswordByte, "Blowfish"); IvParameterSpec
ivSpec
=
new new
IvParameterSpec(ivBytes); Cipher
cipher
=
Cipher.getInstance("Blowfish/CFB/NoPadding", "BC"); // Encryption cipher.init(Cipher.ENCRYPT_MODE,
key,
ivSpec); byte[]
cipherText
=
cipher.doFinal(textPlainStrByte); int cipher.update(textPlainStrByte,
0,
ctLength textPlainStrByte.length,
= cipherText,
0); ctLength
+=
cipher.doFinal(cipherText,
ctLength); textAreaCipher.setText(new String(cipherText)); String
ctLengthStr
=
Integer.toString(ctLength); tfCipherSize.setText(ctLengthStr); // Benchmark for performance cfbEnd = System.currentTimeMillis(); Encryption processing time (ms) cfbTime = (cfbEnd - cfbStart);
Prasetyo Bawono, S.Si Universitas Sebelas Maret
//
66
String b 9223372036854775807 9223372036854775807
= String.valueOf(cfbTime);
//
tfBenchmark.setText(b); } catch (Exception e) { System.err.println(e); } } JOptionPane.showMessageDialog(null, "Enkripsi Berhasil..", "Encryption Successfully", JOptionPane.INFORMATION_MESSAGE); btnResetPrivKey.setEnabled(false); txtPassword.setEnabled(false); } } else { JOptionPane.showMessageDialog(null,
"Plainteks
tidak
boleh kosong", "Error Message", JOptionPane.ERROR_MESSAGE); } } btnNewPlainText.setEnabled(true); btnSavePlainText.setEnabled(false); btnOpenPlainText.setEnabled(false); btnEncryptPlainText.setEnabled(false); btnSaveCipherText.setEnabled(true); btnSaveCipherText.requestFocus(); }//GEN-LAST:event_btnEncryptPlainTextActionPerformed private void btnSaveCipherTextActionPerformed(java.awt.event.ActionEvent evt) {//GENFIRST:event_btnSaveCipherTextActionPerformed if (evt.getSource() == this.btnSaveCipherText){ JFileChooser saveCipherText = new JFileChooser(); FileNameExtensionFilter filter =
new
FileNameExtensionFilter("CipherText File (*.cip)", "cip"); saveCipherText.setFileFilter(filter); saveCipherText.setDialogTitle("Save CipherText to File"); int option = saveCipherText.showSaveDialog(this); // Jika OK if (option == JFileChooser.APPROVE_OPTION){ try { // Buat buffered writer untuk menulis BufferedWriter outs = new BufferedWriter(new FileWriter(saveCipherText.getSelectedFile().getPath())); // OutputStreamWriter(new
BufferedWriter outs = new BufferedWriter(new
FileOutputStream(saveCipherText.getSelectedFile().getPath()),"ASCII")); outs.write(this.textAreaCipher.getText());
Prasetyo Bawono, S.Si Universitas Sebelas Maret
67
outs.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); } JOptionPane.showMessageDialog(null, "Sukses Menyimpan "+saveCipherText.getSelectedFile().getName()+"\nLokasi File:
File
"+saveCipherText.getSelectedFile(),"CipherText JOptionPane.INFORMATION_MESSAGE);
Saved!",
} else JOptionPane.showMessageDialog(null, "Something Happened?", "Gagal Menyimpan File", JOptionPane.ERROR_MESSAGE); } }//GEN-LAST:event_btnSaveCipherTextActionPerformed /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { BlowfishEnc dialog
=
new
BlowfishEnc(new
javax.swing.JFrame(), true); dialog.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } }); dialog.setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnEncryptPlainText; private javax.swing.JButton btnNewPlainText; private javax.swing.JButton btnOpenPlainText; private javax.swing.JButton btnResetPrivKey; private javax.swing.JButton btnSaveCipherText; private javax.swing.JButton btnSavePlainText; private javax.swing.ButtonGroup buttonGroup1; private javax.swing.JLabel fugu; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4;
Prasetyo Bawono, S.Si Universitas Sebelas Maret
68
private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JLabel lblEncryption; private javax.swing.JLabel lblOpenFile; private javax.swing.JLabel lblPrivKey; private javax.swing.JLabel lblPrivateKey; private javax.swing.JLabel lblSaveTo; private javax.swing.JMenu menuNotepadFile; private javax.swing.JMenuItem menuNotepadQuit; private javax.swing.JPanel panelCipherText; private javax.swing.JPanel panelPlainText; private javax.swing.JRadioButton rbCBC; private javax.swing.JRadioButton rbCFB; private javax.swing.JRadioButton rbECB; private javax.swing.JRadioButton rbOFB; private javax.swing.JTextArea textAreaCipher; private javax.swing.JTextArea textAreaPlain; private javax.swing.JTextField tfBenchmark; private javax.swing.JTextField tfCipherSize; private javax.swing.JTextField tfPlainSize; private javax.swing.JPasswordField txtPassword; // End of variables declaration//GEN-END:variables public void setAuthPlainText(boolean value){ textAreaPlain.setEnabled(value); if(value==false){ btnNewPlainText.setEnabled(true); btnSavePlainText.setEnabled(false); btnOpenPlainText.setEnabled(true); btnEncryptPlainText.setEnabled(false); } else{ btnSavePlainText.setEnabled(true); btnEncryptPlainText.setEnabled(true); } } }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
69
5.
Lampiran 5 : Form Dekripsi (BlowfishDec.java)
/* * BlowfishEnc.java * @ Prasetyo Bawono * @
[email protected] * nb: Semua konstruktor swing tidak disertakan. * Full Source: http://ono.web.id/fugu * Created on Apr 15, 2009, 8:30:05 AM */ package fugu.mode; import fugu.FuguApp; import java.awt.Color; import java.awt.Dimension; import java.awt.Toolkit; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.InputStreamReader; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.filechooser.FileNameExtensionFilter; import org.jdesktop.application.Application; import org.jdesktop.application.ResourceMap; /** * * @author prasetyo bawono */ public class BlowfishDec extends javax.swing.JDialog { /** Creates new form Encryption */ public BlowfishDec(java.awt.Frame parent, boolean modal){ super(parent, modal); initComponents(); Dimension
screenSize
Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = this.getSize();
Prasetyo Bawono, S.Si Universitas Sebelas Maret
=
70
if (frameSize.height > screenSize.height){ frameSize.height = screenSize.height; } if (frameSize.width > screenSize.width) { frameSize.width = screenSize.width; } this.setLocation((screenSize.width
-
frameSize.width)
/
2,
(screenSize.height - frameSize.height) / 2); this.setTitle("Decryption Mode"); // Define Clickable textAreaPlain.setEnabled(false); ResourceMap resourceMap
=
Application.getInstance(fugu.FuguApp.class).getContext().getResourceMap(B lowfishEnc.class); textAreaPlain.setBackground(resourceMap.getColor("textAreaCipher.backgrou nd")); txtPassword.setEnabled(false); btnResetPrivKey.setEnabled(false); btnResetCipherText.setEnabled(false); btnSaveCipherText.setEnabled(false); btnOpenCipherText.setEnabled(true); btnDecryptPlainText.setEnabled(false); btnSavePlainText.setEnabled(false); btnOpenCipherText.requestFocus(); } private void btnResetCipherTextActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: if (evt.getSource() == this.btnResetCipherText) this.textAreaCipher.setText(""); this.textAreaPlain.setText(""); this.txtPassword.setText(""); btnResetCipherText.setEnabled(false); btnSaveCipherText.setEnabled(false); btnOpenCipherText.setEnabled(true); btnDecryptPlainText.setEnabled(false); txtPassword.setEnabled(false); btnResetPrivKey.setEnabled(false); btnSavePlainText.setEnabled(false); textAreaPlain.setEnabled(false);
Prasetyo Bawono, S.Si Universitas Sebelas Maret
71
} private
void
btnSaveCipherTextActionPerformed(java.awt.event.ActionEvent evt) {//GENFIRST:event_btnSaveCipherTextActionPerformed // TODO add your handling code here: if (evt.getSource() == this.btnSaveCipherText){ JFileChooser saveCipherText = new JFileChooser(); FileNameExtensionFilter filter =
new
FileNameExtensionFilter(".cip CipherText File", "cip", "CIP"); saveCipherText.setFileFilter(filter); saveCipherText.setDialogTitle("Save as CipherText"); int option = saveCipherText.showSaveDialog(this); // Jika OK if (option == JFileChooser.APPROVE_OPTION){ try { // Buat buffered writer untuk menulis BufferedWriter out = new BufferedWriter(new FileWriter(saveCipherText.getSelectedFile().getPath())); out.write(this.textAreaCipher.getText()); out.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); } JOptionPane.showMessageDialog(null,
"Sukses
File "+saveCipherText.getSelectedFile().getName()+"\nLokasi "+saveCipherText.getSelectedFile(),"CipherText
Menyimpan File: Saved!",
JOptionPane.INFORMATION_MESSAGE); } else JOptionPane.showMessageDialog(null, "Something Happened?", "Gagal Menyimpan File", JOptionPane.ERROR_MESSAGE); } }//GEN-LAST:event_btnSaveCipherTextActionPerformed private menuNotepadQuitActionPerformed(java.awt.event.ActionEvent
evt)
void {//GEN-
FIRST:event_menuNotepadQuitActionPerformed // TODO add your handling code here: FuguApp.getApplication().ShowMainMenu(); FuguApp.getInstanceMainMenu().setAuthentication(true); this.dispose(); }//GEN-LAST:event_menuNotepadQuitActionPerformed private
void
btnOpenCipherTextActionPerformed(java.awt.event.ActionEvent evt) {//GENFIRST:event_btnOpenCipherTextActionPerformed
Prasetyo Bawono, S.Si Universitas Sebelas Maret
72
// TODO add your handling code here: JFileChooser openCipherText = new JFileChooser(); openCipherText.setFileSelectionMode(JFileChooser.FILES_ONLY); openCipherText.setDialogTitle("Open CipherText File"); FileNameExtensionFilter filterFile = FileNameExtensionFilter("CipherText File (*.cip)", "cip", "CIP");
new
openCipherText.setFileFilter(filterFile); try { if(openCipherText.showOpenDialog(this)==JFileChooser.APPROVE_OPTION){ File openCipherText.getSelectedFile();
selectedFile
=
if (selectedFile.canRead() && selectedFile.exists()) { FileInputStream FileInputStream(selectedFile);
fis
=
new
InputStreamReader in= new InputStreamReader(fis); char[] buffer = new char[4194304]; int n String CipherText
= in.read(buffer); = new String(buffer,0,n);
textAreaCipher.setText(CipherText); long sizeCipher String s
= selectedFile.length(); = String.valueOf(sizeCipher);
tfCipherSize.setText(s); in.close(); } } } catch (Exception e) { e.printStackTrace(); } txtPassword.setEnabled(true); btnResetPrivKey.setEnabled(true); btnSaveCipherText.setEnabled(true); btnOpenCipherText.setEnabled(false); btnResetCipherText.setEnabled(true); btnDecryptPlainText.setEnabled(true); }//GEN-LAST:event_btnOpenCipherTextActionPerformed private btnResetPrivKeyActionPerformed(java.awt.event.ActionEvent FIRST:event_btnResetPrivKeyActionPerformed // TODO add your handling code here: if (evt.getSource() == this.btnResetPrivKey)
Prasetyo Bawono, S.Si Universitas Sebelas Maret
void evt)
{//GEN-
73
this.txtPassword.setText(""); }//GEN-LAST:event_btnResetPrivKeyActionPerformed private
void
btnDecryptPlainTextActionPerformed(java.awt.event.ActionEvent {//GEN-FIRST:event_btnDecryptPlainTextActionPerformed
evt)
//
Decrypt:
// //
======== Cipher(String) -> Cipher(String->Byte Array[]) -> Plain(Byte
Array[]->String) -> Plain(String) if(evt.getSource()==this.btnDecryptPlainText){ if (txtPassword!=null){ Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); String textCipherStr = textAreaCipher.getText(); char[] textPassword = txtPassword.getPassword(); byte[] textCipherByte
= textCipherStr.getBytes();
byte[] textPasswordByte String(textPassword)).getBytes();
=
(new
textAreaPlain.setBackground(Color.WHITE); textAreaPlain.setEnabled(true); btnSavePlainText.setEnabled(true); // ECB MODE if (rbECB.isSelected()) { try { // Start Counting long ecbStart; long ecbEnd; long ecbTime; ecbStart
= System.currentTimeMillis();
// Define Algorithm & its Mode SecretKeySpec key SecretKeySpec(textPasswordByte, "Blowfish"); Cipher
=
cipher
new =
Cipher.getInstance("Blowfish/ECB/PKCS7Padding","BC"); // Decryption cipher.init(Cipher.DECRYPT_MODE, key); byte[] cipher.doFinal(textCipherByte);
Prasetyo Bawono, S.Si Universitas Sebelas Maret
plainText
=
74
int ptLength = cipher.update(textCipherByte, 0, textCipherByte.length, plainText, 0); ptLength += cipher.doFinal(plainText, ptLength); String plain = new String(plainText); textAreaPlain.setText(plain); String ptLengthStr = Integer.toString(ptLength); tfPlainSize.setText(ptLengthStr); // Benchmark for performance ecbEnd = System.currentTimeMillis(); Encryption processing time (ms)
//
ecbTime = (ecbEnd - ecbStart); String b = String.valueOf(ecbTime); tfTimeDec.setText(b); } catch (Exception e) { System.out.println(e); } } // CBC MODE if (rbCBC.isSelected()) { try { // Start Counting long cbcStart; long cbcEnd; long cbcTime; cbcStart
= System.currentTimeMillis();
// Inisialitazion Vector byte[] ivBytes = new byte[]{ 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; // Define Algorithm and Mode SecretKeySpec key SecretKeySpec(textPasswordByte, "Blowfish"); IvParameterSpec ivSpec IvParameterSpec(ivBytes); Cipher
= =
cipher
new new =
Cipher.getInstance("Blowfish/CBC/PKCS5Padding","BC"); // Decryption cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); byte[] cipher.doFinal(textCipherByte);
Prasetyo Bawono, S.Si Universitas Sebelas Maret
plainText
=
75
int ptLength = cipher.update(textCipherByte, 0, textCipherByte.length, plainText, 0); ptLength += cipher.doFinal(plainText, ptLength); String plain = new String(plainText); textAreaPlain.setText(plain); String ptLengthStr = Integer.toString(ptLength); tfPlainSize.setText(ptLengthStr); // Benchmark for performance cbcEnd = System.currentTimeMillis();
//
Encryption processing time (ms) cbcTime = (cbcEnd - cbcStart); String b = String.valueOf(cbcTime); tfTimeDec.setText(b); } catch (Exception e) { System.out.println(e); } } // OFB MODE if (rbOFB.isSelected()) { try { // Start Counting long ofbStart; long ofbEnd; long ofbTime; ofbStart = System.currentTimeMillis(); // Inisialitazion Vector byte[] ivBytes
= new byte[]{ 0x07, 0x06, 0x05, 0x04, 0x03,
0x02, 0x01, 0x00 }; // Define Algorithm and Mode SecretKeySpec key SecretKeySpec(textPasswordByte, "Blowfish"); IvParameterSpec IvParameterSpec(ivBytes);
= ivSpec
=
Cipher cipher Cipher.getInstance("Blowfish/OFB/NoPadding","BC"); // Decryption cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
Prasetyo Bawono, S.Si Universitas Sebelas Maret
new new =
76
byte[] cipher.doFinal(textCipherByte);
plainText
=
int ptLength = cipher.update(textCipherByte, 0, textCipherByte.length, plainText, 0); ptLength += cipher.doFinal(plainText, ptLength); String plain = new String(plainText); textAreaPlain.setText(plain); String ptLengthStr = Integer.toString(ptLength); tfPlainSize.setText(ptLengthStr); // Benchmark for performance ofbEnd = System.currentTimeMillis();
//
Encryption processing time (ms) ofbTime = (ofbEnd - ofbStart); String b = String.valueOf(ofbTime); tfTimeDec.setText(b); } catch (Exception e) { System.out.println(e); } } // CFB MODE if (rbCFB.isSelected()) { try { // Start Counting long cfbStart; long cfbEnd; long cfbTime; cfbStart = System.currentTimeMillis(); // Inisialitazion Vector byte[] ivBytes
= new byte[]{ 0x07, 0x06, 0x05, 0x04, 0x03,
0x02, 0x01, 0x00 }; // Define Algorithm and Mode SecretKeySpec key SecretKeySpec(textPasswordByte, "Blowfish"); IvParameterSpec IvParameterSpec(ivBytes);
= ivSpec
Cipher cipher Cipher.getInstance("Blowfish/CFB/NoPadding","BC"); // Decryption
Prasetyo Bawono, S.Si Universitas Sebelas Maret
=
new new =
77
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); byte[] plainText
=
cipher.doFinal(textCipherByte); int ptLength = cipher.update(textCipherByte, 0, textCipherByte.length, plainText, 0); ptLength += cipher.doFinal(plainText, ptLength); String plain = new String(plainText); textAreaPlain.setText(plain); String ptLengthStr = Integer.toString(ptLength); tfPlainSize.setText(ptLengthStr); // Benchmark for performance cfbEnd = System.currentTimeMillis(); Encryption processing time (ms)
//
cfbTime = (cfbEnd - cfbStart); String b = String.valueOf(cfbTime); tfTimeDec.setText(b); } catch (Exception e) { System.err.println(e); } } JOptionPane.showMessageDialog(null, "Dekripsi Berhasil..", "Decryption Successfully", JOptionPane.INFORMATION_MESSAGE); } if(txtPassword.getPassword().length<8){ JOptionPane.showMessageDialog(null, "Private key minimal 8 karakter", "Error", JOptionPane.ERROR_MESSAGE); } if (txtPassword.getPassword().length==0) { JOptionPane.showMessageDialog(null, "Private boleh kosong!", "Error Message", JOptionPane.ERROR_MESSAGE);
key
tidak
} btnResetPrivKey.setEnabled(false);; txtPassword.setEnabled(false); } }//GEN-LAST:event_btnDecryptPlainTextActionPerformed private btnSavePlainTextActionPerformed(java.awt.event.ActionEvent FIRST:event_btnSavePlainTextActionPerformed // TODO add your handling code here: if (evt.getSource() == this.btnSavePlainText){ JFileChooser savePlainText = new JFileChooser();
Prasetyo Bawono, S.Si Universitas Sebelas Maret
evt)
void {//GEN-
78
FileNameExtensionFilter filter = FileNameExtensionFilter("Document File (*.txt)", "txt", "TXT");
new
savePlainText.setFileFilter(filter); savePlainText.setDialogTitle("Save PlainText to File"); int option = savePlainText.showSaveDialog(this); // Jika OK if (option == JFileChooser.APPROVE_OPTION){ try { // Buat buffered writer untuk menulis BufferedWriter out = new BufferedWriter(new FileWriter(savePlainText.getSelectedFile().getPath())); out.write(this.textAreaPlain.getText()); out.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); } JOptionPane.showMessageDialog(null, "Sukses Menyimpan "+savePlainText.getSelectedFile().getName()+"\nLokasi File:
File
"+savePlainText.getSelectedFile(),"PlainText JOptionPane.INFORMATION_MESSAGE);
Saved!",
} else JOptionPane.showMessageDialog(null, "Something Happened?", "Gagal Menyimpan File", JOptionPane.ERROR_MESSAGE); } }//GEN-LAST:event_btnSavePlainTextActionPerformed /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { BlowfishDec dialog
=
new
BlowfishDec(new
javax.swing.JFrame(), true); dialog.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } }); dialog.setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables
Prasetyo Bawono, S.Si Universitas Sebelas Maret
79
private javax.swing.JButton btnDecryptPlainText; private javax.swing.JButton btnOpenCipherText; private javax.swing.JButton btnResetCipherText; private javax.swing.JButton btnResetPrivKey; private javax.swing.JButton btnSaveCipherText; private javax.swing.JButton btnSavePlainText; private javax.swing.ButtonGroup buttonGroup1; private javax.swing.JLabel fugu; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel8; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JLabel lblEncryption; private javax.swing.JLabel lblOpenFile; private javax.swing.JLabel lblPrivKey; private javax.swing.JLabel lblPrivateKey; private javax.swing.JLabel lblSaveTo; private javax.swing.JMenu menuNotepadFile; private javax.swing.JMenuItem menuNotepadQuit; private javax.swing.JPanel panelCipherText; private javax.swing.JPanel panelPlainText; private javax.swing.JRadioButton rbCBC; private javax.swing.JRadioButton rbCFB; private javax.swing.JRadioButton rbECB; private javax.swing.JRadioButton rbOFB; private javax.swing.JTextArea textAreaCipher; private javax.swing.JTextArea textAreaPlain; private javax.swing.JTextField tfCipherSize; private javax.swing.JTextField tfPlainSize; private javax.swing.JTextField tfTimeDec; private javax.swing.JPasswordField txtPassword; // End of variables declaration//GEN-END:variables }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
80
6.
Lampiran 6 : Class Koneksi Database (DriverConnection.java)
/** * Class Koneksi ke Database untuk Login * * @ Prasetyo Bawono * @
[email protected] * Full Source: http://ono.web.id/fugu */ package fugu.dbase; import java.sql.*; public class DriverConnection{ private String driverName="com.mysql.jdbc.Driver"; private String jdbcType="jdbc:mysql"; private String host="localhost"; private String dataBaseName="fugu"; private String password="bismillah"; private String userId="nixnux"; private Connection conn; private boolean isConnect=false; //Constructor public DriverConnection(){ } public void setDataBaseName(String value){ dataBaseName=value; } public void setPassword(String value){ password=value; } public void setUserId(String value){ userId=value; } public void setHostName(String value){ host=value; } private void init(){ String currentUrl=jdbcType+"://"+host+"/"+dataBaseName+"?user="+ userId+"&password="+password;
Prasetyo Bawono, S.Si Universitas Sebelas Maret
81
try { Class.forName(driverName); conn = DriverManager.getConnection(currentUrl, userId, password); isConnect=true; } catch(ClassNotFoundException cnfe) { System.err.println(cnfe); } catch(SQLException sqle) { conn=null; isConnect=false; System.err.println(sqle); } } public boolean isConnected(){ return isConnect; } public Connection getConnection(){ if (conn !=null) return conn; else //Try again { init(); return conn; } } public void close()throws SQLException { conn.close(); } }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
82
7.
Lampiran 7 : Class Algoritma Blowfish (BlowfishEngine.java)
package org.bouncycastle.crypto.engines; import org.bouncycastle.crypto.BlockCipher; import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.DataLengthException; import org.bouncycastle.crypto.params.KeyParameter; /** * Kelas untuk operasi kunci Blowfish. * Seperti encoding data dan meng-generate kunci * Semua algoritma yang ada bersumber dari buku Applied Cryptography * */ public final class BlowfishEngine implements BlockCipher { private final static int[] /** Initial value of the P-Array, Sub Kunci yang dibangkitkan */ KP = { 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, 0x9216D5D9, 0x8979FB1B }, /** S-Box, KS0 = SBox1, KS1 = SBox 2, KS2 = SBox3, KS3 = SBox4 */ KS0 = { 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677, 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
Prasetyo Bawono, S.Si Universitas Sebelas Maret
83
0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09, 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0, 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1, 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A
Prasetyo Bawono, S.Si Universitas Sebelas Maret
84
}, KS1 = { 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
Prasetyo Bawono, S.Si Universitas Sebelas Maret
85
0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 }, KS2 = { 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE, 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C, 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17, 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
Prasetyo Bawono, S.Si Universitas Sebelas Maret
86
0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0, 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C, 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2, 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C, 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027, 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 }, KS3 = { 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8, 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
Prasetyo Bawono, S.Si Universitas Sebelas Maret
87
0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51, 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB, 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47, 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38, 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D, 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
Prasetyo Bawono, S.Si Universitas Sebelas Maret
88
0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 }; //==================================== // Useful constants //==================================== private static final int
ROUNDS = 16;
private static final int private static final int
BLOCK_SIZE = 8; SBOX_SK = 256;
private static final int
P_SZ = ROUNDS+2;
private final int[] S0, S1, S2, S3; private final int[] P;
// bytes = 64 bits
// the s-boxes // the p-array
private boolean encrypting = false; private byte[] workingKey = null; public BlowfishEngine() { S0 = new int[SBOX_SK]; S1 = new int[SBOX_SK]; S2 = new int[SBOX_SK]; S3 = new int[SBOX_SK]; P = new int[P_SZ]; } /** * initialise a Blowfish cipher. * * @param encrypting whether or not we are for encryption. * @param params the parameters required to set up the cipher. * @exception IllegalArgumentException if the params argument is * inappropriate. */ public void init( boolean CipherParameters {
Prasetyo Bawono, S.Si Universitas Sebelas Maret
encrypting, params)
89
if (params instanceof KeyParameter) { this.encrypting = encrypting; this.workingKey = ((KeyParameter)params).getKey(); setKey(this.workingKey); return; } throw new IllegalArgumentException("invalid parameter passed to Blowfish init - " + params.getClass().getName()); } public String getAlgorithmName() { return "Blowfish"; } public final int processBlock( byte[] in, int inOff, byte[] out, int outOff) { if (workingKey == null) { throw new IllegalStateException("Blowfish not initialised"); } if ((inOff + BLOCK_SIZE) > in.length) { throw new DataLengthException("input buffer too short"); } if ((outOff + BLOCK_SIZE) > out.length) { throw new DataLengthException("output buffer too short"); } if (encrypting) { encryptBlock(in, inOff, out, outOff); } else { decryptBlock(in, inOff, out, outOff); }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
90
return BLOCK_SIZE; } public void reset() { } public int getBlockSize() { return BLOCK_SIZE; } //================================== // Private Implementation //================================== private int F(int x) { return (((S0[(x >>> 24)] + S1[(x >>> 16) & 0xff]) ^ S2[(x >>> 8) & 0xff]) + S3[x & 0xff]); } /** * apply the encryption cycle to each value pair in the table. */ private void processTable( int int
xl, xr,
int[]
table)
{ int size = table.length; for (int s = 0; s < size; s += 2) { xl ^= P[0]; for (int i = 1; i < ROUNDS; i += 2) { xr ^= F(xl) ^ P[i]; xl ^= F(xr) ^ P[i + 1]; } xr ^= P[ROUNDS + 1]; table[s] = xr; table[s + 1] = xl; xr = xl;
Prasetyo Bawono, S.Si Universitas Sebelas Maret
// end of cycle swap
91
xl = table[s]; } } private void setKey(byte[] key) { /* * - comments are from _Applied Crypto_, Schneier, p338 * please be careful comparing the two, AC numbers the * arrays from 1, the enclosed code from 0. * * (1) * Initialise the S-boxes and the P-array, with a fixed string * This string contains the hexadecimal digits of pi (3.141...) */ System.arraycopy(KS0, 0, S0, 0, SBOX_SK); System.arraycopy(KS1, 0, S1, 0, SBOX_SK); System.arraycopy(KS2, 0, S2, 0, SBOX_SK); System.arraycopy(KS3, 0, S3, 0, SBOX_SK); System.arraycopy(KP, 0, P, 0, P_SZ); /* * (2) * Now, XOR P[0] with the first 32 bits of the key, XOR P[1] with the * second 32-bits of the key, and so on for all bits of the key * (up to P[17]). Repeatedly cycle through the key bits until the * entire P-array has been XOR-ed with the key bits */ int keyLength = key.length; int keyIndex = 0; for (int i=0; i < P_SZ; i++) { // get the 32 bits of the key, in 4 * 8 bit chunks int data = 0x0000000; for (int j=0; j < 4; j++) { // create a 32 bit block data = (data << 8) | (key[keyIndex++] & 0xff); // wrap when we get to the end of the key if (keyIndex >= keyLength) { keyIndex = 0; }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
92
} // XOR the newly created 32 bit chunk onto the P-array P[i] ^= data; } /* * (3) * Encrypt the all-zero string with the Blowfish algorithm, using * the subkeys described in (1) and (2) * * (4) * Replace P1 and P2 with the output of step (3) * * (5) * Encrypt the output of step(3) using the Blowfish algorithm, * with the modified subkeys. * * (6) * Replace P3 and P4 with the output of step (5) * * (7) * Continue the process, replacing all elements of the P-array * and then all four S-boxes in order, with the output of the * continuously changing Blowfish algorithm */ processTable(0, 0, P); processTable(P[P_SZ - 2], P[P_SZ - 1], S0); processTable(S0[SBOX_SK - 2], S0[SBOX_SK - 1], S1); processTable(S1[SBOX_SK - 2], S1[SBOX_SK - 1], S2); processTable(S2[SBOX_SK - 2], S2[SBOX_SK - 1], S3); } /** * Encrypt the given input starting at the given offset and place * the result in the provided buffer starting at the given offset. * The input will be an exact multiple of our blocksize. */ private void encryptBlock( byte[] src, int byte[]
srcIndex, dst,
int
dstIndex)
{ int xl = BytesTo32bits(src, srcIndex); int xr = BytesTo32bits(src, srcIndex+4); xl ^= P[0];
Prasetyo Bawono, S.Si Universitas Sebelas Maret
93
for (int i = 1; i < ROUNDS; i += 2) { xr ^= F(xl) ^ P[i]; xl ^= F(xr) ^ P[i + 1]; } xr ^= P[ROUNDS + 1]; Bits32ToBytes(xr, dst, dstIndex); Bits32ToBytes(xl, dst, dstIndex + 4); } /** * Decrypt the given input starting at the given offset and place * the result in the provided buffer starting at the given offset. * The input will be an exact multiple of our blocksize. */ private void decryptBlock( byte[] src, int srcIndex, byte[] dst, int dstIndex) { int xl = BytesTo32bits(src, srcIndex); int xr = BytesTo32bits(src, srcIndex + 4); xl ^= P[ROUNDS + 1]; for (int i = ROUNDS; i > 0 ; i -= 2) { xr ^= F(xl) ^ P[i]; xl ^= F(xr) ^ P[i - 1]; } xr ^= P[0]; Bits32ToBytes(xr, dst, dstIndex); Bits32ToBytes(xl, dst, dstIndex+4); } private int BytesTo32bits(byte[] b, int i) { return ((b[i]
& 0xff) << 24) |
((b[i+1] & 0xff) << 16) | ((b[i+2] & 0xff) << 8) | ((b[i+3] & 0xff)); }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
94
private void Bits32ToBytes(int in,
byte[] b, int offset)
{ b[offset + 3] = (byte)in; b[offset + 2] = (byte)(in >> 8); b[offset + 1] = (byte)(in >> 16); b[offset]
= (byte)(in >> 24);
} }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
95
8.
Lampiran 8 : Class Mode Enkripsi CBC (CBCBlockCipher.java)
package org.bouncycastle.crypto.modes; import org.bouncycastle.crypto.BlockCipher; import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.DataLengthException; import org.bouncycastle.crypto.params.ParametersWithIV; import org.bouncycastle.util.Arrays; /** * implements Cipher-Block-Chaining (CBC) mode on top of a simple cipher. */ public class CBCBlockCipher implements BlockCipher { private byte[] private byte[]
IV; cbcV;
private byte[]
cbcNextV;
private int private BlockCipher
blockSize; cipher = null;
private boolean
encrypting;
/** * Basic constructor. * *
@param
cipher
the
block
cipher
to
be
used
as
the
chaining. */ public CBCBlockCipher( BlockCipher cipher) { this.cipher = cipher; this.blockSize = cipher.getBlockSize(); this.IV = new byte[blockSize]; this.cbcV = new byte[blockSize]; this.cbcNextV = new byte[blockSize]; } /** * return the underlying block cipher that we are wrapping. * * @return the underlying block cipher that we are wrapping. */
Prasetyo Bawono, S.Si Universitas Sebelas Maret
basis
of
96
public BlockCipher getUnderlyingCipher() { return cipher; } /** * Initialise the cipher and, possibly, the initialisation vector (IV). * If an IV isn't passed as part of the parameter, the IV will be all zeros. * * @param encrypting if true the cipher is initialised for * encryption, if false for decryption. * @param params the key and other data required by the cipher. * @exception IllegalArgumentException if the params argument is * inappropriate. */ public void init( boolean CipherParameters
encrypting, params)
throws IllegalArgumentException { this.encrypting = encrypting; if (params instanceof ParametersWithIV) { ParametersWithIV ivParam = (ParametersWithIV)params; byte[] iv = ivParam.getIV(); if (iv.length != blockSize) { throw
new
IllegalArgumentException("initialisation
vector must be the same length as block size"); } System.arraycopy(iv, 0, IV, 0, iv.length); reset(); cipher.init(encrypting, ivParam.getParameters()); } else { reset(); cipher.init(encrypting, params); } }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
97
/** * return the algorithm name and mode. * * @return the name of the underlying algorithm followed by "/CBC". */ public String getAlgorithmName() { return cipher.getAlgorithmName() + "/CBC"; } /** * return the block size of the underlying cipher. * * @return the block size of the underlying cipher. */ public int getBlockSize() { return cipher.getBlockSize(); } /** * Process one block of input from the array in and write it to * the out array. * * @param in the array containing the input data. * @param inOff offset into the in array the data starts at. * @param out the array the output data will be copied into. * @param outOff the offset into the out array the output will start at. * @exception DataLengthException if there isn't enough data in in, or * space in out. * @exception IllegalStateException if the cipher isn't initialised. * @return the number of bytes processed and produced. */ public int processBlock( byte[] in, int byte[]
inOff, out,
int outOff) throws DataLengthException, IllegalStateException { return
(encrypting)
?
encryptBlock(in,
decryptBlock(in, inOff, out, outOff); } /**
Prasetyo Bawono, S.Si Universitas Sebelas Maret
inOff,
out,
outOff)
:
98
* reset the chaining vector back to the IV and reset the underlying * cipher. */ public void reset() { System.arraycopy(IV, 0, cbcV, 0, IV.length); Arrays.fill(cbcNextV, (byte)0); cipher.reset(); } /** * Do the appropriate chaining step for CBC mode encryption. * * @param in the array containing the data to be encrypted. * @param inOff offset into the in array the data starts at. * @param out the array the encrypted data will be copied into. * @param outOff the offset into the out array the output will start at. * @exception DataLengthException if there isn't enough data in in, or * space in out. * @exception IllegalStateException if the cipher isn't initialised. * @return the number of bytes processed and produced. */ private int encryptBlock( byte[] int
in, inOff,
byte[] int
out, outOff)
throws DataLengthException, IllegalStateException { if ((inOff + blockSize) > in.length) { throw new DataLengthException("input buffer too short"); } /* * XOR the cbcV and the input, * then encrypt the cbcV */ for (int i = 0; i < blockSize; i++) { cbcV[i] ^= in[inOff + i]; } int length = cipher.processBlock(cbcV, 0, out, outOff);
Prasetyo Bawono, S.Si Universitas Sebelas Maret
99
/* * copy ciphertext to cbcV */ System.arraycopy(out, outOff, cbcV, 0, cbcV.length); return length; } /** * Do the appropriate chaining step for CBC mode decryption. * * @param in the array containing the data to be decrypted. * @param inOff offset into the in array the data starts at. * @param out the array the decrypted data will be copied into. * @param outOff the offset into the out array the output will start at. * @exception DataLengthException if there isn't enough data in in, or * space in out. * @exception IllegalStateException if the cipher isn't initialised. * @return the number of bytes processed and produced. */ private int decryptBlock( byte[] in, int byte[]
inOff, out,
int outOff) throws DataLengthException, IllegalStateException { if ((inOff + blockSize) > in.length) { throw new DataLengthException("input buffer too short"); } System.arraycopy(in, inOff, cbcNextV, 0, blockSize); int length = cipher.processBlock(in, inOff, out, outOff); /* * XOR the cbcV and the output */ for (int i = 0; i < blockSize; i++) { out[outOff + i] ^= cbcV[i]; } /* * swap the back up buffer into next position
Prasetyo Bawono, S.Si Universitas Sebelas Maret
100
*/ byte[]
tmp;
tmp = cbcV; cbcV = cbcNextV; cbcNextV = tmp; return length; } }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
101
9.
Lampiran 9 : Class Mode Enkripsi CFB (CFBBlockCipher.java)
package org.bouncycastle.crypto.modes; import org.bouncycastle.crypto.BlockCipher; import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.DataLengthException; import org.bouncycastle.crypto.params.ParametersWithIV; /** * implements a Cipher-FeedBack (CFB) mode on top of a simple cipher. */ public class CFBBlockCipher implements BlockCipher { private byte[]
IV;
private byte[] private byte[]
cfbV; cfbOutV;
private int
blockSize;
private BlockCipher private boolean
cipher = null; encrypting;
/** * Basic constructor. * * @param cipher the block cipher to be used as the basis of the * feedback mode. * @param bitBlockSize the block size in bits (note: a multiple of 8) */ public CFBBlockCipher( BlockCipher cipher, int
bitBlockSize)
{ this.cipher = cipher; this.blockSize = bitBlockSize / 8; this.IV = new byte[cipher.getBlockSize()]; this.cfbV = new byte[cipher.getBlockSize()]; this.cfbOutV = new byte[cipher.getBlockSize()]; } /** * return the underlying block cipher that we are wrapping. * * @return the underlying block cipher that we are wrapping.
Prasetyo Bawono, S.Si Universitas Sebelas Maret
102
*/ public BlockCipher getUnderlyingCipher() { return cipher; } /** * Initialise the cipher and, possibly, the initialisation vector (IV). * If an IV isn't passed as part of the parameter, the IV will be all zeros. * An IV which is too short is handled in FIPS compliant fashion. * * @param encrypting if true the cipher is initialised for * encryption, if false for decryption. * @param params the key and other data required by the cipher. * @exception IllegalArgumentException if the params argument is * inappropriate. */ public void init( boolean CipherParameters
encrypting, params)
throws IllegalArgumentException { this.encrypting = encrypting; if (params instanceof ParametersWithIV) { ParametersWithIV ivParam = (ParametersWithIV)params; byte[] iv = ivParam.getIV(); if (iv.length < IV.length) { // prepend the supplied IV with zeros (per FIPS PUB 81) System.arraycopy(iv, 0, IV, IV.length
- iv.length,
iv.length); for (int i = 0; i < IV.length - iv.length; i++) { IV[i] = 0; } } else { System.arraycopy(iv, 0, IV, 0, IV.length); } reset();
Prasetyo Bawono, S.Si Universitas Sebelas Maret
103
cipher.init(true, ivParam.getParameters()); } else { reset(); cipher.init(true, params); } } /** * return the algorithm name and mode. * * @return the name of the underlying algorithm followed by "/CFB" * and the block size in bits. */ public String getAlgorithmName() { return cipher.getAlgorithmName() + "/CFB" + (blockSize * 8); } /** * return the block size we are operating at. * * @return the block size we are operating at (in bytes). */ public int getBlockSize() { return blockSize; } /** * Process one block of input from the array in and write it to * the out array. * * @param in the array containing the input data. * @param inOff offset into the in array the data starts at. * @param out the array the output data will be copied into. * @param outOff the offset into the out array the output will start at. * @exception DataLengthException if there isn't enough data in in, or * space in out. * @exception IllegalStateException if the cipher isn't initialised. * @return the number of bytes processed and produced. */ public int processBlock(
Prasetyo Bawono, S.Si Universitas Sebelas Maret
104
byte[] int
in, inOff,
byte[] int
out, outOff)
throws DataLengthException, IllegalStateException { return (encrypting) ? encryptBlock(in, decryptBlock(in, inOff, out, outOff);
inOff,
out,
outOff)
:
} /** * Do the appropriate processing for CFB mode encryption. * * @param in the array containing the data to be encrypted. * @param inOff offset into the in array the data starts at. * @param out the array the encrypted data will be copied into. * @param outOff the offset into the out array the output will start at. * @exception DataLengthException if there isn't enough data in in, or * space in out. * @exception IllegalStateException if the cipher isn't initialised. * @return the number of bytes processed and produced. */ public int encryptBlock( byte[] in, int byte[]
inOff, out,
int outOff) throws DataLengthException, IllegalStateException { if ((inOff + blockSize) > in.length) { throw new DataLengthException("input buffer too short"); } if ((outOff + blockSize) > out.length) { throw new DataLengthException("output buffer too short"); } cipher.processBlock(cfbV, 0, cfbOutV, 0); // // XOR the cfbV with the plaintext producing the ciphertext // for (int i = 0; i < blockSize; i++) {
Prasetyo Bawono, S.Si Universitas Sebelas Maret
105
out[outOff + i] = (byte)(cfbOutV[i] ^ in[inOff + i]); } // // change over the input block. // System.arraycopy(cfbV, blockSize); System.arraycopy(out, blockSize);
blockSize, outOff,
cfbV,
cfbV,
0,
cfbV.length
cfbV.length -
-
blockSize,
return blockSize; } /** * Do the appropriate processing for CFB mode decryption. * * @param in the array containing the data to be decrypted. * @param inOff offset into the in array the data starts at. * @param out the array the encrypted data will be copied into. * @param outOff the offset into the out array the output will start at. * @exception DataLengthException if there isn't enough data in in, or * space in out. * @exception IllegalStateException if the cipher isn't initialised. * @return the number of bytes processed and produced. */ public int decryptBlock( byte[] in, int byte[]
inOff, out,
int outOff) throws DataLengthException, IllegalStateException { if ((inOff + blockSize) > in.length) { throw new DataLengthException("input buffer too short"); } if ((outOff + blockSize) > out.length) { throw new DataLengthException("output buffer too short"); } cipher.processBlock(cfbV, 0, cfbOutV, 0); //
Prasetyo Bawono, S.Si Universitas Sebelas Maret
106
// change over the input block. // System.arraycopy(cfbV, blockSize); System.arraycopy(in, blockSize);
blockSize, inOff,
cfbV,
cfbV,
0,
cfbV.length
cfbV.length -
blockSize,
// // XOR the cfbV with the ciphertext producing the plaintext // for (int i = 0; i < blockSize; i++) { out[outOff + i] = (byte)(cfbOutV[i] ^ in[inOff + i]); } return blockSize; } /** * reset the chaining vector back to the IV and reset the underlying * cipher. */ public void reset() { System.arraycopy(IV, 0, cfbV, 0, IV.length); cipher.reset(); } }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
-
107
10. Lampiran 10 : Class Mode Enkripsi OFB (OFBBlockCipher.java) package org.bouncycastle.crypto.modes; import org.bouncycastle.crypto.BlockCipher; import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.DataLengthException; import org.bouncycastle.crypto.params.ParametersWithIV; /** * implements a Output-FeedBack (OFB) mode on top of a simple cipher. */ public class OFBBlockCipher implements BlockCipher { private byte[]
IV;
private byte[] private byte[]
ofbV; ofbOutV;
private final int
blockSize;
private final BlockCipher
cipher;
/** * Basic constructor. * * @param cipher the block cipher to be used as the basis of the * feedback mode. * @param blockSize the block size in bits (note: a multiple of 8) */ public OFBBlockCipher( BlockCipher cipher, int blockSize) { this.cipher = cipher; this.blockSize = blockSize / 8; this.IV = new byte[cipher.getBlockSize()]; this.ofbV = new byte[cipher.getBlockSize()]; this.ofbOutV = new byte[cipher.getBlockSize()]; } /** * return the underlying block cipher that we are wrapping. * * @return the underlying block cipher that we are wrapping. */
Prasetyo Bawono, S.Si Universitas Sebelas Maret
108
public BlockCipher getUnderlyingCipher() { return cipher; } /** * Initialise the cipher and, possibly, the initialisation vector (IV). * If an IV isn't passed as part of the parameter, the IV will be all zeros. * An IV which is too short is handled in FIPS compliant fashion. * * @param encrypting if true the cipher is initialised for * encryption, if false for decryption. * @param params the key and other data required by the cipher. * @exception IllegalArgumentException if the params argument is * inappropriate. */ public void init( boolean
encrypting, //ignored by this OFB mode
CipherParameters params) throws IllegalArgumentException { if (params instanceof ParametersWithIV) { ParametersWithIV ivParam = (ParametersWithIV)params; byte[]
iv = ivParam.getIV();
if (iv.length < IV.length) { // prepend the supplied IV with zeros (per FIPS PUB 81) System.arraycopy(iv, 0, IV, IV.length
- iv.length,
iv.length); for (int i = 0; i < IV.length - iv.length; i++) { IV[i] = 0; } } else { System.arraycopy(iv, 0, IV, 0, IV.length); } reset(); cipher.init(true, ivParam.getParameters()); }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
109
else { reset(); cipher.init(true, params); } } /** * return the algorithm name and mode. * * @return the name of the underlying algorithm followed by "/OFB" * and the block size in bits */ public String getAlgorithmName() { return cipher.getAlgorithmName() + "/OFB" + (blockSize * 8); }
/** * return the block size we are operating at (in bytes). * * @return the block size we are operating at (in bytes). */ public int getBlockSize() { return blockSize; } /** * Process one block of input from the array in and write it to * the out array. * * @param in the array containing the input data. * @param inOff offset into the in array the data starts at. * @param out the array the output data will be copied into. * @param outOff the offset into the out array the output will start at. * @exception DataLengthException if there isn't enough data in in, or * space in out. * @exception IllegalStateException if the cipher isn't initialised. * @return the number of bytes processed and produced. */ public int processBlock( byte[] int
in, inOff,
Prasetyo Bawono, S.Si Universitas Sebelas Maret
110
byte[] int
out, outOff)
throws DataLengthException, IllegalStateException { if ((inOff + blockSize) > in.length) { throw new DataLengthException("input buffer too short"); } if ((outOff + blockSize) > out.length) { throw new DataLengthException("output buffer too short"); } cipher.processBlock(ofbV, 0, ofbOutV, 0); // // XOR the ofbV with the plaintext producing the cipher text (and // the next input block). // for (int i = 0; i < blockSize; i++) { out[outOff + i] = (byte)(ofbOutV[i] ^ in[inOff + i]); } // // change over the input block. // System.arraycopy(ofbV, blockSize);
blockSize,
System.arraycopy(ofbOutV, blockSize);
0,
ofbV,
ofbV,
0,
ofbV.length
ofbV.length -
blockSize,
return blockSize; } /** * reset the feedback vector back to the IV and reset the underlying * cipher. */ public void reset() { System.arraycopy(IV, 0, ofbV, 0, IV.length); cipher.reset(); } }
Prasetyo Bawono, S.Si Universitas Sebelas Maret
-