Sabtu, 06 Oktober 2012

Algoritma RC4 dan Implementasi Kode

RC4 adalah penyandian stream cipher yang dibuat oleh Ron Riverst pada tahun 1987 untuk pengamanan RSA. Algoritmanya didasarkan pada permutasi acak. Kunci dengan panjang variable 1 – 256 bytes digunakan untuk inisialisasi sebuah state.

Vector S dengan panjang 256 byte, dengan elemen S[0], S[1],…,S[255]. S terdiri dari permutasi semua bilangan 8 bit dari 0 – 255 untuk enkripsi atau deskripsi, sebuah byte K dibangkitkan dari S dengan memilih 1 dari 255 entri dengan cara sistematis. Setiap kali k dibangkitkan, entri-entri pada S sekali lagi dipermutasikan. ^ inisialisasi S Entri – entri S di set dari 0 – 255 dengan urutan naik; S[0] = 0, S[1] = 1,….,S[255] = 255.

 vektor sementara T juga dibuat. Jika panjang kunci dari K =256 byte, lalu K di transper ke T. Jika tidak, untuk setiap kunci dengan panjang keylen byte, elemen keylen pertama T dicopykan dari K. Dan K diulang beberapa kali untuk mengisi T. /* inisialisasi */ for i = 0 to 255 do S[i] = i; T[i] = K [i % keylen];

 lalu kita menggunakan T untuk menginisialisasi permutasi S. Dimulai dengan S[0] hingga S[255] dan untuk setiap S[i], tukar S[i] dengan byte lainnya pada S berdasarkan skema. /* inisial permutasi */ j = 0; for i = 0 to 255 do j = (j + S[i] + T[i] % 256 ); swap ( s[i], S[j] );

karena operasi pada S hanya pertukaran maka hanya terjadi permutasi dengan S tetap semua bilangan antara 0 – 255. ^ Pembangkitan Stream Setelah S diinisialisasi, key input tidak lagi dipakai.

 Pembangkitan stream dimulai dengan S[0] – S[255] dan untuk setiap S[i], menukar S[i] dengan byte lainnyadalam S berdasarkan skema berikut.

 Setelah S[255] dicapai proses berlanjut, dimulai kembali dari S[0]. /* stream generation */ i,j = 0; While (true) i = ( i+1 ) % 256; j = ( j + S[i]) % 256; swap ( S[i], S[j] ); t = ( S[i], S[j] )% 256; k= S[t]; untuk enkripsi, XOR nilai K dengan byte selanjutnnya pada plainteks.

Untuk dekripsi, XOR nilai K denganbyte selanjutnya pada cipherteks.

 import java.io.*;
 public class RC4 { f
inal String plaintext="Halo Adi Apa Kabar";
final String kunci="halo apa kabar";
 public static void main (String [] args) throws IOException { RC4 xx=new RC4(); xx.mulai(); }
 void mulai(){ int i, j = 0; char [] key;
 int keylen = 0; int k = 0;

 int [] SBox = new int [256]; key = new char[kunci.length()]; for (k=0; k"+Integer.toHexString(chiper).toUpperCase()+"\t"+"CHIPPER\t\t=>"+Character.toChars(chiper)); //chipertext } } }

 public class RC4 { private byte state[] = new byte[256];
 private int x; 

 private int y; public RC4(String key) throws NullPointerException { this(key.getBytes()); }
 public RC4(byte[] key) throws NullPointerException { 
for (int i=0; i < 256; i++) { state[i] = (byte)i; }
 x = 0; y = 0; int index1 = 0; int index2 = 0; 
byte tmp; if (key == null || key.length == 0) { 
throw new NullPointerException(); }

 for (int i=0; i < 256; i++) {
 index2 = ((key[index1] & 0xff) + (state[i] & 0xff) + index2) & 0xff; tmp = state[i];
 state[i] = state[index2]; state[index2] = tmp; index1 = (index1 + 1) % key.length; } }

 public byte[] rc4(String data) { if (data == null) { return null; } 

 byte[] tmp = data.getBytes(); this.rc4(tmp); return tmp; }
 public byte[] rc4(byte[] buf) {
 //int lx = this.x;
 //int ly = this.y;
 int xorIndex; 
byte tmp;

 if (buf == null) { return null; }

 byte[] result = new byte[buf.length]; 
 for (int i=0; i < buf.length; i++) { 
 x = (x + 1) & 0xff; y = ((state[x] & 0xff) + y) & 0xff; 
tmp = state[x]; state[x] = state[y];
 state[y] = tmp; 
xorIndex = ((state[x] &0xff) + (state[y] & 0xff)) & 0xff;
 result[i] = (byte)(buf[i] ^ state[xorIndex]); } 
//this.x = lx; //this.y = ly; return result; } }

Tidak ada komentar:

Posting Komentar