鍵導出関数

暗号理論分野における鍵導出関数（かぎどうしゅつかんすう, key derivation function, KDF）は、一つのマスター鍵やパスワード、パスフレーズなどの秘密の値から、一つあるいは複数の秘密鍵を導出するために用いられる関数であり、pseudorandom function（PRF）が利用される。
鍵導出関数は、鍵をより長い鍵に引き延ばしたり、必要なフォーマットを持つ鍵を得るために使うことができる。例えば、ディフィー・ヘルマン鍵共有で共有される値は何らかの群の要素であるが、これをAESで用いる共通鍵へ変換する。

歴史 
1978年に「crypt」というパスワードベースの鍵導出関数が登場したが、パスワードの文字数の上限が8文字であることや、saltが弱いなど問題があった。
PBKDF2などの現代的なパスワードベースの鍵導出関数は、より強いsaltを使い、動作も良い意味で遅い。
ただし、GPUやFPGAなどを使った並列処理による総当たり攻撃が問題になってきており、これに対処するために、bcryptやscrypt、より新しいものではargon2などが登場している。

鍵導出  
鍵導出関数の提案された当初の利用目的は、秘密のパスワードやパスフレーズから鍵を得ることであったが、以下のように異なる目的のものがある。

 パスワードやパスフレーズから鍵を生成するもの。パスワードベース鍵導出関数、Key stretching。パスワードに対する総当たり攻撃を困難にするため、多数の反復計算をするなど、わざと計算に時間がかかるように設計される。例えばPBKDF2がある。
 一つの秘密の値から、秘密ではない値を組み合わせることで複数の鍵を生成するもの。これは「key diversification」とも呼ばれる。生成された一つの鍵を得た攻撃者が、元の秘密の値や、他の鍵についての有用な情報を得るのを阻止する。また、鍵導出関数によって生成された鍵は、特定の暗号システムにおける「弱鍵」を避けるなど、望ましい性質を持つことも保証される。
 鍵共有プロトコルの一要素として利用されるもの。例として、KDF1（IEEE Std 1363-2000て定義されている）や ANSI X9.42の同様の関数がある。
 ある鍵から、長さの異なる鍵を得るためのもの。HKDFはこの目的の鍵導出関数である。

パスワードハッシュ 
鍵導出関数は、本来の目的とは異なる利用方法として、パスワードをパスワードファイルやシャドウパスワードファイルに保管する際のハッシュ関数として使われることが多く、「パスワードハッシュ関数」とも呼ばれる。パスワードハッシュ関数は、総当たり攻撃や辞書攻撃への耐性のため、計算に比較的時間がかかる必要があり、key stretching用の鍵導出関数がこの目的にかなっている。入力にランダムに選ばれた秘密でない値（ソルト）を加えることで、辞書攻撃に強くなる。

脚注

外部リンク 
 

暗号技術