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;
}
运行结果