|
- 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;
- }
- }
- }
|