2016-05-16 16 views
0

私のWPFアプリケーション用にC#でRC4アルゴリズムを実装しています。RC4暗号化KSAキーの範囲外

このアルゴリズムには、pdfが続きました。

事は、KSAでは、私たちはすべきことです:j = (j + S[i] + (int)key[i % keyLengthInBits]) % 256;

これは、キーが5文字から32文字の長さ(40ビットから256ビット)でなければならないため、これがどのように機能するのか分かりません。

ここでは、5文字のキーを使用して例を示します(私は上記のPDFと同じものを使用します)。pwd12キーの文字をi % 40の位置にフェッチします(5文字は40ビットです)。 i = 0からi=4には、キーの値(pwd12)があるため、最初の5回は問題ありません。ここに問題があります(私がそれを見てから):i=5にいるとき、私たちは鍵に何も残っていません。したがって、我々はÒutOfBounds Exceptionを得るでしょう。

キーに文字がない場合、その文字をフェッチしようとすると、どのように動作するのですか?明らかにアルゴリズムには見当たらないものがあります。なぜなら、そうでなければ動作しないために使用されないからです...

+0

ヒント:剰余演算子( '%が')のために何

同等のCコードのようなものでしょうか? –

+0

除算の残りの部分を返します。したがって、それは鍵長ではなく、鍵長である。私の目を開いてくれてありがとう! – Marks

+0

キーの長さはビットです。この式の目的は、キーの1ビットを選択することです。私の答えを見てください。 –

答えて

1

フレーズkey[i % keyLengthInBits]は「鍵の第1ビット」と言っています。これは、それぞれが8ビットのキーを保持するバイトの配列として表現されたキーのi番目のエントリを意味するものではありません。

int bit = i & keyLengthInBits; 
((key[bit/8] >> (bit % 8)) & 1) 
+0

Ok(キー(ビット8))(ビット8))&1) 'これは私がそれを理解しているから、 i = 5'であり、キーはまだ* pwd12 *(40bits)です。 0を与え、それで 'key [0/8] = 'p' 'を与える​​のは' bit = 5&40'でしょう。私が '' '演算子から得たものから、'(ビット%8 = 0) 'から0のビットを右シフトするので、pは01110000のままです。'&1'は00000000になります。(ここから私はなぜそれが0になるのかについて失われています...) 私は間違っていると思いますが、私が理解しているところから、これはあなたの2つの行にどのようになるかです。 @David Schwartz – Marks

+0

@マークあなたはそれが正しい。 'i'が5の場合、コードはキーの5番目のビットを抽出します。 –

+0

もし私たちが52回目の反復( 'i = 52')にいたらどうなりますか?それは52(00110100)と40(00101000)となり、00100000となり、 'bit = 32'となります。 'key [32/8] = key [4]'に2を与えます(まだキーが* pwd12 *であると考えます)。 '32%8 = 0'から0の右シフト。したがって、ここでもまた、j =(j + S [k] +(int)key [0])%256; ')になります。あなたが提供した2行を使用して%ketLengthInBits。あれは正しいですか ? @David Schwartz – Marks

関連する問題