2

私は C++ 暗号化とブロック暗号化の両方にかなり慣れていません。現在、AES (16 バイト シード / 16 バイト ブロック) の復号化関数を作成中です。すべてが順調に進んでいますが、データの合計サイズが常にブロック サイズの倍数になるとは限りません。データの最後に残ったデータを処理する最善の方法を考えています。

AES ライブラリに Crypto++ を使用しています。

このProcessBlock()関数は、入力および出力の char 配列を取ります。少なくともブロックサイズとして十分な大きさであることが期待されていると思います。

ブロック暗号で 16 バイトのブロックすべてを処理し、残りのデータも処理する最善の方法は何でしょうか?

4

3 に答える 3

1

パディングだけではありません。操作モードが必要です。Good Math, Bad Math ブログは、それらが何であるか、そしてそれらをどのように使用するかについての優れたシリーズをここで書いています. ウィキペディアのエントリも参照してください。非常に重要なことの 1 つは、各ブロックを個別に暗号化する ECB (Electronic Code Book) モードを絶対に使用しないことです。これは明らかな方法ですが、恐ろしいほど貧弱なセキュリティを提供します。

ただし、理想的には、これを自分で行う必要さえありません。あなたの暗号ライブラリがそれを提供するはずです。そうでない場合は、別のものに変更することをお勧めします。OpenSSLのように。

于 2008-09-26T21:15:09.993 に答える
0

あなたが望むのはパディングシステムです。

Crypto++ に関するこの CodeProject の記事をご覧ください

メッセージが暗号のブロック サイズの倍数でない場合、ECB または CBC モード メッセージをパディングする必要があります。パディングの方法と値は、暗号化ライブラリと API 間の相互運用性に関する問題の原因です。Garth Lancaster が指摘しているように、パディングの詳細を認識していない場合は、StreamTransformationFilter を使用してください。この場合、Crypto++ フィルターがパディングします。

于 2008-09-26T19:25:10.973 に答える
0

「パディング」と呼ばれるものの PKCS 標準があります。

ウィキペディアのページを参照してください。ただし、次のいずれかでパディングされます。

 01
 02 02
 03 03 03
 04 04 04 04
 05 05 05 05 05

このようにして、元のメッセージがどこで終了するかを解読中に知ることができます...

于 2008-09-26T19:25:22.003 に答える