「鍵導出関数」の版間の差分
提供: セキュリティ
(ページの作成:「鍵導出関数 (Key Derivation Function ,KDF)とは、鍵を導出するための関数で、鍵導出アルゴリズムの実装です。鍵導出アルゴリズム...」) |
(→C言語) |
||
(同じ利用者による、間の1版が非表示) | |||
行66: | 行66: | ||
00000040 | 00000040 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | === C言語 === | ||
+ | <syntaxhighlight lang="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); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | cc -Wall pbkdf2.c -lcrypto | ||
+ | </syntaxhighlight> | ||
+ | |||
== 関連項目 == | == 関連項目 == | ||
* [[鍵]] | * [[鍵]] |
2015年6月14日 (日) 19:21時点における最新版
鍵導出関数 (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