CryptDeriveKey 関数 (wincrypt.h)
この関数は、CryptGenKeyと同じですが、生成された セッション キー はランダムではなく、基本データから派生します。
CryptDeriveKey は、セッション キーの生成にのみ使用できます。
セッション キーへのハンドルは、phKey パラメーターで返されます。 このハンドルは、キー ハンドルを必要とする任意の CryptoAPI 関数で使用できます。
構文
BOOL CryptDeriveKey(
[in] HCRYPTPROV hProv,
[in] ALG_ID Algid,
[in] HCRYPTHASH hBaseData,
[in] DWORD dwFlags,
[in, out] HCRYPTKEY *phKey
);
パラメーター
[in] hProv
HCRYPTPROV、CryptAcquireContextの呼び出しによって作成された CSP のハンドルです。
[in] Algid
キーを生成する 対称暗号化 アルゴリズムを識別する ALG_ID 構造体。 使用可能なアルゴリズムは、CSP ごとに異なる可能性が最も高くなります。 キー スペックのAT_KEYEXCHANGEとAT_SIGNATUREに対してさまざまなプロバイダーによって使用されるアルゴリズム識別子の詳細については、ALG_IDを参照してください。
Microsoft 基本暗号化プロバイダーで使用する ALG_ID 値の詳細については、「基本プロバイダー アルゴリズムの」を参照してください。 Microsoft Strong Cryptographic Provider または Microsoft Enhanced Cryptographic Provider で使用する ALG_ID 値の詳細については、「拡張プロバイダー アルゴリズムの」を参照してください。
[in] hBaseData
正確な基本データをフィードした ハッシュ オブジェクト へのハンドル。
このハンドルを取得するには、アプリケーションで最初に CryptCreateHash
[in] dwFlags
生成されるキーの種類を指定します。
セッション キーのサイズは、キーの生成時に設定できます。 キー サイズは、キーの剰余の長さをビット単位で表し、このパラメーターの上位 16 ビットで設定されます。 したがって、128 ビット
このパラメーターの下位 16 ビットは 0 にすることも、ビットごとのOR 演算子を使用して次のフラグを組み合わせて指定することもできます。
価値 | 意味 |
---|---|
|
通常、セッション キーが ハッシュ 値から作成された場合、残りのビットが多数存在します。 たとえば、ハッシュ値が 128 ビットで、セッション キーが 40 ビットの場合、88 ビットが残ります。
このフラグが設定されている場合、キーには、未使用のハッシュ値ビットに基づいて このフラグが設定されていない場合、キーには 0 の salt 値が指定されます。 (CryptExportKeyを使用して) 0 以外の salt 値を持つキーをエクスポートする場合は、salt 値も取得し、キー BLOBと共に保持する必要があります。 |
|
このフラグが設定されている場合、セッション キーは、CryptExportKey 関数を使用して CSP からキー BLOB に転送できます。 通常、キーはエクスポート可能である必要があるため、このフラグは通常設定する必要があります。
このフラグが設定されていない場合、セッション キーはエクスポートできません。 つまり、キーは現在のセッション内でのみ使用でき、キーを作成したアプリケーションのみがキーを使用できます。 このフラグは、 |
|
このフラグは、40 ビット |
|
一部の CSP は、複数のハッシュ値から派生したセッション キーを使用します。 この場合、CryptDeriveKey を複数回呼び出す必要があります。
このフラグが設定されている場合、新しいセッション キーは生成されません。 代わりに、phKey で指定 Microsoft 暗号化サービス プロバイダーは、このフラグを無視します。 |
|
このフラグは、Schannel プロバイダーでのみ使用されます。 このフラグが設定されている場合、生成されるキーはサーバー書き込みキーです。それ以外の場合は、クライアント書き込みキーです。 |
[in, out] phKey
HCRYPTKEY 変数へのポインター。新しく生成されたキーのハンドルのアドレスを受け取ります。 キーの使用が完了したら、CryptDestroyKey 関数を呼び出してハンドルを解放します。
戻り値
関数が成功した場合、関数は 0 以外 (TRUE) を返します。
関数が失敗した場合は、0 (FALSE
"NTE" で開始されるエラー コードは、使用されている特定の CSP によって生成されます。 考えられるエラー コードを次の表に示します。
リターン コード | 形容 |
---|---|
|
パラメーターの 1 つは無効なハンドルを指定します。 |
|
パラメーターの 1 つに無効な値が含まれています。 これは、多くの場合、無効なポインターです。 |
|
Algid パラメーターは、この CSP がサポートしていないアルゴリズムを指定します。 |
|
dwFlags パラメーターに無効な値が含まれています。 |
|
hBaseData パラメーターには、ハッシュ オブジェクトへの有効なハンドルが含まれていません。 |
|
既に "完了" とマークされているハッシュ オブジェクトにデータを追加しようとしました。 |
|
hProv パラメーターに有効なコンテキスト ハンドルが含まれていません。 |
|
予期しない方法で関数が失敗しました。 |
|
コンテキストがサイレントとして取得されたため、プロバイダーはアクションを実行できませんでした。 |
備考
CryptDeriveKey 関数は、ハッシュを完了します。
CryptDeriveKey が呼び出された後、ハッシュにデータを追加することはできません。 CryptHashData または CryptHashSessionKey
適切な キー長を選択するには、次の方法をお勧めします。
- CSP がサポートするアルゴリズムを列挙し、各アルゴリズムの最大キー長と最小キー長を取得するには、PP_ENUMALGS_EXを使用して CryptGetProvParam
呼び出します。 - 適切なキー長を選択するには、最小長と最大長を使用します。 パフォーマンスの問題につながる可能性があるため、最大長を選択することは必ずしもお勧めできません。
- 目的のキー長を選択したら、dwFlags パラメーターの上位 16 ビットを使用して、キーの長さを指定します。
- 定数を 64 回繰り返して 64 バイトのバッファー 0x36 形成します。
k hBaseDataの入力パラメーターで表されるハッシュ値長くします。 バッファーの最初の k バイトを、バッファーの最初のk バイトのXOR 演算の結果に、hBaseData入力パラメーターで表されるハッシュ値に設定します。 - 定数を 64 回繰り返して 64 バイトのバッファー 0x5C 形成します。 バッファーの最初の
k バイトを、バッファーの最初のk バイトのXOR 演算の結果に、hBaseData入力パラメーターで表されるハッシュ値に設定します。 - hBaseData パラメーターで表されるハッシュ値の計算に使用したのと同じハッシュ アルゴリズムを使用して、手順 1 の結果をハッシュします。
- hBaseData パラメーターで表されるハッシュ値の計算に使用したのと同じハッシュ アルゴリズムを使用して、手順 2 の結果をハッシュします。
- 手順 3 の結果と手順 4 の結果を連結します。
- 手順 5 の結果の最初の n バイトを派生キーとして使用します。
次の表に、アルゴリズムとプロバイダーごとのセッション キーの最小、既定値、および最大キーの長さを示します。
供給者 | アルゴリズム | 最小キーの長さ | 既定のキーの長さ | キーの最大長 |
---|---|---|---|---|
MS Base | RC4 と RC2 | 40 | 40 | 56 |
MS Base | DES | 56 | 56 | 56 |
MS Enhanced | RC4 と RC2 | 40 | 128 | 128 |
MS Enhanced | DES | 56 | 56 | 56 |
MS Enhanced | 3DES 112 | 112 | 112 | 112 |
MS Enhanced | 3DES | 168 | 168 | 168 |
MS Strong | RC4 と RC2 | 40 | 128 | 128 |
MS Strong | DES | 56 | 56 | 56 |
MS Strong | 3DES 112 | 112 | 112 | 112 |
MS Strong | 3DES | 168 | 168 | 168 |
DSS/DH ベース | RC4 と RC2 | 40 | 40 | 56 |
DSS/DH ベース | Cylink MEK | 40 | 40 | 40 |
DSS/DH ベース | DES | 56 | 56 | 56 |
DSS/DH Enh | RC4 と RC2 | 40 | 128 | 128 |
DSS/DH Enh | Cylink MEK | 40 | 40 | 40 |
DSS/DH Enh | DES | 56 | 56 | 56 |
DSS/DH Enh | 3DES 112 | 112 | 112 | 112 |
DSS/DH Enh | 3DES | 168 | 168 | 168 |
例
この関数を使用する例については、「例 C プログラム: パスワードからセッション キーを派生する」を参照してください。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows XP [デスクトップ アプリのみ] |
サポートされる最小サーバー | Windows Server 2003 [デスクトップ アプリのみ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | wincrypt.h |
ライブラリ | Advapi32.lib |
DLL | Advapi32.dll |