| |
RC4 STREAM CIPHER
Oleh : Budi Sukmawan, Sept. 1998
Algoritma
RC4 merupakan salah satu jenis stream cipher, yaitu memproses
unit atau input data 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 tertentu sebelum diproses, atau menambahkan
byte tambahan untuk mengenkrip. Contoh stream cipher adalah RC4,
Seal, A5, Oryx, dll. 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, dll.
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).
Algoritma RC4 cukup mudah untuk dijelaskan. RC4 mempunyai
sebuah S-Box, S0,S1,...,S255,
yang berisi permutasi dari bilangan 0 sampai 255, dan permutasi
merupakan fungsi dari kunci dengan panjang yang variabel.
Terdapat dua indeks yaitu i dan j, yang diinisialisasi dengan
bilangan nol. Untuk menghasilkan random byte langkahnya adalah
sebagai berikut :
i = ( i + 1 ) mod 256
j = ( j + Si ) mod 256
swap Si dan Sj
t = (Si + Sj) mod 256
K = St
Byte K di XOR dengan plainteks untuk menghasilkan cipherteks
atau di XOR dengan cipherteks untuk menghasilkan plainteks.
Enkripsi sangat cepat kurang lebih 10 kali lebih cepat dari DES.
Inisialisasi S-Box juga sangat mudah. Pertama isi secara
berurutan S0 = 0, S1 = 1,...,S255
= 255. Kemudian isi array 256 byte lainnya dengan kunci yang
diulangi sampai seluruh array K0, K1,...,K255
terisi seluruhnya. Set indeks j dengan nol, Kemudian lakukan
langkah berikut :
for i = 0 to 255
j = (j + Si + Ki) mod 256
swap Si dan Sj
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 penulis 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 penulis anggap lebih kuat, tetapi belum teruji
sehingga dalam penerapan aplikasinya penulis memberikan dua
pilihan yaitu dengan metoda SK ini atau dengan metoda standar.
Performance
Kecepatan enkripsi dari RC4 cukup baik, hal ini terjadi karena
proses enkripsinya yang cukup sederhana dan hanya melibatkan
beberapa operasi saja per bytenya. Untuk lebih jelasnya penulis
mencoba membandingkannya pada beberapa platform hardware.
Kecepatan ini adalah kecepatan enkripsi di memori, karena dalam
proses enkripsi file sesungguhnya melibatkan banyak faktor lain
seperti interface IO, tipe Hardisk, dll. Hasil perbandingan ini
dapat dilihat pada tabel, yang didapat dengan enkripsi 256 byte
per blok sebanyak 20480 kali, atau setara dengan kurang lebih 5MB
data.
Delphi 1.0 pada Windows for Workgroups 3.11
Prosesor
|
Memori
(MB)
|
Kecepatan
(KBytes/detik)
|
| 486/DX4-100 |
16
|
557,067
|
| Pentium 100 |
32
|
1.079,713
|
| Pentium 166 |
16
|
1.792,717
|
Delphi 4.0 pada Windows 95, kecuali Pentium Pro pada Windows
NT 4.0 Server
Prosesor
|
Memori
(MB)
|
Kecepatan
(KBytes/detik)
|
| 486/DX4-100 |
16
|
2.563,846
|
| Pentium 100 |
16
|
4.285,714
|
| Pentium 133 |
32
|
5.380,035
|
| Pentium 166MMX |
32
|
7.191,522
|
| Pentium 200MMX |
32
|
8.668,172
|
| Pentium Pro 200 |
64
|
10.651,872
|
Test dilakukan masing-masing sebanyak tiga kali kemudian
hasilnya dirata-ratakan. Sebagai perbandingan kecepatan Blowfish
adalah sekitar 2.300 KB/detik pada Pentium 133 (pada 8 byte per
blok).
Aplikasi
Untuk mengimplementasikan metode diatas penulis membuat sebuah
aplikasi sederhana untuk pengenkripan file. Aplikasi ini kita
sebut saja PC-Crypt versi 1.0. Aplikasi ini dapat dicompile
dengan semua versi Delphi. Aplikasi ini sengaja dibuat
sesederhana mungkin, sehingga sangat mudah untuk digunakan. Pada
aplikasi ini kita dapat memilih untuk menggunakan inisialisasi
kunci standar (Standard Method) atau inisialisasi kunci yang
sudah diperkuat (SK Method). Selain itu pada input kunci kita
dapat memasukkan karakter karakter ASCII tertentu (0-255) dengan
menggunakan karakter "\" (backslash), misalnya : "PassWord\25saya\23\112\245".
Bila kita memasukkan angka lebih dari 255 maka akan di-mask
dengan $FF sehingga hasilnya akan selalu dalam range 0-255.
Sedangkan bila akan memasukkan karakater "\" dapat
dilakukan dengan menginput "\\". Dengan cara ini dan
dengan mencampur pemasukan password dengan huruf besar kecil,
maka kerahasiaan password kita akan lebih terjaga. Hal lainnya
adalah option untuk menghapus file sumber kita secara aman,
terdapat tiga pilihan yaitu : Delete only, Simple Method, DoD+
Method. Pada Delete only file sumber akan dihapus begitu saja
setelah operasi enkrip selesai. Untuk simple method data sumber (plaintext)
akan ditimpa (di-rewrite) dengan bilangan random sebanyak satu
kali (1 pass) kemudian dihapus. Sedangkan untuk DoD+ Method
plaintext ditimpa dengan pola bit 11, kemudian pola bit 00, lalu
dengan pola bit 1 dan 0 lalu ditimpa dengan bilangan random baru
dihapus. Bila option ini dipilih pada saat pendekripan maka data
ciphertext yang akan dihapus.

Keamanan
Bagaimana tingkat keamanan dengan kunci 160 bit ini? Bila kita
anggap tidak ada kelemahan lain pada RC4 dan SHA maka untuk
memecahkannya yang paling mungkin adalah dengan serangan "brute
force", maka keamanan data tergantung sepenuhnya pada
panjang kunci. Dengan 160 bits terdapat 2160 kunci
yang mungkin. Bila kita anggap rata-rata diperlukan setengahnya
untuk mendapat kunci yang benar (kurang lebih 1048 ).
Lalu kita buat beberapa asumsi tentang peralatan yang digunakan
untuk memecahkan kunci tersebut :
- Terdapat 1 milyar komputer yang digunakan.
- Setiap komputer digunakan sepenuhnya untuk memecahkan
kunci tersebut.
- Setiap komputer dapat mencoba 1 milyar kunci per detik.
Dengan peralatan demikian maka dibutuhkan 1013
tahun untuk mendapatkan kunci tersebut. Ini sama dengan 1000 kali
usia alam semesta! (sumber : Cryptext homepage).
Pengembangan
Bagi yang kreatif tentu dapat mengembangkan aplikasi ini
seperti Cryptext misalnya, yang merupakan extension dari Windows
95/NT shell, yang juga menggunakan RC4 dan SHA. Untuk
meningkatkan keamanan data dapat ditambahkan proses kompresi
sebelum pengenkripan, karena cryptanalisys mengandalkan pada
redundansi pada plainteks, mengkompresi sebelum enkripsi
mengurangi redundansi ini. Pengembangan lainnya adalah dalam
penghapusan data sumber, cara yang lebih aman adalah dengan
menulis langsung ke hardisk tanpa melalui disk cache, karena ada
kemungkinan data belum dituliskan semua ke-harddisk ketika
dihapus (karena masih ada didalam cache). Untuk Win32 kita dapat
melakukan ini dengan API CreateFile dengan flags FILE_FLAG_WRITE_THROUGH
atau FILE_FLAG_NO_BUFFERING. Cara penghapusan lain yang lebih
aman ialah dengan metoda yang dikembangkan oleh Peter Gutmann
seperti pada SFS-nya (maka kita sebut saja metoda SFS). Dengan
metoda SFS ini data di-rewrite sebanyak 35 kali dengam pola-pola
bit tertentu, dengan cara ini diharapkan permukaan magnetis dari
hardisk sama dengan diekpos dengan medan magnit. Tetapi dengan
cara inipun menurutnya masih ada kemungkinan data masih dapat di-recover
dengan peralatan hardware yang canggih (terutama untuk hardisk-hardisk
lama dengan densitas yang rendah). Metoda penghapusan SFS ini
mungkin akan penulis bahas pada artikel lain.
Penutup
Walaupun penulis telah berusaha mentest aplikasi ini
seintensif mungkin, tetapi tentu saja tidak ada aplikasi yang
sempurna, untuk itu bila terdapat bug atau error pembaca dapat
menyempurnakannya sendiri karena semua source programnya tersedia.
Dan walaupun masih sangat sederhana penulis berharap aplikasi ini
dapat digunakan dan ada manfaatnya bagi pembaca sekalian.
Referensi :
1. BSAFE User Manual
2. Peter C. Gutmann, SFS 1.20 Document
3. Bruce Schneier, Applied Cryptography : Protocols,
Algorithms, and Source Code in C, 2nd Edition

|
|