|
|
@@ -1,70 +0,0 @@ |
|
|
|
using System; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.Text; |
|
|
|
|
|
|
|
namespace shadowsocks_csharp |
|
|
|
{ |
|
|
|
public class RC4 |
|
|
|
{ |
|
|
|
class Context |
|
|
|
{ |
|
|
|
public int index1 = 0; |
|
|
|
public int index2 = 0; |
|
|
|
} |
|
|
|
|
|
|
|
private Context enc_ctx = new Context(); |
|
|
|
private Context dec_ctx = new Context(); |
|
|
|
|
|
|
|
public void Encrypt(byte[] table, byte[] data, int length) |
|
|
|
{ |
|
|
|
EncryptOutput(enc_ctx, table, data, length); |
|
|
|
} |
|
|
|
|
|
|
|
public void Decrypt(byte[] table, byte[] data, int length) |
|
|
|
{ |
|
|
|
EncryptOutput(dec_ctx, table, data, length); |
|
|
|
} |
|
|
|
|
|
|
|
public byte[] EncryptInitalize(byte[] key) |
|
|
|
{ |
|
|
|
byte[] s = new byte[256]; |
|
|
|
|
|
|
|
for (int i = 0; i < 256; i++) |
|
|
|
{ |
|
|
|
s[i] = (byte)i; |
|
|
|
} |
|
|
|
|
|
|
|
for (int i = 0, j = 0; i < 256; i++) |
|
|
|
{ |
|
|
|
j = (j + key[i % key.Length] + s[i]) & 255; |
|
|
|
|
|
|
|
Swap(s, i, j); |
|
|
|
} |
|
|
|
|
|
|
|
return s; |
|
|
|
} |
|
|
|
|
|
|
|
private void EncryptOutput(Context ctx, byte[] s, byte[] data, int length) |
|
|
|
{ |
|
|
|
for (int n = 0; n < length; n++) |
|
|
|
{ |
|
|
|
byte b = data[n]; |
|
|
|
|
|
|
|
ctx.index1 = (ctx.index1 + 1) & 255; |
|
|
|
ctx.index2 = (ctx.index2 + s[ctx.index1]) & 255; |
|
|
|
|
|
|
|
Swap(s, ctx.index1, ctx.index2); |
|
|
|
|
|
|
|
data[n] = (byte)(b ^ s[(s[ctx.index1] + s[ctx.index2]) & 255]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static void Swap(byte[] s, int i, int j) |
|
|
|
{ |
|
|
|
byte c = s[i]; |
|
|
|
|
|
|
|
s[i] = s[j]; |
|
|
|
s[j] = c; |
|
|
|
} |
|
|
|
} |
|
|
|
} |