web-dev-qa-db-ja.com

メッセージ長がブロックサイズの倍数である場合のAES CBCパディング

32バイトの平文がAES 128 CBCによって暗号化されていると仮定すると、さまざまなパディング方式に従って、16バイトのパディングを追加することは必須ですか?

21
moti

パディングは、ブロック暗号が他の方法で復号化できないサイズのメッセージを暗号化する方法です。暗号化する人と復号する人の間の慣習です。入力メッセージの長さが常に暗号化モードで処理できる場合(たとえば、メッセージの長さが常に16の倍数である場合)、パディングを追加する必要はありません-限り復号化中、パディングがない場合はパディングを探しません。メッセージのsomeにパディングが必要な場合は、ある種のパディングを体系的に追加する必要があります。そうしないと、復号化があいまいになります。

パディングはセキュリティを追加しません。不適切に実装されたパディングmanagementは情報をリークする可能性があるため( padding oracles )、実装に注意する必要があります-できれば自分でやる。

(もちろん、パディングを必要としない暗号化モードが必要ですが、見過ごされがちな整合性チェックが含まれています。これにより、平均 [〜#〜] gcm [〜#〜] または [〜#〜] eax [〜#〜] 、CBCではありません。)

21
Thomas Pornin

それはすべて、暗号化する対象によって異なります。常に32バイト(またはブロックサイズの倍数)の長さのデータを暗号化する場合は、パディングを使用する必要はありません。

プレーンテキストが任意の長さである場合は、テキストをパディングし、復号化するときにデータをパディングから分離できるメカニズムを使用する必要があります。

1バイトが欠落している場合は01、2バイトが欠落している場合は02 02などのパディングスキームを使用しているとします。

また、16バイトのテキストのパディングを追加する必要があります。

01 02 03 05 06 01 02 03 05 06 06 01

これが15バイトのテキストかどうかはわかりません。

01 02 03 05 06 01 02 03 05 06 06 + 01

パディングされなかった16バイトのテキストのパディング:

01 02 03 05 06 01 02 03 05 06 06 01

上記の問題は、長さに関係なく常にデータにパディングすることを理解することで解決されます。

7
Dinu

ブロックサイズの倍数であるメッセージにパディングを追加することは「必須」ではありませんが、ほとんどの実装ではそうです。 PKCS#5パディングでは、1ブロックのバイトを追加することを規定し、すべてゼロに設定して、送信されたすべてのブロックが実際にあることをアルゴリズムに伝えます。これは、実装が任意の長さの何かを暗号化し、「信頼できない」転送方法で送信するように要求される場合に役立ちます。 TCPなどの独自のエラーチェックを備えた通信層を使用し、パディングされていないメッセージがalways使用されているブロックサイズの正確な倍数であることがわかっている場合は、冗長です。

2
KeithS