CryptImportKey 関数 (wincrypt.h)
構文
BOOL CryptImportKey(
[in] HCRYPTPROV hProv,
[in] const BYTE *pbData,
[in] DWORD dwDataLen,
[in] HCRYPTKEY hPubKey,
[in] DWORD dwFlags,
[out] HCRYPTKEY *phKey
);
パラメーター
[in] hProv
CryptAcquireContext 関数で取得された CSP のハンドル。
[in] pbData
PUBLICKEYSTRUC BLOB ヘッダーの後に暗号化されたキーが続く BYTE 配列。 このキー BLOB は、このアプリケーションまたは別のコンピューターで実行されている可能性のある別のアプリケーションで 、CryptExportKey 関数によって作成されます。
[in] dwDataLen
キー BLOB の長さをバイト単位で格納します。
[in] hPubKey
pbData に格納されているキーを復号化する暗号化キーのハンドル。 このキーは、 hProv が参照するのと同じ CSP から取得する必要があります。 このパラメーターの意味は、CSP の種類とインポートするキー BLOB の種類によって異なります。
- キー BLOB がキー 交換キー ペア ( SIMPLEBLOB など) で暗号化されている場合、このパラメーターをキー交換キーのハンドルにすることができます。
- キー BLOB がセッション キー (暗号化された PRIVATEKEYBLOB など) で暗号化されている場合、このパラメーターにはこのセッション キーのハンドルが含まれます。
- キー BLOB が暗号化されていない場合 ( PUBLICKEYBLOB など)、このパラメーターは使用されず、0 である必要があります。
- キー BLOB が Schannel CSP のセッション キー (暗号化された OPAQUEKEYBLOB や他のベンダー固有の OPAQUEKEYBLOB など) で暗号化されている場合、このパラメーターは使用されず、ゼロに設定する必要があります。
[in] dwFlags
現在、PRIVATEKEYBLOB の形式の公開キーと秘密キーのペアが CSP にインポートされている場合にのみ使用されます。
このパラメーターには、次の値のいずれかを指定できます。
値 | 意味 |
---|---|
|
インポートされるキーは、最終的に再エクスポートされます。 このフラグを使用しない場合、キー ハンドルを使用して CryptExportKey を呼び出すと失敗します。 |
|
このフラグにより、 SIMPLEBLOBをインポートするときに、PKCS #1 バージョン 2 の書式設定が RSA 暗号化と暗号化解除でチェックされます。 |
|
40 ビット対称キーに対して no-salt 値が割り当てられます。 詳細については、「 Salt Value の機能」を参照してください。 |
|
このフラグが設定されている場合、CSP は、このキーを使用して特定のアクションが試行されたときに、ダイアログ ボックスまたはその他の方法を使用してユーザーに通知します。 正確な動作は、使用される CSP または CSP の種類によって指定されます。 プロバイダー コンテキストが CRYPT_SILENT 設定で取得された場合、このフラグを使用するとエラーが発生し、最後のエラーが NTE_SILENT_CONTEXT に設定されます。 |
|
16 バイトを超える RC2 キーのインポートを許可します。 このフラグが設定されていない場合、16 バイトを超える RC2 キーを使用して CryptImportKey 関数を呼び出すと失敗し、 GetLastError の呼び出しは NTE_BAD_DATAを返します。 |
[out] phKey
インポートされたキーのハンドルを受け取る HCRYPTKEY 値へのポインター。 キーの使用が完了したら、 CryptDestroyKey 関数を呼び出してハンドルを解放します。
戻り値
関数が成功した場合、関数は 0 以外の値を返します。
関数が失敗すると、0 が返されます。 拡張エラー情報については、 GetLastError を呼び出します。
"NTE" の前に表示されるエラー コードは、使用されている特定の CSP によって生成されます。 考えられるエラー コードの一部を次に示します。
リターン コード | 説明 |
---|---|
|
一部の CSP は、別のスレッドまたは プロセス がこのキーを使用している間に秘密キーがコンテナーにインポートされた場合に、このエラーを設定します。 |
|
パラメーターの 1 つは、無効なハンドルを指定します。 |
|
パラメーターの 1 つに無効な値が含まれています。 これはほとんどの場合、無効なポインターです。 |
|
インポートする 単純なキー BLOB は、想定される キー交換アルゴリズムでは暗号化されません。 |
|
インポートする公開キーで動作するアルゴリズムがこの CSP でサポートされていないか、公開キーの 1 つ以外で暗号化されたセッション キーをインポートしようとしました。 |
|
指定された dwFlags パラメーターが無効です。 |
|
キー BLOB の種類は、この CSP ではサポートされていないため、有効でない可能性があります。 |
|
hProv パラメーターに有効なコンテキスト ハンドルが含まれていません。 |
|
キー BLOB のバージョン番号が CSP のバージョンと一致しません。 これは通常、CSP をアップグレードする必要があることを示します。 |
注釈
ハッシュ ベースのメッセージ認証コード (HMAC) キーをインポートする場合、呼び出し元はインポートされたキーを PLAINTEXTKEYBLOB 型として識別し、PUBLICKEYSTRUC BLOB ヘッダーの aiKeyAlg フィールドに適切なアルゴリズム識別子を設定する必要があります。
CryptImportKey 関数を使用して、対称アルゴリズム用のプレーンテキスト キーをインポートできます。ただし、使いやすくするために、代わりに CryptGenKey 関数を使用することをお勧めします。 プレーンテキスト キーをインポートすると、 pbData パラメーターで渡されるキー BLOB の構造は PLAINTEXTKEYBLOB になります。
PLAINTEXTKEYBLOB 型は、使用中の CSP でサポートされている任意のアルゴリズムまたは種類のキーの組み合わせで使用できます。
プレーンテキスト キーのインポート例については、「 C プログラムの例: プレーンテキスト キーのインポート」を参照してください。
次の例は、ヘッダー フィールドを設定する方法を示しています。
keyBlob.header.bType = PLAINTEXTKEYBLOB;
keyBlob.header.bVersion = CUR_BLOB_VERSION;
keyBlob.header.reserved = 0;
// CALG_AES_128 is used as an example. You would set this to the
// algorithm id that corresponds to the one used by the key.
keyBlob.header.aiKeyAlg = CALG_AES_128;
キーの長さは keyBlob.keyLength で指定され、その後に実際のキー データが続きます。
次のキー サイズがサポートされています。
アルゴリズム | サポートされているキー サイズ |
---|---|
CALG_DES | 64 ビット |
CALG_3DES_112 | 128 ビット |
CALG_3DES | 192 ビット |
例
次の例は、キー BLOB からキーをインポートする方法を示しています。 この関数の完全な例については、「 サンプル C プログラム: ハッシュの署名」と「ハッシュ署名の検証」を参照してください。 この関数を使用するその他のコードについては、「 サンプル C プログラム: ファイルの復号化」を参照してください。
#include <windows.h>
#include <stdio.h>
#include <Wincrypt.h>
BOOL ImportKey(HCRYPTPROV hProv, LPBYTE pbKeyBlob, DWORD dwBlobLen)
{
HCRYPTKEY hPubKey;
//---------------------------------------------------------------
// This code assumes that a cryptographic provider (hProv)
// has been acquired and that a key BLOB (pbKeyBlob) that is
// dwBlobLen bytes long has been acquired.
//---------------------------------------------------------------
// Get the public key of the user who created the digital
// signature and import it into the CSP by using CryptImportKey.
// The key to be imported is in the buffer pbKeyBlob that is
// dwBlobLen bytes long. This function returns a handle to the
// public key in hPubKey.
if(CryptImportKey(
hProv,
pbKeyBlob,
dwBlobLen,
0,
0,
&hPubKey))
{
printf("The key has been imported.\n");
}
else
{
printf("Public key import failed.\n");
return FALSE;
}
//---------------------------------------------------------------
// Insert code that uses the imported public key here.
//---------------------------------------------------------------
//---------------------------------------------------------------
// When you have finished using the key, you must release it.
if(CryptDestroyKey(hPubKey))
{
printf("The public key has been released.");
}
else
{
printf("The public key has not been released.");
return FALSE;
}
return TRUE;
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
対象プラットフォーム | Windows |
ヘッダー | wincrypt.h |
Library | Advapi32.lib |
[DLL] | Advapi32.dll |
こちらもご覧ください
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示