次の方法で共有


CryptDuplicateKey 関数 (wincrypt.h)

大事な この API は非推奨です。 新規および既存のソフトウェアでは 、暗号化次世代 API の 使用を開始する必要があります。Microsoft は、今後のリリースでこの API を削除する可能性があります。
 
CryptDuplicateKey 関数は、キーの正確なコピーとキーの状態を作成します。

構文

BOOL CryptDuplicateKey(
  [in]  HCRYPTKEY hKey,
  [in]  DWORD     *pdwReserved,
  [in]  DWORD     dwFlags,
  [out] HCRYPTKEY *phKey
);

パラメーター

[in] hKey

複製するキーへのハンドル。

[in] pdwReserved

将来使用するために予約されており、 NULL である必要があります。

[in] dwFlags

将来使用するために予約されており、0 である必要があります。

[out] phKey

重複したキーへのハンドルのアドレス。 キーの使用が完了したら、 CryptDestroyKey 関数を呼び出してハンドルを解放します。

戻り値

関数が成功した場合、戻り値は 0 以外 (TRUE) になります。

関数が失敗した場合、戻り値は 0 (FALSE) になります。 拡張エラー情報については、 GetLastError を呼び出します。

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

リターン コード 説明
ERROR_CALL_NOT_IMPLEMENTED
これは新しい関数であるため、既存の CSP では実装されない可能性があります。 このエラーは、CSP がこの関数をサポートしていない場合に返されます。
ERROR_INVALID_PARAMETER
パラメーターの 1 つに無効な値が含まれています。 これは、ほとんどの場合、無効なポインターです。
NTE_BAD_KEY
元のキーへのハンドルが無効です。

注釈

CryptDuplicateKey は 、キーのコピーとキーの正確な 状態 を作成します。 この関数を使用できるシナリオの 1 つは、アプリケーションが同じキーを持ち 、塩の値が異なる 2 つの個別のメッセージを暗号化する必要がある場合です。 元のキーが生成され、 CryptDuplicateKey 関数を使用して重複するキーが作成されます。 その後、 CryptSetKeyParam 関数を個別に呼び出して、元のキーと重複するキーに対して異なる salt 値が設定されます。

CryptDuplicateKey を 使用して作成されたすべてのキーを破棄するには、 CryptDestroyKey を呼び出す必要があります。 元のキーを破棄しても、重複するキーは破棄されません。 重複するキーが作成されると、元のキーとは別のキーになります。 2 つのキー間に共有状態はありません。

次の例は、既存のセッション キーの複製であるセッション キーの作成を示しています。 この例の完全なコンテキストを含む例については、「 サンプル C プログラム: セッション キーの複製」を参照してください。

//--------------------------------------------------------------------
// Declare and initialize variables.

HCRYPTKEY    hDuplicateKey;

// Duplicate the key. hOriginalKey is a previously 
// assigned HCRYPTKEY variable.

if (CryptDuplicateKey(
     hOriginalKey, 
     NULL, 
     0, 
     &hDuplicateKey))
{
   printf("The session key has been duplicated. \n");
}
else
{
   printf("Error using CryptDuplicateKey.\n");
   exit(1);
}

// Insert code that uses the duplicate key here.

// When you have finished using the key, the handle must be released.

if (CryptDestroyKey(hDuplicateKey))
{
  printf("The handle has been released.\n");
}
else
{
  printf("The handle could not be released.\n");
}

要件

要件
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
対象プラットフォーム Windows
ヘッダー wincrypt.h
Library Advapi32.lib
[DLL] Advapi32.dll

こちらもご覧ください

CryptDestroyKey

CryptSetKeyParam

キー生成と Exchange 関数