RC4加密算法是一種對稱加密算法。
對稱加密算法
對稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密算法。有時又叫傳統密碼算法,就是加密密鑰能夠從解密密鑰中推算出來,同時解密密鑰也可以從加密密鑰中推算出來。而在大多數的對稱算法中,加密密鑰和解密密鑰是相同的,所以也稱這種加密算法為秘密密鑰算法或單密鑰算法。它要求發送方和接收方在安全通信之前,商定一個密鑰。對稱算法的安全性依賴於密鑰,泄漏密鑰就意味着任何人都可以對他們發送或接收的消息解密,所以密鑰的保密性對通信的安全性至關重要。
RC4加密算法
RC4算法的特點是算法簡單,運行速度快,而且密鑰長度是可變的,可變范圍為1-256字節(8-2048比特),在如今技術支持的前提下,當密鑰長度為128比特時,用暴力法搜索密鑰已經不太可行,所以可以預見RC4的密鑰范圍任然可以在今后相當長的時間里抵御暴力搜索密鑰的攻擊。實際上,如今也沒有找到對於128bit密鑰長度的RC4加密算法的有效攻擊方法。
RC4算法的原理很簡單,包括初始化算法(KSA)和偽隨機子密碼生成算法(PRGA)兩大部分。假設S-box的長度為256,密鑰長度為Len。先來看看算法的初始化部分(用C代碼表示):
其中,參數1是一個256長度的char型
數組,定義為: unsigned char sBox[256];
參數2是密鑰,其內容可以隨便定義:char key[256];
參數3是密鑰的長度,Len = strlen(key);
/*初始化函數*/ 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; } }
在初始化的過程中,
密鑰的主要功能是將S-box攪亂,i確保S-box的每個元素都得到處理,j保證S-box的攪亂是隨機的。而不同的S-box在經過
偽隨機子密碼生成算法的處理后可以得到不同的子密鑰序列,將S-box和明文進行xor運算,得到密文,解密過程也完全相同。
再來看看算法的加密部分(用C代碼表示):
其中,參數1是上邊rc4_init函數中,被攪亂的S-box;
參數2是需要加密的數據data;
參數3是data的長度.
/*加解密*/ 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]; } }

讓我們看一看完整程序
//程序開始 #include<stdio.h> #include<string.h> typedef unsigned longULONG; /*初始化函數*/ 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; } } /*加解密*/ 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]; } } int main() { unsigned char s[256] = { 0 }, s2[256] = { 0 };//S-box char key[256] = { "justfortest" }; char pData[512] = "這是一個用來加密的數據Data"; unsigned long len = strlen(pData); int i; printf("pData=%s\n", pData); printf("key=%s,length=%d\n\n", key, strlen(key)); rc4_init(s, (unsigned char*)key, strlen(key));//已經完成了初始化 printf("完成對S[i]的初始化,如下:\n\n"); for (i = 0; i<256; i++) { printf("%02X", s[i]); if (i && (i + 1) % 16 == 0)putchar('\n'); } printf("\n\n"); for (i = 0; i<256; i++)//用s2[i]暫時保留經過初始化的s[i],很重要的!!! { s2[i] = s[i]; } printf("已經初始化,現在加密:\n\n"); rc4_crypt(s, (unsigned char*)pData, len);//加密 printf("pData=%s\n\n", pData); printf("已經加密,現在解密:\n\n"); //rc4_init(s,(unsignedchar*)key,strlen(key));//初始化密鑰 rc4_crypt(s2, (unsigned char*)pData, len);//解密 printf("pData=%s\n\n", pData); return 0; } //程序完
