1、密钥流:RC4算法的关键是根据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是对应的,也就是说明文的长度是500字节,那么密钥流也是500字节。当然,加密生成的密文也是500字节,因为密文第i字节=明文第i字节^密钥流第i字节;
2、状态向量S:长度为256,S[0],S[1].....S[255]。每个单元都是一个字节,算法运行的任何时候,S都包括0-255的8比特数的排列组合,只不过值的位置发生了变换;
3、临时向量T:长度也为256,每个单元也是一个字节。如果密钥的长度是256字节,就直接把密钥的值赋给T,否则,轮转地将密钥的每个字节赋给T;
4、密钥K:长度为1-256字节,注意密钥的长度 keylen 与明文长度、密钥流的长度没有必然关系,通常密钥的长度取为16字节(128比特)。
5、算法实现
//rc4.h  
template<class T> inline void  
swap(T& i, T& j)  
{  T tmp = i;  i = j;  j = tmp;  
}  
class RC4  
{  
public:  void SetKey(const char* key, int keylen);  void Transform(char* output, const char* input, int len);  
private:  unsigned char key_[256];  
};  
/  
//rc4.cc  
#include "rc4.h"  
void RC4::SetKey(const char* key, int keylen)  
{  for (int i = 0; i < 256; i++)  {  key_[i] = i;  }  int j = 0;  for (int i = 0; i < 256; i++)  {  j = (j + key_[i] + key[i%keylen]) % 256;  swap(key_[i], key_[j]);  }  
}  
void RC4::Transform(char* output, const char* input, int len)  
{  int i = 0, j = 0;  for (int k = 0; k < len; k++)  {  i = (i + 1) % 256;  j = (j + key_[i]) % 256;  swap(key_[i], key_[j]);  unsigned char subkey = key_[(key_[i] + key_[j]) % 256];  output[k] = subkey ^ input[k];  }  
}  
/  
//main.cc  
#include <stdio.h>  
#include <string.h>  
#include <stdlib.h>  
#include "rc4.h"  
int main()  
{  char input[256] = "Times teaches all things to him who lives forever but I have not the luxury of eternity.";  char output[256] = "";  printf("before encrypt:%s/n", input);  const int keylen = 16;  char key[keylen] = "";  for (int i = 0; i < keylen; i++)  {  key[i] = rand() % 256;  }  RC4 rc4encrypt, rc4decrypt;  rc4encrypt.SetKey(key, keylen);  rc4decrypt.SetKey(key, keylen);  rc4encrypt.Transform(output, input, strlen(input));  printf("after encrypt: %s/n", output);  rc4decrypt.Transform(output, output, strlen(input));  printf("after decrypt: %s/n", output);  return 0;  
}