公開鍵暗号スキームで用いられる補助メソッド(鍵導出関数,メッセージエンコード関数)である.
鍵導出関数 (Key Derivation Function) $\mathrm{KDF} (x, l)$ は,入力バイト列 $x$ から指定された長さ $l\ (\ge 0)$ のバイト列を出力する関数である.この出力バイト列は,共通鍵暗号用の鍵として利用するためランダム性を考慮して生成される.KDF はマスク生成関数 (Mask Generation Function: MGF)とも呼ばれる.KDF は,ISO-18033-2 に規定されている.
$\mathrm{Hash} (x\ ||\ \mathrm{I2OSP} (0, 4))\ || \cdots ||\ \mathrm{Hash} (x\ ||\ \mathrm{I2OSP} (k-1, 4))$
の先頭 $l$ バイトを出力する.ここで,$k = \lceil l/Hash.OutputLen \rceil$ である.I2OSP については,データ型の変換を参照.$\mathrm{Hash} (x\ ||\ \mathrm{I2OSP} (1, 4))\ || \cdots ||\ \mathrm{Hash} (x\ ||\ \mathrm{I2OSP} (k, 4))$
の先頭 $l$ バイトを出力する.ここで,$k = \lceil l/Hash.OutputLen \rceil$ である.$\mathrm{Hash} (\mathrm{I2OSP} (0, pamt)\ ||\ x\ || \cdots ||\ \mathrm{Hash} (\mathrm{I2OSP} (k-1, pamt)\ ||\ x)$
の先頭 $l$ バイトを出力する.ここで,$k = \lceil l/Hash.OutputLen \rceil$ である.$\mathrm{PRBG} (\mathrm{Hash} (x), l)$
により $l$ バイトを出力する. ここで, $\mathrm{PRBG} (s, l)$ は擬似乱数生成関数であり,乱数種 $s$ から長さ $l$ の乱数データを生成するものである.メッセージ $M$ に対し,次のようにブロック $EB$ をパディング文字列 $PS$ を用いて構成する.
$EB = 00\ ||\ \mathrm{BT}\ ||\ PS\ ||\ 00\ ||\ M$
ここで,$\mathrm{BT}$ はブロックタイプで秘密鍵を用いた処理(署名)の場合 0x01,公開鍵を用いた処理(暗号化)の場合 0x02 の値を取る.
パディング文字列 $PS$ は,$k - 3 - |M|$ 個の文字(バイト)から構成される.ここで,$k$ は鍵長である.パディング文字列 $PS$ の値は,$\mathrm{BT}$ が 0x01 のとき FF,$\mathrm{BT}$ が 0x02 のとき 0 でない乱数バイトを設定する.この乱数バイトは各暗号化プロセスごとに異なった乱数を設定することが推奨されている.
メッセージ $M$ の長さは,$k - 11$ より大きくてはならない.これは,少なくともパディング文字列 $PS$ を $8$ 文字以上にするためで,セキュリティ上必要である.
ブロック $EB$ の先頭の 0 を除いて次に現れる 0 までがパディング文字と判断でき,元のメッセージを取り出すことができる.
Options: | $\mathrm{Hash}$ | ハッシュ関数($hLen$ :ハッシュ関数の出力バイト長) |
$\mathrm{MGF}$ | マスク生成関数 | |
Input: | $M$ | メッセージ($emLen - 1 - 2 hLen$ 以下) |
$P$ | エンコードパラメータ | |
$emLen$ | エンコードメッセージの長さ($2 hLen + 1$ 以上) | |
Output: | $EM$ | エンコードメッセージ |
$DB = pHash\ ||\ PS\ ||\ 01\ ||\ M$
$DB = pHash'\ ||\ PS\ ||\ 01\ ||\ M$
$PS$ と $M$ を分離するための '01' がない場合は,デコードエラーとして処理終了.Options: | $\mathrm{Hash}$ | ハッシュ関数($hLen$:ハッシュ関数の出力バイト長) |
Input: | $Z$ | マスクを生成するための種 |
$l$ | マスクの長さ($2^{32}\ hLen$ 以下) | |
Output: | $mask$ | 長さ $l$ のマスクデータ |
$C = \mathrm{I2OSP} (counter, 4)$
$T = T\ ||\ \mathrm{Hash} (Z\ ||\ C)$