【实验目的】

1、理解流密码的概念及相关结构;

2、理解并能够编写基本的流密码体制;

3、熟练应用一种编程语言实现RC4密码算法体制。

 

【实验原理】

RC4算法是一种序列密码体制或称流密码体制,其加密密钥和解密密钥相同RC4的密钥长度可变,但为了确保哪去安全强度,目前RC4至少使用128位的密钥。

用1~256个字节(8~2048位)的可变长度密钥初始化一个256个字节的状态向量S,S的元素记为S[0],S[1],…,S[255],从始至终置换后的S包含从0到255的所有8位数。对于加密和解密,字节K是从S的255个元素中按一种系统化的方式选出的一个元素生成的。每生成一个K的值,S中的元素个体就被重新置换一次。

 

【实验内容】

实验内容:编程实现RC4加/解密算法。

RC4算法是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。而其当密钥长度足够长时,用暴力法破解密钥已经不太现实,所以可以抵御暴力搜索的攻击。

RC4算法主要有:初始化、产生密钥流、加解密三部分。初始化的目的是使用密钥将S-box搅乱,使得S-box的每个元素都得到处理并是随机的。随后根据明文和密钥生成相应的密钥流。最后将密钥流同明文异或即可得到密文,再将其于密文异或即可得到明文。

根据以上思路,编写C语言代码如下:

#include<stdio.h>
#include<string.h>
int main()
{
	char input[256];
	printf("请输入需要加密的数据:\n");
	scanf("%s",input);
	char key[256];
	printf("请输入密钥:\n");
	scanf("%s",key);

	//初始化
	char s[256] = { '0' };
	int i = 0, j = 0;
	char t[256] = { '0' };
	char temp;
	for (i = 0; i<256; i++)
	{
		s[i] = i;
		t[i] = key[i%strlen(key)];
	}
	for (i = 0; i<256; i++)
	{
		j = (j + s[i] + t[i]) % 256;
		temp = s[i];
		s[i] = s[j];
		s[j] = temp;
	}
	//产生密钥流
	char k[256] = { '0' };
	i = 0; j = 0;
	int p = 0, r = 0;
	int length = strlen(input);
	for (r = 0; r < length; r++)
	{
		i = (i + 1) % 256;
		j = (j + s[i]) % 256;
		temp = s[i];
		s[i] = s[j];
		s[j] = temp;
		p = (s[i] + s[j]) % 256;
		k[r] = s[p];
	}
	//加密
	char output[256] = { '0' };
	for (r = 0; r < length; r++)
	{
		output[r] = input[r] ^ k[r];
	}
	printf("加密后密文为:%s\n", output);
	//解密
	char result[256] = { '0' };
	for (r = 0; r < length; r++)
	{
		result[r] = output[r] ^ k[r];
	}
	printf("解密后明文为:%s\n", result);
	return 0;
}

程序执行结果如下:

rc4加密算法明文几位 实验rc4加密算法_初始化

rc4加密算法明文几位 实验rc4加密算法_初始化_02

 

至此实验顺利完成。

 

【小结或讨论】

这一次的RC4算法比上一次的实验难度有所增加。我一开始是使用Matlab语言编写的。但Matlab语言对此实验存在一定的不足之处,比如Matlab语言比C语言相对更高级一些,不像C语言一样能非常方便地控制字符串的编码格式和数值,它的定义变量时甚至不用规定变量类型。而且Matlab的数组下标从1开始,其对中文字符的编码格式也有一定的特殊之处。

我先是将RC4算法加入了自己的想法和调整以适应Matlab语言的格式,并且顺利得出了实验结果。但是我们知道,RC4算法加解密都是通过异或来实现,两次异或完全可以相互抵消,这为我们代码的纠错和调整带来了不便。

所以为了按照流程写出一个相对标准的RC4算法,我使用C语言将这次实验重新做了一遍,得出了如上文的实验结果。在重写的过程中,进一步加深了我对基本的流密码体制的理解。