RC4加密演算法

2021-09-08 19:00:43 字數 3090 閱讀 8313

rc4於2023年提出,和des演算法一樣,是一種對稱加密演算法,也就是說使用的金鑰為單鑰(或稱為私鑰)。但不同於des的是,rc4不是對明文進行分組處理,而是位元組流的方式依次加密明文中的每乙個位元組,解密的時候也是依次對密文中的每乙個位元組進行解密。

rc4演算法的特點是演算法簡單,執行速度快,而且金鑰長度是可變的,可變範圍為1-256位元組(8-2048位元),在如今技術支援的前提下,當金鑰長度為128位元時,用暴力法搜尋金鑰已經不太可行,所以可以預見rc4的金鑰範圍任然可以在今後相當長的時間裡抵禦暴力搜尋金鑰的攻擊。實際上,如今也沒有找到對於128bit金鑰長度的rc4加密演算法的有效攻擊方法。

在介紹rc4演算法原理之前,先看看演算法中的幾個關鍵變數:

1、金鑰流:rc4演算法的關鍵是根據明文和金鑰生成相應的金鑰流,金鑰流的長度和明文的長度是對應的,也就是說明文的長度是500位元組,那麼金鑰流也是500位元組。當然,加密生成的密文也是500位元組,因為密文第i位元組=明文第i位元組^金鑰流第i位元組; 

2、狀態向量s:長度為256,s[0],s[1].....s[255]。每個單元都是乙個位元組,演算法執行的任何時候,s都包括0-255的8位元數的排列組合,只不過值的位置發生了變換; 

3、臨時向量t:長度也為256,每個單元也是乙個位元組。如果金鑰的長度是256位元組,就直接把金鑰的值賦給t,否則,輪轉地將金鑰的每個位元組賦給t; 

4、金鑰k:長度為1-256位元組,注意金鑰的長度 keylen 與明文長度、金鑰流的長度沒有必然關係,通常金鑰的長度趣味16位元組(128位元)。 

rc4的原理分為三步:

1、初始化s和t

for i=0 to 255 do

s[i] =i; 

t[i]=k[ imodkeylen ]; 

2、初始排列s 

for i=0 to 255 do 

j= ( j+s[i]+t[i])mod256; 

swap(s[i],s[j]); 

3、產生金鑰流 

for r=0 to len do  //r為明文長度,r位元組 

i=(i+1) mod 256; 

j=(j+s[i])mod 256; 

swap(s[i],s[j]); 

t=(s[i]+s[j])mod 256;

k[r]=s[t]; 

下面給出rc4加密解密的c++實現:

加密類:

/*

加密類*/

class

rc4

} /*由明文產生密文

*/void encryption(const

string &,const

string &,const

string &);

private

: unsigned

char s[256]; //

狀態向量,共256位元組

unsigned char t[256]; //

臨時向量,共256位元組

int keylen; //

金鑰長度,keylen個位元組,取值範圍為1-256

vector k; //

可變長度金鑰

vector k; //

金鑰流/*

初始化狀態向量s和臨時向量t,供keystream方法呼叫

*/void

initial()

} /*初始排列狀態向量s,供keystream方法呼叫

*/void

ranges()

} /*生成金鑰流

len:明文為len個位元組

*/void keystream(int

len);

};void rc4::keystream(int

len)

}void rc4::encryption(const

string &plaintext,const

string &ks,const

string &ciphertext)

outks.close();

//明文內容讀入bits中

unsigned char *bits=new unsigned char

[lenfile];

in.read((char *)bits,lenfile);

in.close();

out.open(ciphertext);

//將明文按位元組依次與金鑰流異或後輸出到密文檔案中

for(int i=0;ii)

"white-space:pre

">

out.close();

delete

bits;

}

解密類:

/*

解密類*/

class

rc4_decryption

/*解密方法,引數為解密檔名

*/void decryption(const

string &);

private:

string

ciphertext,keystream;

};void rc4_decryption::decryption(const

string &res)

程式實現時,需要注意的是,狀態向量陣列s和臨時向量陣列t的型別應設為unsigned char,而不是char。因為在一些機器下,將char預設做為signed char看待,在演算法中計算下標i,j的時候,會涉及char轉int,如果是signed的char,那麼將char的8位拷貝到int的低8位後,還會根據char的符號為,在int的高位補0或1。由於金鑰是隨機產生的,如果遇到金鑰的某個位元組的高位為1的話,那麼計算得到的陣列下標為負數,就會越界。

程式執行示例

main函式:

明文:我愛小兔子!

密文:'柀l&t餥6洲

金鑰流:鎛膺嚬3屽u

解密檔案:我愛小兔子!

RC4加密演算法

簡介 包括初始化演算法 ksa 和加密演算法兩大部分 主要 初始化部分 這個基本上是固定的 void rc4 init unsigned char s,unsigned char key,unsigned long len s最開始是傳入的長度為256的char型空陣列,用來存放初始化後的s key...

RC4加密演算法

rc4於1987年提出,和des演算法一樣,是一種對稱加密演算法,也就是說使用的金鑰為單鑰 或稱為私鑰 但不同於des的是,rc4不是對明文進行分組處理,而是位元組流的方式依次加密明文中的每乙個位元組,解密的時候也是依次對密文中的每乙個位元組進行解密。rc4演算法的特點是演算法簡單,執行速度快,而且...

rc4加密演算法

rc4演算法,詳情可以看下這個文件 rc4加密演算法 加密原理 先了解一下流密碼的結構 金鑰輸入到乙個偽隨機數 位元 發生器中,輸出一串8位元的隨機數,稱為金鑰流 金鑰流通過與同一時刻的明文進行異或運算產生密文 1 通過金鑰排程演算法ksa初始化狀態向量s s就是乙個隨機數發生器,稱為s box 2...