3

私の質問には、私が持っていないかもしれない基本的な知識が必要だと思います。

私はそのようなバイト配列を復号化しています:

var cipher = CipherUtilities.GetCipher("AES/CTR/NoPadding");
cipher.Init(false, new ParametersWithIV(new KeyParameter(bkey), bIV));
byte[] DecryptedChunk = cipher.ProcessBytes(EncryptedChunk, 0, ChunkSize);

このバッファを 2 つに分割し、前半と後半を復号化する方法を理解したいと思います。

私がそのようにすれば:

var cipher = CipherUtilities.GetCipher("AES/CTR/NoPadding");
cipher.Init(false, new ParametersWithIV(new KeyParameter(bkey), bIV));
byte[] FirstDecryptedChunk = cipher.ProcessBytes(FirstEncryptedChunk, 0, FirstChunkSize);
byte[] SecondDecryptedChunk = cipher.ProcessBytes(SecondEncryptedChunk, 0, SecondChunkSize);

次に、最初のチャンクは問題ありませんが、2 番目のチャンクは間違っています。

私はインターネットで6時間ほど読んでいますが、説明が見つかりません。ある種のカウンターと IV を更新する必要があるか、何か関係がありますか?

4

2 に答える 2

2

おそらく、BC C# バージョンは現在 CTR モードをブロック暗号、つまり BufferedBlockCipher として提供していますが、ストリーム暗号 (も)、つまり BufferedStreamCipher としても利用できるはずなので、ここで混乱が生じる可能性があります。

完全な出力を取得するには、他のすべての処理の後に (暗号で) DoFinal メソッドの 1 つを呼び出す必要があります。暗号は、入力を一度に 1 ブロックずつバッファリングし、完了したことを認識してから部分ブロックのみを出力できます。

BufferedStreamCipher の場合でも DoFinal を呼び出して、基になる暗号をクリーンアップして別の実行のためにリセットするように通知することをお勧めします。

于 2013-02-21T12:58:14.690 に答える
0

その問題に10時間も費やしたなんて信じられない!!!!

問題を特定するために、最小限のアプリケーションを作成しました。基本的には、元のスレッドに投稿したコードのように見え、機能しています!!!

元のコードで、各セグメント間で .dofinal を呼び出していることがわかりました。これが次のセグメントを台無しにします!!!!

Pfffiuuuu ... 午前 8 時、私はそのために一晩中過ごしました。私は寝ることができると思います ;-)

于 2013-02-21T13:10:36.003 に答える