RC4加密解密c语言实现如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
unsigned char rc4key[256];// 随机化密钥表
unsigned char s[256];// 初始化阶段所用的 s 表
void swap(unsigned char si, unsigned char sj) {
unsigned char temp;
temp = si;
si = sj;
sj = temp;
}
//1.初始化s表
void init_s(unsigned char key_data[]) {
int i, j;
for(i = 0; i < 256; i++)s[i] = i;//线性填充s表, s[0] = 0, s[1] = 1...
for(i = 0; i < 256; i++) {//用密钥种子初始化k表
j = i % 256;
rc4key[i] = key_data[j];//用密钥对k表进行填充
}
for(i = 0, j = 0; i < 256; i++) {//用k表对s表进行初始置换
j = (rc4key[i] + s[i] + j) % 256;//k表的当前字节+s表的当前字节+上一次的下标,然后求余,作为k表下标替换掉当前字节上的s;
swap(s[i], s[j]);
}
//生成s表后,种子密钥不再使用
}
/*
初始化k表分三步:
1.线性填充s表
2.用密钥生成k表
3.用公式求出下标,将s表和k表逐个字节替换
*/
//2.密钥流的生成
void create_key(int buffer_len) {
int t, i = 0, j = 0;
int counter;
unsigned char keystream[1024];
for(counter = 0; counter < buffer_len; counter++) {
i = (i + 1) % 256;
j = (s[i] + j) % 256;
swap(s[i], s[j]); //对s表进行变换,每次s表都要进行一次改变
t = (s[i] + s[j]) % 256;//生成伪随机数下标
keystream[counter] = s[t];//用伪随机数作为下标找s表的值填充字节, 伪随机数密钥流
//流密码的每一位都是由S表获取的
}
}
//RC4 : 明文和密钥异或得密文, 密文和密钥异或得明文
unsigned char *rc4(unsigned char buffer_data[], int buffer_len) {
int i;
unsigned char *result = (unsigned char *)malloc(sizeof(unsigned char) * buffer_len + 1);
//开辟明文这么长的字节的内存空间,+ 1是给字符串结束运算符'\0'多开辟一个字节的空间,result指向该内存空间;
for(i = 0; i < buffer_len; i++)// 将缓冲区中的数据与随机密钥序列进行异或,就可以进行加密和解密
result[i] = buffer_data[i]^rc4key[i];//'^'按位异或
result[i] = '\0';
return result;//返回加密后的密文或解密后的明文
}
int main() {
int i, m, n;
int key_len = 0;//密钥长度;
int buf_len = 0;//明文长度
unsigned char key_data[256];//密钥
unsigned char buf_data[1024];//明文
unsigned char *result;//指针,指向密文或密文
printf("RC4加密解密演示!\n");
printf("请输入密钥: ");
scanf("%s", key_data);
for(m = 0; m < 256; m++)
if(key_data[m] != '\0') key_len++; //密钥长度
printf("请输入明文: ");
scanf("%s", buf_data);
for(n = 0; n < 1024; n++)
if(buf_data[n] != '\0') buf_len++;//明文长度
init_s(key_data);
create_key(buf_len);
result = rc4(buf_data,buf_len); //rc4用于加密和解密
printf("\n加密后的密文为: %s\n\n", result); //result是指针, 指向密文
result = rc4(result, buf_len);
printf("解密后的明文为: %s\n",result);
return 1;
}