2


0

C でブロック暗号を処理する最良の方法は? (暗号)

私はC暗号化とブロック暗号化暗号化のどちらにもかなり慣れていません。現在、AES(16バイトシード/ 16バイトブロック)用の復号化機能を作成中です。 すべてうまくいっていますが、私の合計データサイズは常に私のブロックサイズの倍数ではありません。 データの最後に残ったデータを処理するための最良の方法は何だろうか。

私はAESライブラリにCryptoを使っています。

`ProcessBlock()`関数は入力と出力のchar配列を取ります。 私はそれがそれらが少なくともブロックサイズとして十分に大きいことを期待していると思います。

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

3 Answer


1


それは単なるパディング以上のものです - あなたは動作モードが必要です。 Good Math、Bad Mathブログは、それらが何であるか、そしてそれらをどのように使用するかについての素晴らしいシリーズを書いています ここWikipediaのエントリも参照してください。 本当に重要なことの1つ:ECB(Electronic Code Book)モードを使用しないでください - 各ブロックを個別に暗号化します。 それはそれをする明白な方法ですが、それは明らかに貧弱なセキュリティを提供します。

理想的には、しかし、あなたも自分でこれをする必要がないはずです。 あなたの暗号ライブラリはそれを提供するべきです。 そうでない場合は、他のものに変更することをお勧めします。 OpenSSLのように。


0


あなたが欲しいのはパディングシステムです。

http://www.codeproject.com/KB/security/BlockCiphers.aspx [暗号に関するこのCodeProjectの記事]をチェックしてください。

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


0


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

http://en.wikipedia.org/wiki/Padding_(cryptography)[wikipedia page]を参照してください。ただし、次のいずれかでパディングされます。
01 02 02 03 03 03 04 04 04 04 05 05 05 05 05 05

このようにして、復号化中に元のメッセージが終わる場所を知ることができます。