using UnityEngine;
using System.Collections;
public class rc4 {
static private byte[] sBox = new byte[256];
static public char[] key;
public static void Init()
{
int i = 0;
for (i = 0; i < 256; ++i)
{
sBox[i] = (byte)i;
}
int j = 0;
byte temp;
for (i = 0; i < 256; i++)
{
j = (j + sBox[i] + key[i % key.Length]) % 256;
temp = sBox[i];
sBox[i] = sBox[j];
sBox[j] = temp;
}
i = j = 0;
for (int k = 0; k < 256; k++)
{
i = (i + 1) % 256;
j = (j + sBox[i]) % 256;
temp = sBox[i];
sBox[i] = sBox[j];
sBox[j] = temp;
sBox[k++] = sBox[(sBox[i] + sBox[j]) % 256];
}
}
static public byte[] Do(byte[] context)
{
byte[] res = new byte[context.Length];
for (int i = 0; i < context.Length; ++i)
{
byte code = GetSBoxByte(i);
res[i] = (byte)(code ^ context[i]);
}
return res;
}
static private byte GetSBoxByte(int index)
{
index = index % 256;
return sBox[index];
}
}
例子:
rc4.key = "iiillluuu".ToCharArray();
rc4.Init();
string str = "Hellow World";
Debug.Log("明文 : " + str);
byte[] testA = System.Text.Encoding.Default.GetBytes ( str );;
byte[] testB = rc4.Do(testA);
str = System.Text.Encoding.Default.GetString(testB);
Debug.Log("加密 : " + str);
byte[] testC = rc4.Do(testB);
str = System.Text.Encoding.Default.GetString(testC);
Debug.Log("解密 : " + str);