SHOW:
|
|
- or go back to the newest paste.
1 | --[[ RC4 Encryption - NeverCast | |
2 | --]] | |
3 | ||
4 | local function swapStateIndicies( state ) | |
5 | local t = state.schedule[state.i] | |
6 | state.schedule[state.i] = state.schedule[state.j] | |
7 | state.schedule[state.j] = t | |
8 | end | |
9 | ||
10 | local function swapIndicies( sch, i, j ) | |
11 | local t = sch[i] | |
12 | sch[i] = sch[j] | |
13 | sch[j] = t | |
14 | end | |
15 | ||
16 | local function createKeySchedule( sKey ) | |
17 | local nKeyLength = string.len(sKey) | |
18 | local tKey = { string.byte( sKey, 1, nKeyLength) } | |
19 | if nKeyLength < 1 or nKeyLength > 256 then | |
20 | error("Key length out of bounds. 1 <= length <= 256") | |
21 | end | |
22 | local tSch = {} | |
23 | for i = 0, 255 do | |
24 | tSch[i] = i | |
25 | end | |
26 | local j = 0 | |
27 | for i = 0, 255 do | |
28 | j = ( j + tSch[i] + tKey[(i % nKeyLength) + 1]) % 256 | |
29 | swapIndicies( tSch, i, j ) | |
30 | end | |
31 | return tSch | |
32 | end | |
33 | ||
34 | local function keyGeneration( state, nCount ) | |
35 | local K = {} | |
36 | for i = 1, nCount do | |
37 | state.i = ( state.i + 1) % 256 | |
38 | state.j = ( state.j + state.schedule[state.i - 1]) % 256 | |
39 | swapStateIndicies( state ) | |
40 | K[#K+1] = state.schedule[ ( state.schedule[ state.i - 1] + state.schedule[ state.j - 1] - 1) % 256] | |
41 | end | |
42 | return K | |
43 | end | |
44 | ||
45 | local function cipher( sMessage, state) | |
46 | local nCount = string.len(sMessage) | |
47 | local K = keyGeneration( state, nCount ) | |
48 | local sOutput = "" | |
49 | for i = 1, nCount do | |
50 | sOutput = sOutput .. string.char( bit.bxor( K[i], string.byte(sMessage, i))) | |
51 | end | |
52 | return sOutput | |
53 | end | |
54 | ||
55 | function new( sKey, bEncryption ) | |
56 | local tSch = createKeySchedule( sKey ) | |
57 | local nS1 = 0 | |
58 | local nS2 = 0 | |
59 | local state = { | |
60 | i = nS1, | |
61 | j = nS2, | |
62 | schedule = tSch | |
63 | } | |
64 | - | local tSession = { |
64 | + | local tSession = {} |
65 | local sFuncName = "decrypt" | |
66 | if bEncryption then | |
67 | sFuncName = "encrypt" | |
68 | end | |
69 | tSession[sFuncName] = function( sMessage ) | |
70 | local sOutput = cipher( sMessage, state) | |
71 | return sOutput | |
72 | end | |
73 | return tSession | |
74 | end |