CryptImportKey 関数 (wincrypt.h)

大事な この API は非推奨です。 新規および既存のソフトウェアでは 、Cryptography Next Generation API の 使用を開始する必要があります。Microsoft は、今後のリリースでこの API を削除する可能性があります。
 
CryptImportKey 関数は、キー BLOB から暗号化サービス プロバイダー (CSP) に暗号化キーを転送します。 この関数を使用して、 Schannelセッション キー、通常のセッション キー、 公開キー、または 公開キーと秘密キーのペアをインポートできます。 公開キー以外のすべての場合、キーまたはキーのペアは暗号化されます。

構文

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 など) で暗号化されている場合、このパラメーターは使用されず、ゼロに設定する必要があります。
メモ 一部の CSP では、操作の結果としてこのパラメーターが変更される場合があります。 その後、他の目的でこのキーを使用するアプリケーションでは、 CryptDuplicateKey 関数を呼び出して、重複するキー ハンドルを作成する必要があります。 アプリケーションがハンドルの使用を完了したら、 CryptDestroyKey 関数を呼び出して解放します。
 

[in] dwFlags

現在、PRIVATEKEYBLOB の形式の公開キーと秘密キーのペアが CSP にインポートされている場合にのみ使用されます。

このパラメーターには、次の値のいずれかを指定できます。

意味
CRYPT_EXPORTABLE
インポートされるキーは、最終的に再エクスポートされます。 このフラグを使用しない場合、キー ハンドルを使用して CryptExportKey を呼び出すと失敗します。
CRYPT_OAEP
このフラグにより、 SIMPLEBLOBをインポートするときに、PKCS #1 バージョン 2 の書式設定が RSA 暗号化と暗号化解除でチェックされます。
CRYPT_NO_SALT
40 ビット対称キーに対して no-salt 値が割り当てられます。 詳細については、「 Salt Value の機能」を参照してください。
CRYPT_USER_PROTECTED
このフラグが設定されている場合、CSP は、このキーを使用して特定のアクションが試行されたときに、ダイアログ ボックスまたはその他の方法を使用してユーザーに通知します。 正確な動作は、使用される CSP または CSP の種類によって指定されます。 プロバイダー コンテキストが CRYPT_SILENT 設定で取得された場合、このフラグを使用するとエラーが発生し、最後のエラーが NTE_SILENT_CONTEXT に設定されます。
CRYPT_IPSEC_HMAC_KEY
16 バイトを超える RC2 キーのインポートを許可します。 このフラグが設定されていない場合、16 バイトを超える RC2 キーを使用して CryptImportKey 関数を呼び出すと失敗し、 GetLastError の呼び出しは NTE_BAD_DATAを返します。

[out] phKey

インポートされたキーのハンドルを受け取る HCRYPTKEY 値へのポインター。 キーの使用が完了したら、 CryptDestroyKey 関数を呼び出してハンドルを解放します。

戻り値

関数が成功した場合、関数は 0 以外の値を返します。

関数が失敗すると、0 が返されます。 拡張エラー情報については、 GetLastError を呼び出します。

"NTE" の前に表示されるエラー コードは、使用されている特定の CSP によって生成されます。 考えられるエラー コードの一部を次に示します。

リターン コード 説明
ERROR_BUSY
一部の CSP は、別のスレッドまたは プロセス がこのキーを使用している間に秘密キーがコンテナーにインポートされた場合に、このエラーを設定します。
ERROR_INVALID_HANDLE
パラメーターの 1 つは、無効なハンドルを指定します。
ERROR_INVALID_PARAMETER
パラメーターの 1 つに無効な値が含まれています。 これはほとんどの場合、無効なポインターです。
NTE_BAD_ALGID
インポートする 単純なキー BLOB は、想定される キー交換アルゴリズムでは暗号化されません。
NTE_BAD_DATA
インポートする公開キーで動作するアルゴリズムがこの CSP でサポートされていないか、公開キーの 1 つ以外で暗号化されたセッション キーをインポートしようとしました。
NTE_BAD_FLAGS
指定された dwFlags パラメーターが無効です。
NTE_BAD_TYPE
キー BLOB の種類は、この CSP ではサポートされていないため、有効でない可能性があります。
NTE_BAD_UID
hProv パラメーターに有効なコンテキスト ハンドルが含まれていません。
NTE_BAD_VER
キー 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 で指定され、その後に実際のキー データが続きます。

メモ HMAC アルゴリズムには独自のアルゴリズム識別子がありません。代わりに CALG_RC2 を使用してください。 CRYPT_IPSEC_HMAC_KEY では、16 バイトを超える RC2 キーをインポートできます。
 
PLAINTEXTKEYBLOB を使用する Data Encryption Standard (DES) キー順列の場合、パリティ ビットを含む完全なキー サイズのみをインポートできます。

次のキー サイズがサポートされています。

アルゴリズム サポートされているキー サイズ
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

こちらもご覧ください

CryptAcquireContext

CryptDestroyKey

CryptExportKey

キー生成と Exchange 関数