メインコンテンツまでスキップ

5.2. PBKDF2

5.2. PBKDF2

PBKDF2 は、疑似ランダム関数 (例については Appendix B.1 を参照) を適用して鍵を導出します。導出鍵の長さは本質的に無制限です (ただし、導出鍵の最大有効検索空間は、基礎となる疑似ランダム関数の構造によって制限される可能性があります。詳細については Appendix B.1 を参照してください)。PBKDF2 は新しいアプリケーションに推奨されます。

PBKDF2 (P, S, c, dkLen)

Options (オプション):

  • PRF - 基礎となる疑似ランダム関数 (hLen は疑似ランダム関数出力の長さをオクテット単位で示します)

Input (入力):

  • P - パスワード、オクテット文字列
  • S - ソルト、オクテット文字列
  • c - 反復回数、正の整数
  • dkLen - 導出鍵の意図された長さ (オクテット単位)、正の整数、最大 (2^32 - 1) * hLen

Output (出力):

  • DK - 導出鍵、dkLen オクテット文字列

Steps (手順):

  1. dkLen が (2^32 - 1) * hLen より大きい場合、"derived key too long" (導出鍵が長すぎます) を出力して停止します。

  2. l を導出鍵内の hLen オクテットブロックの数 (切り上げ) とし、r を最後のブロックのオクテット数とします:

    l = CEIL (dkLen / hLen)
    r = dkLen - (l - 1) * hLen

    ここで、CEIL (x) は「天井」関数、つまり x 以上の最小の整数です。

  3. 導出鍵の各ブロックに対して、以下に定義される関数 F を、パスワード P、ソルト S、反復回数 c、およびブロックインデックスに適用して、ブロックを計算します:

    T_1 = F (P, S, c, 1) ,
    T_2 = F (P, S, c, 2) ,
    ...
    T_l = F (P, S, c, l) ,

    ここで、関数 F は、基礎となる疑似ランダム関数 PRF の最初の c 回の反復の排他的論理和の合計として定義されます。これは、パスワード P と、ソルト S とブロックインデックス i の連結に適用されます:

    F (P, S, c, i) = U_1 \xor U_2 \xor ... \xor U_c

    ここで

    U_1 = PRF (P, S || INT (i)) ,
    U_2 = PRF (P, U_1) ,
    ...
    U_c = PRF (P, U_{c-1}) .

    ここで、INT (i) は整数 i の4オクテットエンコーディングで、最上位オクテットが最初です。

  4. ブロックを連結し、最初の dkLen オクテットを抽出して導出鍵 DK を生成します:

    DK = T_1 || T_2 ||  ...  || T_l<0..r-1>
  5. 導出鍵 DK を出力します。

注記: 関数 F の構成は「ベルトとサスペンダー」アプローチに従っています。反復 U_i は、攻撃者から並列性の度合いを除去するために再帰的に計算されます。それらは、再帰が小さな値のセットに退化することについての懸念を減らすために、排他的論理和されます。