RC 4暗号解読アルゴリズム

4483 ワード

RC 4は、対称暗号アルゴリズム中のシーケンスパスワード(streamcipher)に属し、可変鍵長であり、バイト向けに動作するストリームパスワードである.
RC 4はストリームパスワードstreamcipherの一つで、シーケンスパスワードです.RC 4暗号化アルゴリズムはRon Rivestが1987年に設計した鍵長可変暗号化アルゴリズムクラスタである.最初のアルゴリズムは商業機密であり、1994年になって初めて公開されました.RC 4はアルゴリズムが簡単で、演算速度が速く、ハードウェア実装が非常に容易であるなどの利点があるので、いくつかのプロトコルと標準で広く応用されています.
ストリームパスワードも対称暗号に属するが、パケット暗号アルゴリズムとは違って、ストリームパスワードは、平文データをグループ化しないで、鍵で明文と同じ長さの暗号ストリームを生成して、平文を暗号化し、暗号解読によって同じ鍵を使用する.
RC 4アルゴリズムの特徴:(1)、アルゴリズムが簡潔でソフトウェアが実現しやすく、暗号化速度が速く、安全性が高い.(2)、鍵の長さが可変で、一般的に256バイトを使用します.
        対称暗号アルゴリズムの働き方は、電子パスワードブック(ECB、electric codebook)方式、パスワードパケットリンク(CBC、cipherblock chaining)方式、暗号文フィードバック(CFB、cipher-feedback)方式、出力フィードバック(OFB、output-feedback)方式の4つです.
         RC 4アルゴリズムは出力フィードバック動作方式を採用しているので、短い鍵で比較的長い鍵シーケンスを生成することができる.
         OFB方式の最大の利点は、メッセージがエラーが発生した場合(ここではメッセージのあるビットが変更され、メッセージのあるビットが失われたのではなく)、エラーが発生した鍵シーケンスに渡されないことである.欠点は挿入攻撃に敏感で、同期に対する要求が高いことです.
         RC 4の実行速度はかなり速いです.ブロック暗号アルゴリズムDESの約5倍で、3 DSの15倍です.高級暗号アルゴリズムAESよりもずっと速いです.RC 4アルゴリズムは簡単で、実現が容易です.RC 4のセキュリティ保証は、主に入力鍵の生成経路にあり、この点において脆弱性がない限り、128 bitの鍵を採用することは非常に安全である.
         RC 4アルゴリズム暗号化の流れ:鍵スケジュールアルゴリズムKSAと疑似は、(鍵の長さが256バイトの例で)マシンサブパスワード生成アルゴリズムPRGAの大部分を含む.
         鍵スケジュールアルゴリズム:まず状態ベクトルSを初期化し、ベクトルSの要素の値を昇順に0から255に並べ、即ちS[0]=00、S[1]=1、...、S[255]=255.同時に仮ベクトルTを作成し、鍵Kの長さが256バイトであれば、KをTに付与する.そうでなければ、鍵長がkeylonバイトの場合、Kの値はTの前keylon要素に割り当てられ、Tのすべての要素が割り当てられるまで、Kの値をTの残りの要素に繰り返し与える.
      
RC 4アルゴリズムの原理を紹介する前に、まずアルゴリズムの中のいくつかのキー変数を見ます.
       鍵の流れ:RC 4アルゴリズムの鍵は、明文と鍵に基づいて対応する鍵のストリームを生成することであり、鍵のストリームの長さと平文の長さは対応し、すなわち説明文の長さは500バイトであり、鍵のストリームも500バイトである.もちろん、暗号化によって生成された暗号文も500バイトである.なぜなら、暗号文第iバイト=明文第iバイト^鍵ストリームi番目のバイトであるからである.
       2、状態ベクトルS:長さは256、S[0],S[1]….S[255]です.各ユニットは1バイトで、アルゴリズムが実行される時はいつでも、Sは0-255の8ビット数の配置組み合わせを含み、値の位置だけが変換された.
       3、一時ベクトルT:長さも256で、各ユニットも1バイトです.鍵の長さが256バイトの場合、直接に鍵の値をTに割り当てます.そうでなければ、鍵のバイトごとにTに巡回的に割り当てられます.
       4、鍵K:長さは1−256バイトで、鍵の長さkeylenは、平文長、鍵ストリームの長さに必然的な関係がないことに注意して、通常鍵の長さは16バイト(128ビット)に興味を持つ.
RC 4の原理は三段階に分けられます.
1、初期化SとT
for i=0 to 255 do
   S[i]=i
   T[i]=K[imodkeylon]
2、初期配列S
for i=0 to 255 do
   j=(j+S[i]+T[i])mod 256;
   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]
RC 4暗号解読のC++実装を以下に示す.
暗号化クラス:
/*
	   
*/
class RC4 {
public:
	/*
		    ,       
	*/
	RC4(int kl):keylen(kl) {
		srand((unsigned)time(NULL));
		for(int i=0;i K;	  //      
	vector k;	  //   
 
	/*
		       S     T, keyStream    
	*/
	void initial() {
		for(int i=0;i<256;++i){
			S[i]=i;
			T[i]=K[i%keylen];
		}
	}
	/*
		        S, keyStream    
	*/
	void rangeS() {
		int j=0;
		for(int i=0;i<256;++i){
			j=(j+S[i]+T[i])%256;
			//cout<
クラスを復号:
/*
	   
*/
class RC4_decryption{
public:
	/*
		    ,             
	*/
	RC4_decryption(const string ks,const string ct):keystream(ks),ciphertext(ct) {}
	/*
		    ,        
	*/
	void decryption(const string &);
 
private:
	string ciphertext,keystream;
};
void RC4_decryption::decryption(const string &res){
	ifstream inks,incp;
	ofstream out;
 
	inks.open(keystream);
	incp.open(ciphertext);
 
	//      
	inks.seekg(0,ios::end);
	const int lenFile=inks.tellg();
	inks.seekg(0, ios::beg);
	//     
	unsigned char *bitKey=new unsigned char[lenFile];
	inks.read((char *)bitKey,lenFile);
	inks.close();
	//    
	unsigned char *bitCip=new unsigned char[lenFile];
	incp.read((char *)bitCip,lenFile);
	incp.close();
 
	//            
	out.open(res);
	for(int i=0;i
プログラムが実装される際に、状態ベクトル配列Sと一時ベクトル配列Tのタイプは、charではなくunsigned charに設定されるべきであることに注意が必要です.いくつかのマシンでは、charをデフォルトでsigned charとして取り扱うため、アルゴリズムでは、下付きi,jを計算する際に、char転送intに関連し、signedのcharであれば、charの8ビットをintの下位8ビットにコピーした後、charの記号に基づいて、intの上位で0または1を補足することもあります.鍵はランダムに生成されるので、鍵のあるバイトの上位が1であれば、計算された配列の下に負の値が表示されて、境界を越えます.
プログラム運転例
メーン関数:
int main(){
	RC4 rc4(16); //   16  
	rc4.encryption("  .txt","   .txt","  .txt");

	RC4_decryption decrypt("   .txt","  .txt");
	decrypt.decryption("    .txt");

}

私はウサギが好きです.
密文:''L&t餤6洲
鍵の流れ:镈嚔3屽uに当たる.
ファイルを解読します:私は小さいウサギを愛します!