密码学RC4的c语言实现

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; 
}

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值