RC4加密解密算法原理與完整源代碼實例演示

RC4加密算法

RC4加密算法是大名鼎鼎的RSA三人組中的頭號人物Ron Rivest在1987年設計的密鑰長度可變的流加密算法簇。之因此稱其爲簇,是因爲其核心部分的S-box長度可爲任意,但通常爲256字節。該算法的速度能夠達到 DES加密的10倍左右,且具備很高級別的非線性。RC4起初是用於保護商業機密的。可是在1994年9月,它的算法被髮布在互聯網上,也就再也不有什麼商業機密了。RC4也被叫作ARC4(Alleged RC4——所謂的RC4),由於RSA歷來就沒有正式發佈過這個算法。

原理

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, 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 x = 0, y = 0, t = 0, i = 0;
unsigned char tmp;
for(i=0;i<Len;i++)
{
x=(x+1)%256;
y=(y+s[x])%256;
tmp = s[x];
s[x] = s[y];     //交換s[x]和s[y]
s[y] = tmp;
t=(s[x]+s[y])%256;
Data[i] ^= s[t];
}
}
最後,在main函數中,調用順序以下:
void main()
{
unsigned char s[256] = {0};//S-box
char key[256] = {"just for test"};
char pData[512] = "這是一個用來加密的數據Data";
ULONG len = strlen(pData);
printf("pData = %s\n",pData);
printf("key = %s, length = %d\n",key,strlen(key));
rc4_init(s,(unsigned char *)key,strlen(key));//初始化
rc4_crypt(s,(unsigned char *)pData,len);//加密
printf("pData = %s\n\n",pData);
rc4_crypt(s,(unsigned char *)pData,len);//解密
printf("pData = %s\n\n",pData);
}
所以最終的完整程序是:
//程序開始
#include<stdio.h>
#include<string.h>
typedef unsigned long ULONG;
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];
}
}
void main()
{
unsigned char s[256] = {0},s2[256] = {0};    //S-box
char key[256] = {"just for test"};
char pData[512] = "這是一個用來加密的數據Data";
ULONG len = strlen(pData);
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 (int i=0; i<256; i++)
{
printf("%-3d ",s[i]);
}
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,(unsigned char *)key, strlen(key));   //初始化密鑰
rc4_crypt(s2,(unsigned char *)pData,len);//解密
printf("pData = %s\n\n",pData);
}
//程序完

漏洞

因爲 RC4算法加密是採用的xor,因此,一旦子密鑰序列出現了重複,密文就有可能被破解。關於如何破解xor加密,請參看Bruce Schneier的Applied Cryptography一書的1.4節Simple XOR,在此我就不細說了。那麼,RC4算法生成的子密鑰序列是否會出現重複呢?因爲存在部分弱密鑰,使得子密鑰序列在不到100萬字節內就發生了徹底的重複,若是是部分重複,則可能在不到10萬字節內就能發生重複,所以,推薦在使用RC4算法時,必須對加密密鑰進行測試,判斷其是否爲弱密鑰。其不足主要體現於,在無線網絡中IV(初始化向量)不變性漏洞。
並且,根據目前的分析結果,沒有任何的分析對於密鑰長度達到128位的RC4有效,因此,RC4是目前最安全的加密算法之一,你們能夠放心使用!
相關文章
相關標籤/搜索