Ron’s Cipher #4
September 4, 2009
RC4 is a stream cipher, similar to the Blum Blum Shub cipher of an earlier exercise, invented by Ron Rivest in 1987. RC4 provides encryption for the SSL protocol that permits secure internet connections and the WEP protocol that secures wireless networks.
RC4 works by using a key to initialize a 256-byte array, which then forms the basis of a pseudo-random byte generator. The stream of random bytes is xor’ed with plaintext to produce ciphertext; decryption is performed by xor’ing the same stream of random bytes with the ciphertext to produce plaintext.
The key array K is initialized like this:
for i from 0 to 255
K[i] := i
j := 0
for i from 0 to 255
j := (j + K[i] + key[i mod klen]) mod 256
swap K[i], K[j]
Once the key array is initialized, the pseudo-random byte generator uses a similar calculation to build the stream of random bytes:
i := 0
j := 0
start:
i := (i + 1) mod 256
j := (j + K[i]) mod 256
swap K[i], K[j]
output K[ (K[i] + K[j]) mod 256 ]
goto start
Your task is to write a function that takes a key and a text and produces the corresponding output text; the same function can be used for both encryption and decryption. When you are finished, you are welcome to read or run a suggested solution, or to post your solution or discuss the exercise in the comments below.
[…] Praxis – Ron’s Cipher #4 By Remco Niemeijer In today’s Programming Praxis problem, we have to implement the RC4 cipher, which is often used in protocols […]
My Haskell solution (see http://bonsaicode.wordpress.com/2009/09/04/programming-praxis-ron%E2%80%99s-cipher-4/ for a version with comments):
[…] […]
[…] in point, I’ll use the recent kata from Programming Praxis for this Python exercise, as they provide straightforward pseudocode. Here’s the encryption […]
[…] consecutive shift characters enter or leave caps-lock mode. Otherwise, RC40 is exactly the same as RC4, except that all references to 256 are changed to […]