function rc4_init(key, key_size) local trans = {} local i, j for i = 0, 255 do trans[i] = i end j = 0 for i = 0, 255 do j = bin.imod((j + trans[i] + key[bin.imod(i, key_size) + 1]), 256) trans[i], trans[j] = trans[j], trans[i] end trans.i = 0 trans.j = 0 function trans:GenOut() self.i = bin.imod(self.i + 1, 256) self.j = bin.imod(self.j + self[self.i], 256) self[self.i], self[self.j] = self[self.j], self[self.i] return self[bin.imod(self[self.i] + self[self.j], 256)] end function trans:scramble(stream, stream_size) for i = 1, stream_size do stream[i] = bin.bxor(stream[i], self:GenOut()) end return stream end return trans end --[[ rc4_test_key = { 25, 68, 153, 64, 32, 129, 39, 202, } rc4_test_message = { 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, } rc4_test_message_enc = { 97, 229, 213, 202, 178, 220, 16, 247, 75, 226, 135, 179, 111, 12, 30, 123, } function rc4_test() local trans, enc, dec, i trans = rc4_init(rc4_test_key, 8) enc = trans:scramble(rc4_test_message, 16) for i = 1, 16 do assert(enc[i] == rc4_test_message_enc[i]) end trans = rc4_init(rc4_test_key, 8) dec = trans:scramble(enc, 16) for i = 1, 16 do assert(dec[i] == rc4_test_message[i]) end end ]]