鍵導出関数

提供: セキュリティ
移動: 案内検索
スポンサーリンク

鍵導出関数 (Key Derivation Function ,KDF)とは、鍵を導出するための関数で、鍵導出アルゴリズムの実装です。鍵導出アルゴリズムは、パスワードを暗号化用の鍵(KEK)に変換するために利用されます。

読み方

鍵導出関数
かぎどうしゅつ かんすう
Key Derivation Function
きー でりべーしょん ふぁんくしょん
KDF
けー でぃー えふ
導出鍵
どうしゅつ かぎ

概要

鍵導出関数は、パスワード(秘密値)から導出鍵を導出します。導出鍵は、暗号化暗号鍵として利用できます。

鍵導出

鍵導出(Key Derivation)とは、マスタ鍵と呼ばれる秘密の値から秘密鍵を導出する手法です。導出された秘密鍵は、導出鍵と呼ばれます。 鍵導出では、秘密値を不可逆関数(導出関数)入力して、導出鍵を生成します。

鍵導出関数

  • PBKDF1 (Password-Based Key Derivation Function 1)
  • PBKDF2

鍵導出関数のパラメータ

鍵導出関数を求めるためのパラメータには、以下のものがあります。

鍵導出の実装

OpenSSLのライブラリで、鍵導出関数が提供されています。

PHPの場合

  • openssl_pbkdf2
  • hash_pbkdf2

サンプルコード

PHP openssl_pbkdf2

openssl_pbkdf2は、バイト列を返します。

<?php
/**
 * Short description for openssl_pbkdf2.php
 *
 * @package openssl_pbkdf2
 * @author kaoru <kaoru@localhost>
 * @version 0.1
 * @copyright (C) 2015 kaoru <kaoru@localhost>
 */
$algorithm = 'sha512';
$password = '1234';
$salt = openssl_random_pseudo_bytes(64);
$count = 10000;
$key_length = 64;
 
 
$key = openssl_pbkdf2($password, $salt, $key_length, $count, $algorithm);
 
echo($key);
?>
$ php openssl_pbkdf2.php | hexdump -C
00000000  23 93 c5 d9 5e 41 08 43  22 7e ea e3 7d d3 67 08  |#...^A.C"~..}.g.|
00000010  73 6d 94 3a 21 9e a8 09  f6 ed 12 bf 53 c0 70 81  |sm.:!.......S.p.|
00000020  46 4c 1f 7e af 9f 9a 80  94 b6 c9 8b 3a 48 38 59  |FL.~........:H8Y|
00000030  75 f5 70 07 20 e0 58 ca  72 b8 a6 6c bc bd dd 41  |u.p. .X.r..l...A|
00000040
$ php openssl_pbkdf2.php | hexdump -C
00000000  e3 0e bb 1b 78 d0 e8 8f  57 23 06 3c 99 c3 8e 7a  |....x...W#.<...z|
00000010  15 bf 63 ac 88 9d 5f ca  b1 11 3c dc e8 7d 24 53  |..c..._...<..}$S|
00000020  ba 88 b8 8b 26 29 b9 43  a2 cc 67 d4 46 2e ff d9  |....&).C..g.F...|
00000030  49 e7 0e 28 84 61 78 7e  93 f9 61 0e a8 ea c1 0a  |I..(.ax~..a.....|
00000040

C言語

#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/rand.h>
 
void
pbkdf2 (int count, unsigned char *salt)
{
        int     r       = 0;
 
        unsigned char   key [ EVP_MAX_KEY_LENGTH + 1]   = { 0 };
        unsigned char   iv [ EVP_MAX_IV_LENGTH + 1]     = { 0 };
 
        unsigned char   data [ BUF ]    = "pw";
 
        int             datal           = strlen ( (const char *) data );
 
        r       = EVP_BytesToKey (
                        EVP_aes_256_cbc (),
                        EVP_sha1 (),
                        salt,
                        data,
                        datal,
                        count,
                        key,
                        iv);
}
cc -Wall pbkdf2.c -lcrypto

関連項目



スポンサーリンク