Anda di halaman 1dari 121

library.uns.ac.id digilib.uns.ac.

id

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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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 berbeda-
beda (22 bytes, 202 Kilobytes dan 1,1 Megabytes) menunjukkan hasil selisih
waktu yang tidak jauh berbeda. Sedangkan untuk kompleksitas waktu dari ke-
empat 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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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 non-
repudation.
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
8

Kunci Kunci

Cipherteks
Plainteks Enkripsi 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
library.uns.ac.id digilib.uns.ac.id
9

Tipe-tipe cipher :

Ciphers

Classical Rotor Machine Modern

Substitution Transposition 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
library.uns.ac.id digilib.uns.ac.id
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 Ilmu dan seni untuk memecahkan
keamanan pesan 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
library.uns.ac.id digilib.uns.ac.id
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
Minimum 0, maksimum 2040,
RC6 128 1998
multiple 8 bits, default 128 bits
Minimum 32, maksimum 448,
Blowfish 64 1993
multiple 8 bits, default 128 bits
Minimum 128, maksimum 256,
CAST-256 128 1998
multiple 32 bits, default 128 bits
Untuk lebih jelasnya, proses enkripsi dan dekripsi pada cipher blok dapat
dilihat pada gambar berikut :

Plainteks

Enkripsi
Kunci
Cipher Blok

Cipherteks

Gambar 2.5. Enkripsi Pada Cipher Blok

Cipherteks

Dekripsi
Kunci
Cipher Blok

Plainteks

Gambar 2.6. Dekripsi Pada Cipher Blok

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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.

(XL)i - 1 Pi (XR)i - 1

(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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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 S-Box S-Box S-Box


1 2 3 4
32 bits 32 bits 32 bits 32 bits

Gambar 2.8 Skema fungsi F pada algoritma Blowfish

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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 DEKRIPSI
Blok Plainteks M1 Blok Cipherteks C1
m1 m2 m.. mn c1 c2 c... cn
M = (m1, m2, …, mn) C = (c1, c2, …, cn)

Kunci K E Kunci K E

Blok Cipherteks C1 Blok Plainteks M1


c1 c2 c... cn m1 m2 m.. mn
C = (c1, c2, …, cn) 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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
20

ENKRIPSI DEKRIPSI
Mi-1 Mi-1 Ci-1 Ci

Ci-2 ⊕ ⊕

Kunci K EK EK Kunci K DK DK

Ci-2 ⊕ ⊕

Ci-1 Ci 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
library.uns.ac.id digilib.uns.ac.id
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 EK K DK

Left-most byte Left-most byte


pi pi

mi ⊕ ci ci ⊕ mi

Gambar 2.11. Skema Enkripsi dan Dekripsi dengan Mode CFB 8-Bit

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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 blok-
blok 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 8-
bit 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
library.uns.ac.id digilib.uns.ac.id
23

ENKRIPSI DEKRIPSI
Antrian 8-byte Antrian 8-byte

K EK K DK

Left-most byte Left-most byte


pi pi

mi ⊕ 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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
25

b. Software
Tabel 3.2 Spesifikasi Software
Jenis Spesifikasi
Sistem Operasi - Microsoft(R) Windows(R) eXPerience (XP)
Professional SP3
- Ubuntu 9.10 Karmic Koala
Bahasa Java 2 Standard Edition
Pemrograman - 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
library.uns.ac.id digilib.uns.ac.id
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 Kunci
(Private Key) (Private Key)

File
Cipherteks
Plainteks Teks ter-Enkripsi 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
library.uns.ac.id digilib.uns.ac.id
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 Mode Enkripsi Cipher Blok


(ECB, CBC, CFB, OFB) (ECB, CBC, CFB, OFB)

Kunci Kunci

Ya Ya

Kunci = 0 / Kunci = 0 /
Kunci < 8 ? Kunci < 8 ?
Tidak

Tidak Tidak

Proses Enkripsi Proses Dekripsi


(Blowfish) (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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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.

Kunci (Private Key) reset

Mode Enkripsi : ECB CBC OFB CFB

plainteks

Size: ___ Bytes New Save Open Enkripsi

cipherteks

Size: ___ Bytes Time: __________ ms Save Cipher

Gambar 4.4 Rancangan Form Sistem Enkripsi

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
30

Kunci (Private Key) reset

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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
33

Gambar 4.8 Tampilan Form Enkripsi

Gambar 4.9 Pesan Pemberitahuan Enkripsi yang Berhasil

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
37

Plainteks / X (64-bit)

XL (32-bit) XR (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)

P2

13 Putaran

P16

P18 P17

Cipherteks (64-bit)

Gambar 4.15. Skema Jaringan Feistel Pada Algoritma Blowfish

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
38

Tabel 4.2. Pseudo Code Jaringan Feistel Algoritma Blowfish


Line Pseudo Code
1 Begin
2
3 Input:
4 X // 64 bit plainteks (8 Karakter ASCII)
5 P1, P2, ..., P18 // 18 sub-keys, Pi dengan i = iterasi
6 F() // Fungsi iterasi
7
8 Output:
9 C: 64 bits of cipher text
10
11 Algorithm:
12 (xL, xR) = X // Bagi X menjadi 2 bagian, 32-bit/bagian
13 Loop on i from = 1 to 16 // Lakukan iterasi
14 xL = xL XOR Pi // Operasi XOR xL dgn Pi
15 xR = F(xL) XOR xR // Operasi XOR F(xL) dgn xR
16 Swap xL and xR // Tukar xL dgn xR
17 End of loop // Akhir looping
18 Swap xL and xR // Tukar lagi xL dgn xR
19 xR = xR XOR P17 // Operasi XOR xR dgn P17 -> xR
20 xL = xL XOR P18 // Operasi XOR xL dgn P18 -> xL
21 C = (xL, xR) // 64 bit cipherteks
22
23 End

Tabel 4.3. Pseudo Code fungsi iterasi F()


Line Pseudo Code
1 Begin
2
3 Input:
4 xL, xR // 32-bit data masukan
5 S1[], S2[], S3[], S4[] // 4 Kotak-S table lookup @ 256 entri
6
7 Output
8 F(xL) or F(xR) // 32-bit output data
9
10 Algorithm
11 (a, b, c, d) = xL // Bagi xL (xR) jadi 4 bagian, @ 8-bit
12 F(xL) = ((S1[a] + S2[b] mod 2**32) XOR S3[c]) + S[d] mod 2**32
13 // ** Operasi Pangkat
14
15 End

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
39

Tabel 4.4. Pseudo Code Pembangkitan Sub-kunci


Line Pseudo Code
1 Begin
2
3 Input:
4 K // Kunci (private) - 32 bit atau lebih
5 PI // Bagian biner terkecil dari "pi"
6 = 3.1415927... - 3.0
7 = 2/16 + 4*/16**2 + 3/16**3 + 15/16**4 + ...
8 = 0x243f6a8885a308d313198a2e03707344...
9
10 Output:
11 P1, P2, ..., P18 // 18 32-bit sub-kunci
12 S1[], S2[], S3[], S4[] // 4 Kotak-S, 32-bit @256 elemen arrays
13
14 Algorithm:
15 (P1, P2, ..., P18, S1[], S2[], S3[], S4[]) = PI
16 K' = (K, K, K, ...) // Ulangi kuncinya -> panjang 18*32 bit
17 (P1, P2, ..., P18) = (P1, P2, ..., P18) XOR K'
18 X = (0x000000, 0x000000) // Setting inisialiasi plainteks
19 X = Blowfish(X) // Menerapkan algoritma Blowfish
20 (P1, P2) = X // Perbarui dua sub-kunci pertama P1 & P2
21 X = Blowfish(X) // Terapkan kembali algoritma Blowfish
22 (P3, P4) = X // Perbarui dua sub-kunci P3 & P4
23 ......
24 X = Blowfish(X) // Terapkan kembali algoritma Blowfish
25 (P17, P18) = X // Perbarui dua sub-kunci P17 & P18
26 X = Blowfish(X) // Terapkan kembali algoritma Blowfish
27 (S1[0], S1[1]) = X // Perbarui 2 Kotak-S pertama S1[0] & S1[1]
28 X = Blowfish(X) // Terapkan kembali algoritma Blowfish
29 (S1[2], S1[3]) = X // Perbarui 2 Kotak-S S1[2] & S1[3]
30 ......
31 X = Blowfish(X) // Terapkan kembali algoritma Blowfish
32 (S1[254], S1[255]) = X // Perbarui 2 Kotak-S S1[254] & S1[255]
33 X = Blowfish(X) // Terapkan kembali algoritma Blowfish
34 (S2[0], S2[1]) = X // Perbarui 2 Kotak-S pertama S2[0] & S2[1]
35 ......
36 X = Blowfish(X) // Terapkan kembali algoritma Blowfish
37 (S4[254], S4[255]) = X // Perbarui 2 Kotak-S S4[254] & S4[255]
38
39 End

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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
Mode (22 B) (206.076 B / 202 KB) (1.052.629 B / 1 MB)
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
Time (ms) Perf 1
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
library.uns.ac.id digilib.uns.ac.id
41

Tabel 4.6. Data Masukan Uji Coba Aplikasi Proses Dekripsi


Performance I Performance II Performance III
Mode (22 B) (206.076 B / 202 KB) (1.052.629 B / 1 MB)
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

1000

800
Time (ms)

600 Perf 1
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
43

Berikut analisis algoritma Blowfish dengan menggunakan notasi big O:


Table 4.7. Kompleksitas Waktu Algoritma Blowfish
Line Pseudo Code O()

1 Begin
2 Algorithm:
3 (xL, xR) = X // Bagi X menjadi 2 bagian, 32-bit/bagian O(1)
4 Loop on i from = 1 to 16 // Lakukan iterasi 0(n)
5 xL = xL XOR Pi // Operasi XOR xL dgn Pi
6 xR = F(xL) XOR xR // Operasi XOR F(xL) dgn xR
7 Swap xL and xR // Tukar xL dgn xR
8 End of loop // Akhir looping
9 Swap xL and xR // Tukar lagi xL dgn xR 0(1)
10 xR = xR XOR P17 // Operasi XOR xR dgn P17 -> xR 0(1)
11 xL = xL XOR P18 // Operasi XOR xL dgn P18 -> xL 0(1)
12 C = (xL, xR) // 64 bit cipherteks O(1)
13 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 Method O() O(max())
ECB init() O(1)
proccessBlock() O(1)
O( n )
EncryptBlock() O( n )
DecryptBlock() O( n )
CBC init() O(1)
EncryptBlock() O( n ) O( n )
DecryptBlock() O( n )
CFB init() O( n ) O( n )
OFB init() O( n )
O( n )
proccessBlock() O( n )

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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 45


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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.
http://bdg.centrin.net.id/~budskman/artikel.htm
Tanggal akses: 1 April 2008 pukul 10.35 WIB
Susanto, Budi. (2004) Jaringan Komputer, Keamanan Jaringan
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 47


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
51

2. Lampiran 2 : Form Login (LoginForm.java)


/*
* LoginForm.java
*
* host="localhost";
* dataBaseName="fugu";
* password="bismillah";
* userId="nixnux";
*
* @ Prasetyo Bawono
* @ jendalsepit@gmail.com
* 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 - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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 evt)


{//GEN-FIRST:event_btn_goActionPerformed
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 dialog = new LoginForm(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 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
library.uns.ac.id digilib.uns.ac.id
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, "Username dan
Password Salah Bro !", "ERROR", JOptionPane.ERROR_MESSAGE);
}

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
54

3. Lampiran 3 : Form Utama (FuguView.java)

/*
* FuguView.java
* Menu Utama
* @ Prasetyo Bawono
* @ jendalsepit@gmail.com
* 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
library.uns.ac.id digilib.uns.ac.id
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) {//GEN-
FIRST: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) {//GEN-
FIRST: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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
57

4. Lampiran 4 : Form Enkripsi (BlowfishEnc.java)


/*
* BlowfishEnc.java
* @ Prasetyo Bawono
* @ jendalsepit@gmail.com
* 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
library.uns.ac.id digilib.uns.ac.id
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) {//GEN-
FIRST: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
library.uns.ac.id digilib.uns.ac.id
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 evt) {//GEN-
FIRST:event_btnSavePlainTextActionPerformed
if (evt.getSource() == this.btnSavePlainText){
JFileChooser savePlainText = new JFileChooser();
FileNameExtensionFilter filter = new
FileNameExtensionFilter("Text Documents (*.txt)", "txt", "java");
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 Menyimpan
File "+savePlainText.getSelectedFile().getName()+"\nLokasi File:
"+savePlainText.getSelectedFile(),"PlainText Saved!",
JOptionPane.INFORMATION_MESSAGE);
} else
JOptionPane.showMessageDialog(null, "Something
Happened?", "Gagal Menyimpan File", JOptionPane.ERROR_MESSAGE);
}

}//GEN-LAST:event_btnSavePlainTextActionPerformed

private void
menuNotepadQuitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-
FIRST:event_menuNotepadQuitActionPerformed
// TODO add your handling code here:

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
60

FuguApp.getApplication().ShowMainMenu();
FuguApp.getInstanceMainMenu().setAuthentication(true);
this.dispose();
}//GEN-LAST:event_menuNotepadQuitActionPerformed

private void
btnOpenPlainTextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-
FIRST:event_btnOpenPlainTextActionPerformed
JFileChooser openPlainText = new JFileChooser();
openPlainText.setFileSelectionMode(JFileChooser.FILES_ONLY);
openPlainText.setDialogTitle("Open Plain Text File(s)");

FileNameExtensionFilter filterFile = new


FileNameExtensionFilter("Text Documents (*.txt)", "txt", "java");
openPlainText.setFileFilter(filterFile);
try {
if
(openPlainText.showOpenDialog(this)==JFileChooser.APPROVE_OPTION) {
File selectedFile =
openPlainText.getSelectedFile();
if(selectedFile.canRead() && selectedFile.exists()){
FileInputStream fis = new
FileInputStream(selectedFile);
InputStreamReader in= new InputStreamReader(fis);
char[] buffer = new char[4194304]; // 4Mb
buffer
int n = in.read(buffer);
String plainText = new String(buffer,0,n);
textAreaPlain.setText(plainText);

long sizePlain = selectedFile.length();


String s = String.valueOf(sizePlain);
tfPlainSize.setText(s);
in.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}//GEN-LAST:event_btnOpenPlainTextActionPerformed

private void
btnResetPrivKeyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-
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
library.uns.ac.id digilib.uns.ac.id
61

private void
btnEncryptPlainTextActionPerformed(java.awt.event.ActionEvent evt)
{//GEN-FIRST:event_btnEncryptPlainTextActionPerformed

// 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, "Private
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
library.uns.ac.id digilib.uns.ac.id
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 = new
SecretKeySpec(textPasswordByte, "Blowfish");
Cipher cipher =
Cipher.getInstance("Blowfish/ECB/PKCS5Padding","BC");

// Encryption
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cipherText =
cipher.doFinal(textPlainStrByte);

int ctLength =
cipher.update(textPlainStrByte, 0, 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


ecbEnd = System.currentTimeMillis(); //
Encryption processing time (ms)
ecbTime = (ecbEnd - ecbStart); // nano to
milli
String b = String.valueOf(ecbTime); //
9223372036854775807 9223372036854775807
tfBenchmark.setText(b);

} catch (Exception e) {
System.err.println(e);
}
}

// CBC MODE

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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 = new
SecretKeySpec(textPasswordByte, "Blowfish");
IvParameterSpec ivSpec = 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 ctLength =
cipher.update(textPlainStrByte, 0, 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 = String.valueOf(cbcTime); //
9223372036854775807 9223372036854775807
tfBenchmark.setText(b);
} catch (Exception e) {
System.err.println(e);
}

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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 = new
SecretKeySpec(textPasswordByte, "Blowfish");
IvParameterSpec ivSpec = new
IvParameterSpec(ivBytes);
Cipher cipher =
Cipher.getInstance("Blowfish/OFB/NoPadding", "BC");

// Encryption
cipher.init(Cipher.ENCRYPT_MODE, key,
ivSpec);
byte[] cipherText =
cipher.doFinal(textPlainStrByte);

int ctLength =
cipher.update(textPlainStrByte, 0, 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


ofbEnd = System.currentTimeMillis(); //
Encryption processing time (ms)
ofbTime = (ofbEnd - ofbStart);
String b = String.valueOf(ofbTime); //
9223372036854775807 9223372036854775807
tfBenchmark.setText(b);

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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 = new
SecretKeySpec(textPasswordByte, "Blowfish");
IvParameterSpec ivSpec = 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 ctLength =
cipher.update(textPlainStrByte, 0, 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
library.uns.ac.id digilib.uns.ac.id
66

String b = String.valueOf(cfbTime); //
9223372036854775807 9223372036854775807
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) {//GEN-
FIRST: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()));
// BufferedWriter outs = new BufferedWriter(new
OutputStreamWriter(new
FileOutputStream(saveCipherText.getSelectedFile().getPath()),"ASCII"));
outs.write(this.textAreaCipher.getText());

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
67

outs.close();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
JOptionPane.showMessageDialog(null, "Sukses Menyimpan
File "+saveCipherText.getSelectedFile().getName()+"\nLokasi File:
"+saveCipherText.getSelectedFile(),"CipherText Saved!",
JOptionPane.INFORMATION_MESSAGE);
}
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
69

5. Lampiran 5 : Form Dekripsi (BlowfishDec.java)

/*
* BlowfishEnc.java
* @ Prasetyo Bawono
* @ jendalsepit@gmail.com
* 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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
71

private void
btnSaveCipherTextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-
FIRST: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 Menyimpan
File "+saveCipherText.getSelectedFile().getName()+"\nLokasi File:
"+saveCipherText.getSelectedFile(),"CipherText Saved!",
JOptionPane.INFORMATION_MESSAGE);
} else
JOptionPane.showMessageDialog(null, "Something
Happened?", "Gagal Menyimpan File", JOptionPane.ERROR_MESSAGE);
}

}//GEN-LAST:event_btnSaveCipherTextActionPerformed

private void
menuNotepadQuitActionPerformed(java.awt.event.ActionEvent evt) {//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) {//GEN-
FIRST:event_btnOpenCipherTextActionPerformed

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
72

// TODO add your handling code here:

JFileChooser openCipherText = new JFileChooser();


openCipherText.setFileSelectionMode(JFileChooser.FILES_ONLY);
openCipherText.setDialogTitle("Open CipherText File");

FileNameExtensionFilter filterFile = new


FileNameExtensionFilter("CipherText File (*.cip)", "cip", "CIP");
openCipherText.setFileFilter(filterFile);
try {

if(openCipherText.showOpenDialog(this)==JFileChooser.APPROVE_OPTION){
File selectedFile =
openCipherText.getSelectedFile();
if (selectedFile.canRead() && selectedFile.exists())
{
FileInputStream fis = new
FileInputStream(selectedFile);
InputStreamReader in= new InputStreamReader(fis);
char[] buffer = new char[4194304];
int n = in.read(buffer);
String CipherText = new String(buffer,0,n);
textAreaCipher.setText(CipherText);

long sizeCipher = selectedFile.length();


String s = 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 void
btnResetPrivKeyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-
FIRST:event_btnResetPrivKeyActionPerformed
// TODO add your handling code here:
if (evt.getSource() == this.btnResetPrivKey)

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
73

this.txtPassword.setText("");
}//GEN-LAST:event_btnResetPrivKeyActionPerformed

private void
btnDecryptPlainTextActionPerformed(java.awt.event.ActionEvent evt)
{//GEN-FIRST:event_btnDecryptPlainTextActionPerformed

// 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 = (new
String(textPassword)).getBytes();

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 = new
SecretKeySpec(textPasswordByte, "Blowfish");
Cipher cipher =
Cipher.getInstance("Blowfish/ECB/PKCS7Padding","BC");

// Decryption
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] plainText =
cipher.doFinal(textCipherByte);

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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 = new
SecretKeySpec(textPasswordByte, "Blowfish");
IvParameterSpec ivSpec = new
IvParameterSpec(ivBytes);
Cipher cipher =
Cipher.getInstance("Blowfish/CBC/PKCS5Padding","BC");

// Decryption
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] plainText =
cipher.doFinal(textCipherByte);

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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 = new
SecretKeySpec(textPasswordByte, "Blowfish");
IvParameterSpec ivSpec = new
IvParameterSpec(ivBytes);
Cipher cipher =
Cipher.getInstance("Blowfish/OFB/NoPadding","BC");

// Decryption
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
76

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


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 = new
SecretKeySpec(textPasswordByte, "Blowfish");
IvParameterSpec ivSpec = new
IvParameterSpec(ivBytes);
Cipher cipher =
Cipher.getInstance("Blowfish/CFB/NoPadding","BC");

// Decryption

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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 key tidak
boleh kosong!", "Error Message", JOptionPane.ERROR_MESSAGE);
}

btnResetPrivKey.setEnabled(false);;
txtPassword.setEnabled(false);
}

}//GEN-LAST:event_btnDecryptPlainTextActionPerformed

private void
btnSavePlainTextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-
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
library.uns.ac.id digilib.uns.ac.id
78

FileNameExtensionFilter filter = new


FileNameExtensionFilter("Document File (*.txt)", "txt", "TXT");
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
File "+savePlainText.getSelectedFile().getName()+"\nLokasi File:
"+savePlainText.getSelectedFile(),"PlainText Saved!",
JOptionPane.INFORMATION_MESSAGE);
}
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
80

6. Lampiran 6 : Class Koneksi Database (DriverConnection.java)


/**
* Class Koneksi ke Database untuk Login
*
* @ Prasetyo Bawono
* @ jendalsepit@gmail.com
* 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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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 BLOCK_SIZE = 8; // bytes = 64 bits
private static final int SBOX_SK = 256;
private static final int P_SZ = ROUNDS+2;

private final int[] S0, S1, S2, S3; // the s-boxes


private final int[] P; // 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 encrypting,
CipherParameters params)
{

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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 xl,
int 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; // end of cycle swap

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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 srcIndex,
byte[] dst,
int dstIndex)
{
int xl = BytesTo32bits(src, srcIndex);
int xr = BytesTo32bits(src, srcIndex+4);

xl ^= P[0];

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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[] IV;
private byte[] cbcV;
private byte[] cbcNextV;

private int blockSize;


private BlockCipher cipher = null;
private boolean encrypting;

/**
* Basic constructor.
*
* @param cipher the block cipher to be used as the basis of
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
library.uns.ac.id digilib.uns.ac.id
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 encrypting,
CipherParameters 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
library.uns.ac.id digilib.uns.ac.id
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 inOff,
byte[] out,
int outOff)
throws DataLengthException, IllegalStateException
{
return (encrypting) ? encryptBlock(in, inOff, out, outOff) :
decryptBlock(in, inOff, out, outOff);
}

/**

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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[] in,
int inOff,
byte[] out,
int 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
library.uns.ac.id digilib.uns.ac.id
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 inOff,
byte[] 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
library.uns.ac.id digilib.uns.ac.id
100

*/
byte[] tmp;

tmp = cbcV;
cbcV = cbcNextV;
cbcNextV = tmp;

return length;
}
}

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
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[] cfbV;
private byte[] cfbOutV;

private int blockSize;


private BlockCipher cipher = null;
private boolean 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
library.uns.ac.id digilib.uns.ac.id
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 encrypting,
CipherParameters 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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
104

byte[] in,
int inOff,
byte[] out,
int outOff)
throws DataLengthException, IllegalStateException
{
return (encrypting) ? encryptBlock(in, inOff, out, outOff) :
decryptBlock(in, 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 inOff,
byte[] 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
library.uns.ac.id digilib.uns.ac.id
105

out[outOff + i] = (byte)(cfbOutV[i] ^ in[inOff + i]);


}

//
// change over the input block.
//
System.arraycopy(cfbV, blockSize, cfbV, 0, cfbV.length -
blockSize);
System.arraycopy(out, outOff, cfbV, cfbV.length - blockSize,
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 inOff,
byte[] 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
library.uns.ac.id digilib.uns.ac.id
106

// change over the input block.


//
System.arraycopy(cfbV, blockSize, cfbV, 0, cfbV.length -
blockSize);
System.arraycopy(in, inOff, cfbV, cfbV.length - blockSize,
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
library.uns.ac.id digilib.uns.ac.id
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[] ofbV;
private byte[] 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
library.uns.ac.id digilib.uns.ac.id
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
library.uns.ac.id digilib.uns.ac.id
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[] in,
int inOff,

Prasetyo Bawono, S.Si


Universitas Sebelas Maret
library.uns.ac.id digilib.uns.ac.id
110

byte[] 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(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, ofbV, 0, ofbV.length -
blockSize);
System.arraycopy(ofbOutV, 0, ofbV, ofbV.length - blockSize,
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

Anda mungkin juga menyukai