The RC4 cipher has two parts: firstly key set up and secondly, data encryption. The key setup is as follows:
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
...whilst the data encryption algorithm is:
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
The RC4 protocol has been widely documented and more details can be found on Wikipedia from where I copied the above.
The following is what I call my RC4Lite implementation of the above algorithms and it’s called RC4Lite because it really does seem simple:
public final class RC4Lite {
private static int MAX_SIZE = 256;
private final byte[] state = new byte[MAX_SIZE];
public void encrypt(byte[] src, int srcOffset, byte[] dest, int destOffset,
int length) {
int end = srcOffset + length;
int i = 0;
int j = 0;
int l = destOffset;
for (int k = srcOffset; k < end; k++, l++) {
i = (i + 1) & 0xff;
j = (j + state[i]) & 0xff;
swap(i, j);
int m = (state[i] + state[j]) & 0xff;
dest[l] = (byte) (state[m] ^ src[k]);
}
}
private void swap(int i, int j) {
byte temp = state[i];
state[i] = state[j];
state[j] = temp;
}
public void decrypt(byte[] src, int srcOffset, byte[] dest, int destOffset, int length) {
encrypt(src, srcOffset, dest, destOffset, length);
}
public void setKey(byte[] key) {
initStateArray();
createKey(key);
}
private void initStateArray() {
for (int i = 0; i < MAX_SIZE; i++) {
state[i] = (byte) i;
}
}
private void createKey(byte[] key) {
int j = 0;
for (int i = 0; i < MAX_SIZE; i++) {
j = (j + state[i] + key[i % key.length]) & 0xff;
swap(i, j);
}
}
}
No comments:
Post a comment