PKCS#5 section 4.1 より引用:
For instance, suppose two legitimate parties exchange a encrypted message, where the encryption key is an 80-bit key derived from a shared password with some salt. An opponent could take the salt from that encryption and provide it to one of the parties as though it were for a 40-bit key. If the party reveals the result of decryption with the 40-bit key, the opponent may be able to solve for the 40-bit key. In the case that 40-bit key is the first half of the 80-bit key, the opponent can then readily solve for the remaining 40 bits of the 80-bit key.
何回も読み直してようやく理解できた、と思う。
パスワードを元に鍵を導出する関数:PBKDF は、Nビットの鍵を得るために、パスワードとソルトから作ったビット列を先頭からNビットだけ切り出して鍵とする。つまり同じパスワードとソルトから異なる長さの鍵を生成した場合、短い方は長い方の先頭部分と一致する。これは必ずしも鍵導出関数一般の性質とは言えないのでは無いかと思うが、少なくとも PBKDF1(PKCS#5 v1.5)、PBKDF2(PKCS#5 v2.0)、EVP_BytesToKeys、いずれにも当てはまる。
それを前提として、引用文の例は次のようなものである:今「80ビットの鍵で暗号化された暗号文」と、その鍵を導出するのに使ったソルトとが公開されていたとする。攻撃者は両者を「40ビットの鍵で暗号化した暗号文」およびそのソルトだと偽って正規の復号者に渡す。だまされた復号者はソルトと正規のパスワードから40ビットの鍵を導出して復号処理を行う(この鍵は本来の80ビットの鍵の前半40ビットである)。結果、「元の暗号文を40ビットの鍵で復号処理したバイナリ」が作り出されることになる。もし攻撃者がこのバイナリを手に入れた場合、高々40ビットの鍵なので、ブルートフォース等で鍵を特定することは可能である。すると残る鍵は後半40ビットだけなので、これも同様に破ることができるようになる。つまり「80ビットの鍵」が「40ビットの鍵2つ」に分割されてしまった!しかもこの操作は(鍵長とアルゴリズムの都合さえ合えば)何度も繰り返すことができる。一般に N ビットの鍵に対して M 回繰り返せば、 N / (M+1) + M ビットにまで鍵を弱めることができる。こういった攻撃を防ぐために、PKCS#5 ではソルトの中に非ランダムな構造を持たせ、鍵の長さや用途(暗号化かメッセージ認証か)等を含める方法を提案している。
ただ、常に対策が必要なほどの脅威だとは、PKCS#5 には書いていない。”there is no concern about interactions between multiple uses of the same key” なら、ランダムに選ぶだけで良いとある(ただし長さは8ビット以上)。要するに固定的な用途で、単発的に用いるだけなら問題にしなくて良い、ということになるだろうか。
(実際のところ、上の例自体はかなり特殊な状況設定だと思う。”If the party reveals the result of decryption with the 40-bit key” なんてサラリと書いてあるが、そんなことが起こり得る状況なら元の平文が漏れる危険性の方が高いだろう)。