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++実装を以下に示す.
暗号化クラス:
プログラム運転例
メーン関数:
密文:''L&t餤6洲
鍵の流れ:镈嚔3屽uに当たる.
ファイルを解読します:私は小さいウサギを愛します!
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に当たる.
ファイルを解読します:私は小さいウサギを愛します!