現代密碼學實驗2 RC4加/解密算法

讚賞碼 & 聯繫方式 & 個人閒話

【實驗名稱】RC4加/解密算法

 

【實驗目的】

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算法比上一次的實驗難度有所增加。我一開始是使用Matlab語言編寫的。但Matlab語言對此實驗存在一定的不足之處,比如Matlab語言比C語言相對更高級一些,不像C語言一樣能非常方便地控制字符串的編碼格式和數值,它的定義變量時甚至不用規定變量類型。而且Matlab的數組下標從1開始,其對中文字符的編碼格式也有一定的特殊之處。

我先是將RC4算法加入了自己的想法和調整以適應Matlab語言的格式,並且順利得出了實驗結果。但是我們知道,RC4算法加解密都是通過異或來實現,兩次異或完全可以相互抵消,這爲我們代碼的糾錯和調整帶來了不便。

所以爲了按照流程寫出一個相對標準的RC4算法,我使用C語言將這次實驗重新做了一遍,得出瞭如上文的實驗結果。在重寫的過程中,進一步加深了我對基本的流密碼體制的理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章