C语言的上课进度实在是太慢,一个200多行的小项目都得上四五个星期,所以只好自己折腾折腾其他的功能

RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ronald Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。

void rc4_init(unsigned char*s, unsigned char*key, unsigned long Len)
{
     int i = 0, j = 0;
     char k[256] = { 0 };
     unsigned char tmp = 0;
     for (i = 0; i<256; i++)
     {
         s[i] = i;
         k[i] = key[i%Len];
     }
     for (i = 0; i<256; i++)
     {
         j = (j + s[i] + k[i]) % 256;
         tmp = s[i];
         s[i] = s[j];//交换s[i]和s[j]
         s[j] = tmp;
     }
}```

以上代码为初始化Sbox的函数,需要传入的参数是Sbox地址,字符型密钥地址以及密钥的长度。密钥的作用主要是搅乱Sbox生成一个独一无二的密文。之后需要加密的数据会通过这段密文进行加密,加密的同时被加密的数据也会不断打乱Sbox内的密文。

void rc4_crypt(unsigned chars, unsigned charData, unsigned long Len) { int i = 0, j = 0, t = 0; unsigned long k = 0; unsigned char tmp; for (k = 0; k<Len; k++) { i = (i + 1) % 256; j = (j + s[i]) % 256; tmp = s[i]; s[i] = s[j];//交换s[x]和s[y] s[j] = tmp; t = (s[i] + s[j]) % 256; Data[k] ^= s[t]; } }


加密需要传入Sbox地址,需要加密的数据和数据的长度,解密需要传入通过key初始化的sbox地址和要解密的数据和其长度

int main() { unsigned long Len; unsigned char Data[256]="just say hello world!"; unsigned char s[256]; char key[10]="example"; Len=strlen(Data); rc4_init(s,(unsigned char *)key,Len);//初始化 printf("原始数据%s\n",Data ); rc4_crypt(s,Data,strlen(Data));//加密 printf("加密后%s\n",Data ); rc4_init(s,(unsigned char *)key,Len);//重初始化 rc4_crypt(s,Data,strlen(Data));//解密 printf("解密后%s\n",Data ); system("pause"); return 0; }


![20160516221144](https://nook.one/wp-content/uploads/2016/05/20160516221144.png) 运行结果