CryptGenKey 関数 (wincrypt.h)
呼び出し元のアプリケーションは、この関数を呼び出すときにアルゴリズムを指定する必要があります。 このアルゴリズムの種類はキーにバンドルされたままであるため、実際の暗号化操作が実行されるときに、後でアルゴリズムを指定する必要はありません。
構文
BOOL CryptGenKey(
[in] HCRYPTPROV hProv,
[in] ALG_ID Algid,
[in] DWORD dwFlags,
[out] HCRYPTKEY *phKey
);
パラメーター
[in] hProv
CryptAcquireContext の呼び出しによって作成された暗号化サービス プロバイダー (CSP) へのハンドル。
[in] Algid
キーを生成するアルゴリズムを識別する ALG_ID 値。 このパラメーターの値は、使用される CSP によって異なります。
Microsoft 基本暗号化プロバイダーで使用する ALG_ID 値については、「 基本プロバイダー アルゴリズム」を参照してください。
Microsoft Strong Cryptographic Provider または Microsoft Enhanced Cryptographic Provider で使用する ALG_ID 値については、「 拡張プロバイダー アルゴリズム」を参照してください。
Diffie-Hellman CSP の場合は、次のいずれかの値を使用します。
値 | 意味 |
---|---|
|
"エフェメラル" Diffie-Hellman キーを指定します。 |
|
"ストアアンドフォワード" Diffie-Hellman キーを指定します。 |
この関数では、 対称アルゴリズムのセッション キーの生成に加えて、 公開キーと秘密キーのペアを生成することもできます。 各 CryptoAPI クライアントには、通常、2 つの公開キーと秘密キーのペアがあります。 これらのキー ペアのいずれかを生成するには、 Algid パラメーターを次のいずれかの値に設定します。
値 | 意味 |
---|---|
|
キーの交換 |
|
デジタル署名 |
[in] dwFlags
生成されるキーの種類を指定します。 セッション キー、RSA 署名キー、RSA キー 交換キー のサイズは、キーの生成時に設定できます。 キーの係数の長さをビット単位で表すキー サイズは、このパラメーターの上位 16 ビットで設定されます。 したがって、2,048 ビット RSA 署名キーを生成する場合、0x08000000値は、ビットごとの OR 演算を使用して定義済みの値を他の dwFlags と組み合わせて使用されます。 0x08000000の上位 16 ビットは0x0800、つまり 10 進数の 2,048 です。 RSA1024BIT_KEY値を使用して、1024 ビット RSA キーを指定できます。
エクスポート制御の制限が変更されたため、既定の CSP と既定の キーの長さは 、オペレーティング システムのバージョン間で変更される可能性があります。 暗号化と暗号化解除の両方で同じ CSP を使用し、 dwFlags パラメーターを使用してキーの長さを明示的に設定して、異なるオペレーティング システム プラットフォームでの相互運用性を確保することが重要です。
特に、既定の RSA 完全暗号化サービス プロバイダーは、Microsoft RSA Strong Cryptographic Provider です。 既定の DSS 署名 Diffie-Hellman 暗号化サービス プロバイダーは、Microsoft Enhanced DSS Diffie-Hellman Cryptographic Provider です。 これらの各 CSP には、RC2 と RC4 の既定の 128 ビット対称キー長と、公開キー アルゴリズム用の 1,024 ビットの既定のキー長があります。
上位 16 ビットが 0 の場合、既定のキー サイズが生成されます。 最大値より大きいキーまたは最小値より小さいキーが指定されている場合、呼び出しはERROR_INVALID_PARAMETERコードで失敗します。
次の表に、Windows XP 以降の署名と交換キーの最小、既定値、最大の長さを示します。
キーの種類とプロバイダー | [最小長] | 既定の長さ | 最大長 |
---|---|---|---|
RSA ベース プロバイダー Signature と ExchangeKeys |
384 | 512 | 16,384 |
RSA の強力なプロバイダーと強化されたプロバイダー 署名キーと Exchange キー |
384 | 1,024 | 16,384 |
DSS ベース プロバイダー 署名キー |
512 | 1,024 | 1,024 |
DSS ベース プロバイダー Exchange キー |
適用なし | 適用なし | 適用なし |
DSS/DH ベース プロバイダー 署名キー |
512 | 1,024 | 1,024 |
DSS/DH ベース プロバイダー Exchange キー |
512 | 512 | 1,024 |
DSS/DH 拡張プロバイダー 署名キー |
512 | 1,024 | 1,024 |
DSS/DH 拡張プロバイダー Exchange キー |
512 | 1,024 | 4,096 |
セッション キーの長さについては、「 CryptDeriveKey」を参照してください。
Microsoft プロバイダーを使用して生成されるキーの詳細については、「 Microsoft Cryptographic Service Providers」を参照してください。
このパラメーターの下位 16 ビットは、0 または次の値の 1 つ以上の組み合わせにすることができます。
値 | 意味 |
---|---|
|
このフラグが設定されている場合、 CryptDestroyKey の呼び出しによってハンドルが閉じられるまで、キーをエクスポートできます。 これにより、アーカイブまたはキーの回復のために、作成時に新しく生成されたキーをエクスポートできます。 ハンドルを閉じると、キーはエクスポートできなくなります。 |
|
このフラグは使用されません。 |
|
このフラグが設定されている場合、キーにはランダムな ソルト値 が自動的に割り当てられます。 この salt 値を取得するには、dwParam パラメーターを KP_SALT に設定した CryptGetKeyParam 関数を使用します。
このフラグが設定されていない場合、キーには 0 の salt 値が指定されます。 0 以外の salt 値を持つキーをエクスポートする場合 ( CryptExportKey を使用)、 salt 値 も取得し、 キー BLOB と共に保持する必要があります。 |
|
このフラグは使用されません。 |
|
このフラグが設定されている場合は、 CryptExportKey 関数を使用して、キーを CSP からキー BLOB に転送できます。 通常、セッション キーはエクスポート可能である必要があるため、このフラグは通常、作成時に設定する必要があります。
このフラグが設定されていない場合、キーはエクスポートできません。 セッション キーの場合、これは、キーが現在のセッション内でのみ使用でき、キーを作成したアプリケーションのみが使用できることを意味します。 公開キーと秘密キーのペアの場合、これは秘密キーを転送またはバックアップできないことを意味します。 このフラグは、セッション キーと 秘密キー BLOB にのみ適用されます。 常にエクスポート可能な公開キーには適用されません。 |
|
このフラグは、強力なキー保護を指定します。 このフラグを設定すると、キーの作成時にキーのパスワードを入力するように求められます。 このキーが使用されるたびに、ユーザーにパスワードの入力を求められます。
このフラグは、Microsoft によって提供される CSP でのみ使用されます。 サード パーティの CSP は、強力なキー保護のために独自の動作を定義します。 システム レジストリで強力なキー保護が指定されている場合、このフラグを指定すると 、CRYPT_USER_PROTECTED フラグを使用してこの関数を呼び出した場合と同じ結果が発生します。 このフラグを指定し、 hProv パラメーターのプロバイダー ハンドルが CRYPT_VERIFYCONTEXT または CRYPT_SILENT フラグを使用して作成された場合、この関数は最後のエラーを NTE_SILENT_CONTEXT に設定し、0 を返します。 Windows Server 2003 および Windows XP: このフラグはサポートされていません。 |
|
このフラグは使用されません。 |
|
このフラグは使用されません。 |
|
このフラグは、40 ビット対称キーに対して salt 値が割り当てられないことを指定します。 詳細については、「 Salt Value Functionality」を参照してください。 |
|
このフラグは使用されません。 |
|
このフラグは、初期 Diffie-Hellman または DSS キー生成を指定します。 このフラグは、Diffie-Hellman および DSS CSP でのみ役立ちます。 使用すると、 dwFlags パラメーターの上位 16 ビットでキー長が指定されていない限り、既定のキー長が使用されます。 CryptSetKeyParam を使用して PREGEN Diffie-Hellman または DSS キーにキー長を含むパラメーターを設定する場合、キーの長さはここで設定したキー長と互換性がある必要があります。 |
|
このフラグは使用されません。 |
|
このフラグは使用されません。 |
|
このフラグは使用されません。 |
|
このフラグを設定すると、特定のアクションがこのキーを使用しようとしたときに、ダイアログ ボックスまたは別のメソッドを介してユーザーに通知されます。 正確な動作は、使用されている CSP によって指定されます。 プロバイダー コンテキストが CRYPT_SILENT フラグを設定して開かれた場合、このフラグを使用するとエラーが発生し、最後のエラーがNTE_SILENT_CONTEXTに設定されます。 |
|
このフラグは使用されません。 |
[out] phKey
関数が新しく生成されたキーのハンドルをコピーするアドレス。 キーの使用が完了したら、 CryptDestroyKey 関数を呼び出して、キーへのハンドルを削除します。
戻り値
成功した場合は 0 以外、それ以外の場合は 0 を返します。
拡張エラー情報については、 GetLastError を呼び出します。
"NTE" の前にあるエラー コードは、使用されている特定の CSP によって生成されます。 考えられるエラー コードの一部を次の表に示します。
リターン コード | 説明 |
---|---|
|
パラメーターの 1 つは、無効なハンドルを指定します。 |
|
パラメーターの 1 つに無効な値が含まれています。 これは、ほとんどの場合、無効なポインターです。 |
|
Algid パラメーターは、この CSP でサポートされていないアルゴリズムを指定します。 |
|
dwFlags パラメーターに無効な値が含まれています。 |
|
hProv パラメーターに有効なコンテキスト ハンドルが含まれていません。 |
|
関数が予期しない方法で失敗しました。 |
|
コンテキストがサイレントとして取得されたため、プロバイダーはアクションを実行できませんでした。 |
注釈
対称ブロック暗号に対してキーが生成される場合、キーは既定で、初期化ベクトルが 0 の暗号ブロック チェーン (CBC) モードで設定されます。 この 暗号モード では、データを一括暗号化するための適切な既定の方法が提供されます。 これらのパラメーターを変更するには、 CryptSetKeyParam 関数を 使用します。
適切な キー長を選択するには、次の方法をお勧めします。
- CSP がサポートするアルゴリズムを列挙し、各アルゴリズムの最大キー長と最小キー長を取得します。 これを行うには、PP_ENUMALGS_EXを使用して CryptGetProvParam を呼び出します。
- 適切なキー長を選択するには、最小長と最大長を使用します。 パフォーマンスの問題が発生する可能性があるため、最大長を選択することは必ずしもお勧めできません。
- 目的のキー長が選択されたら、 dwFlags パラメーターの上位 16 ビットを使用してキーの長さを指定します。
例
次の例は、ランダムなセッション キーの作成を示しています。 この例の完全なコンテキストを含む例については、「 サンプル C プログラム: ファイルの暗号化」を参照してください。 この関数を使用する別の例については、「 サンプル C プログラム: ファイルの復号化」を参照してください。
//-------------------------------------------------------------------
// Declare the handle to the key.
HCRYPTKEY hKey;
//-------------------------------------------------------------------
// This example assumes that a cryptographic context
// has been acquired, and that it is stored in hCryptProv.
//---------------------------------------------------------------
// Create a random session key.
if(CryptGenKey(
hCryptProv,
ENCRYPT_ALGORITHM,
KEYLENGTH | CRYPT_EXPORTABLE,
&hKey))
{
printf("A session key has been created.\n");
}
else
{
printf("Error during CryptGenKey.\n");
exit(1);
}
//-------------------------------------------------------------------
// The key created can be exported into a key BLOB that can be
// written to a file.
// ...
// When you have finished using the key, free the resource.
if (!CryptDestroyKey(hKey))
{
printf("Error during CryptDestroyKey.\n");
exit(1);
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
対象プラットフォーム | Windows |
ヘッダー | wincrypt.h |
Library | Advapi32.lib |
[DLL] | Advapi32.dll |
こちらもご覧ください
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示