1、介绍
RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。RC4是有线等效加密(WEP)中采用的加密算法,也曾经是TLS可采用的算法之一。RC4算法特点:(1)、算法简洁易于软件实现,加密速度快,安全性比较高;(2)、密钥长度可变,一般用256个字节。
在介绍RC4算法原理之前,先看看算法中的几个关键变量:
- 密钥流:RC4算法的关键是根据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是对应的,也就是说明文的长度是500字节,那么密钥流也是500字节。当然,加密生成的密文也是500字节,因为密文第i字节=明文第i字节^密钥流第i字节。
- 状态向量S:长度为256,S[0],S[1]…S[255]。每个单元都是一个字节,算法运行的任何时候,S都包括0-255的8比特数的排列组合,只不过值的位置发生了变换;
- 临时向量T:长度也为256,每个单元也是一个字节。如果密钥的长度是256字节,就直接把密钥的值赋给T,否则,轮转地将密钥的每个字节赋给T;
- 密钥K:长度为1-256字节,注意密钥的长度keylen 与明文长度、密钥流的长度没有必然关系,通常密钥的长度趣味16字节(128比特)
2、C#代码实现
private static byte[] rc4_init(char[] key)
{
byte[] box = new byte[256];
for (int i = 0; i < 256; i++)
box[i] = (byte)i;
for (int i = 0, j = 0; i < 256; i++)
{
j = (j + box[i] + key[i % key.Length]) % 256;
byte b = box[i];
box[i] = box[j];
box[j] = b;
}
return box;
}
public static string rc4_crypt(string key, string value)
{
char[] key_buffer = key.ToCharArray();
byte[] box = rc4_init(key_buffer);
char[] buffer = value.ToCharArray();
string str = "";
for (int i = 0, low = 0, high = 0, mid; i < buffer.Length; i++)
{
low = (low + 1) % 256;
high = (high + box[low]) % 256;
byte b = box[low];
box[low] = box[high];
box[high] = b;
mid = (box[low] + box[high]) % 256;
buffer[i] ^= (char)box[mid];
str += ((byte)buffer[i]).ToString("X2");
}
return str;
}
public static void rc4_algorithm(byte[] key, byte[] data)
{
int key_len = key.Length;
int data_len = data.Length;
int[] s = new int[256];
int[] k = new int[256];
int i = 0, j = 0, temp;
for (i = 0; i < 256; i++)
{
s[i] = i;
k[i] = key[i % key_len];
}
for (i = 0; i < 256; i++)
{
j = (j + s[i] + k[i]) & 0xff;
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
int x = 0, y = 0, t = 0;
for (i = 0; i < data_len; i++)
{
x = (x + 1) & 0xff;
y = (y + s[x]) & 0xff;
temp = s[x];
s[x] = s[y];
s[y] = temp;
t = (s[x] + s[y]) & 0xff;
data[i] ^= (byte)s[t];
}
}