共通鍵暗号によりメッセージを暗号化する際に,共通鍵を与える代わりにパスワードを与え,パスワードから鍵を生成しメッセージを暗号化する方式である(PKCS#5).
パスワード暗号方式では,暗号化や復号時に暗号鍵を準備する必要がなく任意のパスワードを暗号鍵の代わりに利用することができる.
鍵導出関数 (Key Derivation Function: KDF)は,与えられたパスワードから共通鍵暗号用の鍵を生成する関数である. 同一パスワードから異なる鍵が生成できるようにソールト $S$(任意長オクテット)と繰り返し数 $c$(整数)の2つのパラメータを用いる.
代表的な鍵導出関数を示す.
$H$ | : | ハッシュ関数 |
$P$ | : | パスワード (オクテット列) |
$S$ | : | ソールト (8Bオクテット列) |
$c$ | : | 繰り返し数 (整数) |
$dkLen$ | : | 生成鍵長(オクテット) |
$DK$ | : | 鍵 ($dkLen$ 長のオクテット列) |
パスワード $P$ とソールト $S$ の結合データに対し,$c$ 回ハッシュ関数 $H$ を適用し,その結果の最初の $dkLen$ オクテットを鍵 $DK$ とする.
$PRF$ | : | 擬似乱数生成関数 (出力データ長: $hLen$) |
$P$ | : | パスワード (オクテット列) |
$S$ | : | ソールト (8Bオクテット列) |
$c$ | : | 繰り返し数 (整数) |
$dkLen$ | : | 生成鍵長(オクテット) |
$DK$ | : | 鍵 ($dkLen$ 長のオクテット列) |
パスワード $P$ とソールト $S$ の結合データに対し,以下の手順により $dkLen$ オクテットの鍵 $DK$ を生成する.
$l = \lceil(dkLen / hLen)\rceil$
$r = dkLen - (l - 1) \times hLen$
$F(P, S, c, i) = U_1 \oplus U_2 \oplus \cdots \oplus U_c$
$U_1 = PRF(P, S\ ||\ INT(i))$
$U_2 = PRF(P, U_1)$
・・・
$U_c = PRF(P, U_{c-1})$
$DK = T_1\ ||\ T_2\ ||\ \cdots\ ||\ T_l <0 \ldots r- 1>$
$DK = PBKDF1(P, S, c, 16)$
$K = DK <0 ... 7>$
$IV = DK <8 ... 15>$
$EM = M\ ||\ PS$
ここで,パディング $PS$ は以下の関係より求められ,$8 - (||M|| \bmod 8)$ オクテッ トからなる.$PS = 01 \qquad if\ |M| \bmod 8 = 7$
$PS = 02 02 \quad if\ |M| \bmod 8 = 6$
・・・
$PS = 08 08 08 08 08 08 08 08 \quad if\ |M| \bmod 8 = 0$
$EM$ の最終オクテットを見ることにより,パディング文字数が判断でき,元のメッセージ $M$ を取り出すことができる.$DK = KDF(P, S, c, dkLen)$