C语言RC4加密算法

2016 年 5 月 16 日 星期一
/
91

C语言RC4加密算法

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 char*s, unsigned char*Data, 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

20160516221144
运行结果

 

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...