Kamis, 13 Maret 2008

Metode Enskripsi Blowfish

Blowfish merupakan metoda enkripsi yang mirip dengan DES (DES-like cipher) dan diciptakan oleh Bruce Schneier yang ditujukan untuk mikroposesor besar (32 bit ke atas dengan cache data yang besar). Blowfish dikembangkan untuk memenuhi kriteria disain sebagai berikut:

  • Cepat, pada implementasi yang optimal Blowfish dapat mencapai kecepatan 26 clock cycle per byte.
  • Kompak, Blowfish dapat berjalan pada memori kurang dari 5 KB.
  • Sederhana, Blowfish hanya menggunakan operasi yang simpel: penambahan (addition), XOR, dan penelusuran tabel (table lookup) pada operand 32 bit. Desainnya mudah untuk dianalisa yang membuatnya resisten terhadap kesalahan implementasi.
  • Keamanan yang variabel, panjang kunci Blowfish dapat bervariasi dan dapat mencapai 448 bit (56 byte).

Blowfish dioptimasikan untuk aplikasi dimana kunci tidak sering berubah, seperti jalur komunikasi atau enkripsi file otomatis. Blowfish jauh lebih cepat dari DES bila diimplementasikan pada 32 bit mikroprosesor dengan cache data yang besar, seperti Pentium dan Power PC, Blowfish tidak cocok untuk aplikasi seperti packet switching, dengan perubahan kunci yang sering, atau sebagai fungsi hash satu arah. Kebutuhan memorinya yang besar tidak memungkinkan untuk aplikasi kartu pintar (smart card).

Deskripsi dari Blowfish

Blowfish merupakan blok cipher 64-bit dengan panjang kunci variabel. Algoritma ini terdiri dari dua bagian: key expansion dan enkripsi data. Key expansion merubah kunci yang dapat mencapai 448 bit menjadi beberapa array subkunci (subkey) dengan total 4168 byte.

Enkripsi data terdiri dari iterasi fungsi sederhana sebanyak 16 kali. Setiap putaran terdiri dari permutasi kunci-dependent dan substitusi kunci- dan data-dependent. Semua operasi adalah penambahan dan XOR pada variable 32-bit. Tambahan operasi lainnya hanyalah empat penelusuran tabel (table lookup) array berindeks untuk setiap putaran.

Blowfish menggunakan subkunci yang besar. Kunci ini harus dihitung sebelum enkripsi atau dekripsi data.

Array P terdiri dari delapan belas 32-bit subkunci:

P1,P2, . . . ,P18

Empat 32-bit S-box masing-masing mempunyai 256 entri:

S1,0, S1,1, . . . , S1,255

S2,0, S2,1, . . . , S2,255

S3,0, S3,1, . . . , S3,255

S4,0, S4,1, . . . , S4,255

Metoda selengkapnya untuk menghitung subkunci ini akan dijelaskan pada bagian bawah.

Blowfish merupakan algoritma yang menerapkan jaringan Feistel (Feistel network) yang terdiri dari 16 putaran. Input merupakan elemen 64 bit, X. Untuk mengenkrip:

Bagi X menjadi dua 32-bit: XL, XR

untuk i = 1 sampai 16

XL = XL xor Pi

XR = F(XL) xor XR

Tukar XL dan XR

Tukar XL dan XR (batalkan penukaran terakhir)

XR = XR xor P17

XL = XL xor P18

Kombinasikan kembali XL dan XR

Fungsi F adalah sebagai berikut:

Bagi XL, menjadi empat bagian 8-bit: a, b, c dan d

F(XL) = ((S1,a + S2,b mod 232) xor S3,c) + S4,c mod 232

Dekripsi sama persis dengan enkripsi, kecuali P1, P2, . . . , P18 digunakan pada urutan yang terbalik.

Subkunci dihitung menggunakan algoritma Blowfish, metodanya adalah sebagai berikut:

  1. Pertama-tama inisialisasi P-array dan kemudian empat S-box secara berurutan dengan string yang tetap. String ini terdiri digit hexadesimal dari pi.
  2. XOR P1 dengan 32 bit pertama kunci, XOR P2 dengan 32 bit kedua dari kunci dan seterusnya untuk setiap bit dari kunci (sampai P18). Ulangi terhadap bit kunci sampai seluruh P-array di XOR dengan bit kunci.
  3. Enkrip semua string nol dengan algoritma Blowfish dengan menggunakan subkunci seperti dijelaskan pada langkah (1) dan (2).
  4. Ganti P1 dan P2 dengan keluaran dari langkah (3)
  5. Enkrip keluaran dari langkah (3) dengan algoritma Blowfish dengan subkunci yang sudah dimodifikasi.
  6. Ganti P3 dan P4 dengan keluaran dari langkah (5).
  7. Lanjutkan proses tersebut, ganti seluruh elemen dari P-array, dan kemudian seluruh keempat S-box berurutan, dengan keluaran yang berubah secara kontinyu dari algoritma Blowfish.

Total diperlukan 521 iterasi untuk menghasilkan semua subkunci yang dibutuhkan. Aplikasi kemudian dapat menyimpan subkunci ini dan tidak dibutuhkan langkah-langkah proses penurunan ini berulang kali, kecuali kunci yang digunakan berubah.

Keamanan dari Blowfish

Tidak ada kelemahan yang berarti dari algoritma Blowfish yang dapat ditemukan sampai saat ini, kecuali adanya weak key, dimana dua entri dari S-box mempunyai nilai yang sama. Tidak ada cara untuk mencek weak key sebelum melakukan key expansion. Bila dikuatirkan hal ini dapat mengurangi keamanannya maka dapat dibuat rutin untuk mengecek entri S-box, walaupun hal ini tidak perlu.

Sampai saat ini tidak ada cryptanalysis yang berhasil tehadap Blowfish, untuk amannya jangan menggunakan Blowfish dengan kurang dari 16 putaran (round).

Aplikasi

Untuk mengaplikasikan metoda ini penulis membuat rutin dengan menggunakan Delphi yang dapat dilihat pada unit Blowfish.pas dan tabel inisialisasi bf_init.inc. Untuk mengecek kebenaran implementasi dari algortima ini penulis juga melengkapinya dengan prosedur self test yang dapat dilihat hasilnya dengan menjalankan program BFTest.dpr.

Saat ini banyak sekali aplikasi security yang menggunakan Blowfish sebagai metoda enkripsinya, untuk melihat aplikasi apa saja yang sudah menggunakan metoda ini dapat dilihat websitenya di Counterpane.

1 komentar:

Men Yau mengatakan...

Pak Basri, salam kenal. Saya studi Teknik Informatika di Makassar. Sya tertarik dengan algoritma blowfish. Tapi kok, blowfish.pas dan tabel inisialisasinya nggak bisa dibuka yah ? Pak Basri ada perhitungan manual algoritma blowfish nggak ? Thnx. GBU.