Sejarah RC4
Algoritma kriptografi Rivest Code 4 (RC4)
merupakan salah satu algoritma kunci simetris dibuat oleh RSA Data Security Inc
(RSADSI) yang berbentuk stream chipper. Algoritma ini ditemukan pada tahun 1987
oleh Ronald Rivest dan menjadi simbol keamanan RSA(merupakan singkatan dari
tiga nama penemu: Rivest Shamir Adleman). RC4 merupakan enkripsi stream
simetrik proprietary yang dibuat oleh RSA Data Security Inc (RSADSI).
Penyebarannya diawali dari sebuah source code yang diyakini sebagai RC4 dan
dipublikasikan secara 'anonymously' pada tahun 1994. Algoritma yang
dipublikasikan ini sangat identik dengan implementasi RC4 pada produk resmi.
RC4 digunakan secara luas pada beberapa aplikasi dan umumnya dinyatakan sangat
aman. Sampai saat ini diketahui tidak ada yang dapat memecahkan/membongkarnya,
hanya saja versi ekspor 40 bitnya dapat dibongkar dengan cara "brute
force" (mencoba semua kunci yang mungkin). RC4 tidak dipatenkan oleh
RSADSI, hanya saja tidak diperdagangkan secara bebas (trade secret). RC4 adalah salah satu bentuk stream
cipher yang banyak digunakan pada protokol-protokol enkripsi, antara lain WEP,
WPA, dan SSL/TSL. RC4 merupakan salah satu jenis stream cipher,
yaitu memproses unit atau input data, pesan atau informasi pada satu saat. Unit
atau data pada umumnya sebuah byte atau bahkan kadang kadang bit (byte
dalam hal RC4). Dengan cara ini enkripsi atau dekripsi dapat dilaksanakan pada
panjang yang variabel. Algoritma ini tidak harus menunggu sejumlah input data,
pesan atau informasi tertentu sebelum diproses, atau menambahkan byte tambahan
untuk mengenkrip. Contoh stream cipher adalah RC4, Seal, A5, Oryx, dan
lain-lain. Tipe lainnya adalah block cipher yang memproses sekaligus sejumlah
tertentu data (biasanya 64 bit atau 128 bit blok), contohnya : Blowfish, DES,
Gost, Idea, RC5, Safer, Square, Twofish, RC6, Loki97, dan lain-lain.
Deskripsi Kerja
Algoritma RC4
Algoritma RC4 menggunakan dua buah S-Box
yaitu array sepanjang 256 yang berisi permutasi dari bilangan 0 sampai 255, dan
S-Box kedua, yang berisi permutasi merupakan fungsi dari kunci dengan panjang
yang variable. RC4 membangkitkan
aliran bit pseudorandom
(keystream ). Seperti
halnya stream cipher, ini dapat digunakan
untuk enkripsi dengan menggabungkan plaintext
menggunakan XOR ,
dekripsi dilakukan dengan cara yang sama (karena eksklusif-atau adalah operasi simetris). Mirip dengan cipher Vernam kecuali
bahwa bit pseudorandom yang dihasilkan, bukan aliran disiapkan, yang digunakan Untuk menghasilkan keystream,
cipher menggunakan suatu keadaan internal rahasia yang terdiri dari dua bagian:
1. Sebuah permutasi dari semua 256 byte mungkin (dilambangkan "S" di bawah).
2. Dua 8-bit indeks-pointer (dilambangkan "i" dan "j").
Permutasi diinisialisasi dengan kunci panjang variabel, biasanya antara 40 dan 256 bit, menggunakan algoritma key-scheduling (KSA). Selanjutnya, aliran bit yang dihasilkan dengan menggunakan algoritma pseudo-acak generasi (PRGA).
1. Sebuah permutasi dari semua 256 byte mungkin (dilambangkan "S" di bawah).
2. Dua 8-bit indeks-pointer (dilambangkan "i" dan "j").
Permutasi diinisialisasi dengan kunci panjang variabel, biasanya antara 40 dan 256 bit, menggunakan algoritma key-scheduling (KSA). Selanjutnya, aliran bit yang dihasilkan dengan menggunakan algoritma pseudo-acak generasi (PRGA).
Lebih spesifiknya, RC4 beroperasi
dengan langkah-langkah sebagai berikut :
1) Melakukan
inisialisasi nilai S
Cara kerja algoritma RC4
yaitu inisialisasi SBox pertama, S[0],S[1],...,S[255], dengan bilangan 0 sampai
255. Pertama isi secara berurutan S[0] = 0, S[1] =1,...,S[255] = 255. Kenudian
inisialisasi array lain (S-Box lain), misal array K dengan panjang 256. Isi
array K dengan kunci yang diulangi sampai seluruh array K[0], K[1],...,K[255]
terisi seluruhnya. Proses inisialisasi S-Box (Array S), Secara pseudocode, langkah ini dapat dituliskan sebagai
berikut :
for i from
0 to 255
S[i] := i
endfor
j := 0
for i from
0 to 255
j := (j +
S[i] + key[i mod keylength])
mod 256
swap
values of S[i] and S[j]
endfor
|
2) Pencarian
nilai keystream (k)
Pencarian
nilai keystream dilakukan dengan melakukan pertukaran lagi antar elemen S,
tetapi salah satu nilai S kemudian disimpan pada k yang kemudian digunakan
sebagai keystream. Lebih jelasnya dapat dilihat pada pseudocode dibawah ini
i := 0 j := 0 while GeneratingOutput: i := (i + 1) mod 256
j := (j + S[i]) mod 256
swap values of S[i] and S[j]
K := S[(S[i] + S[j]) mod 256]
output K
endwhile |
nilai k
inilah yang kemudian digunakan sebagai keystream.
3) Operasi
XOR k dengan plaintext
nilai k yang
sudah didapatkan dari langkah di atas kemudian dimasukkan dalam operasi XOR
dengan plaintext yang ada, dengan sebelumnya pesan dipotong-potong terlebih
dahulu menjadi byte-byte. Setelah operasi ini dilakukan, langkah 1) kembali dilakukan untuk
mendapatkan indeks baru dari setiap elemen S.
Kelemahan
Algoritma RC4
Salah
satu kelemahan dari RC4 adalah terlalu tingginya kemungkinan terjadi tabel
S-box yang sama, hal ini terjadi karena kunci user diulang-ulang untuk mengisi
256 bytes, sehingga 'aaaa' dan 'aaaaa' akan menghasilkan permutasi yang sama.
Untuk mengatasi ini maka pada implementasinya nanti kita menggunakan hasil hash
160 bit SHA dari password kita untuk mencegah hal ini terjadi. Kekurangan
lainnya ialah karena enkripsi RC4 adalah XOR antara data bytes dan pseudo-random
byte stream yang dihasilkan dari kunci, maka penyerang akan mungkin untuk
menentukan beberapa byte pesan orisinal dengan meng-XOR dua set cipher byte,
bila beberapa dari pesan input diketahui (atau mudah untuk ditebak). Untuk
mengatasinya pada aplikasinya kita menggunakan initialization vector (IV) yang
berbeda-beda untuk setiap data, sehingga bahkan untuk file yang sama akan
dihasilkan ciphertext yang berbeda. IV ini tidak perlu dirahasikan
karena digunakan hanya agar setiap proses enkripsi akan menghasilkan ciphertext
yang berbeda.
Untuk lebih
meningkatkan keamanan dari metoda ini dapat juga mengembangkan inisialisasi
kunci yang baru yang kita sebut saja inisialisasi SK (strengtened key),
pada proses ini kunci user di-expand hingga 260 byte (tetapi kemudian
hanya 256 byte saja yang digunakan) dengan menggunakan SHA-1, caranya pertama
kunci user dijadikan kunci, kemudian 1-20 byte pertama pada buffer diproses
dengan SHA kemudian digestnya diletakan pada 20 byte pertama, kemudian diambil
byte 1-40 diproses dengan SHA dan hasilnya diletakan mulai pada byte 20,
berikutnya byte 1-60 hasilnya diletakkan pada mulai byte 40, dan seterusnya.
Kemudian buffer ini dienkrip dengan RC4, lalu buffer dijadikan kunci kembali,
proses terakhir ini diulang sebanyak 16 kali untuk mencoba mencampur dengan
baik sehingga dihasilkan kunci yang se-random mungkin.
Untuk lebih
jelas tetang proses ini dapat dilihat pada listing. Penggunaan SHA pada proses
inisialisasi kunci bukanlah hal yang baru, hal ini dapat dilihat pada proses inisialisasi
kunci SEAL misalnya. Penggunaan proses primitif enkripsi pada inisialisasi
kunci juga digunakan juga pada Blowfish ataupun Cobra-128. Secara teoritis
dengan proses ini akan ekivalen dengan menggunakan kunci sebesar 2048 bit,
walaupun penulis sendiri tidak yakin akan hal ini (mungkin pembaca ada yang
bisa memberikan tanggapan). Metoda ini tampaknya sedikit lebih rumit dari pada
inisialisasi kunci standar, tetapi pada Pentium 133 prosesnya hanya memerlukan
waktu kurang sari 10ms saja. Metoda ini walaupun kami anggap lebih kuat, tetapi
belum teruji sehingga dalam penerapan aplikasinya terdapat dua pilihan yaitu
dengan metoda SK ini atau dengan metoda standar.