Поделиться через


Функция CryptDuplicateKey (wincrypt.h)

Важно Этот API не рекомендуется использовать. Новое и существующее программное обеспечение должно начать использовать API-интерфейсы шифрования следующего поколения. Корпорация Майкрософт может удалить этот API в будущих выпусках.
 
Функция CryptDuplicateKey создает точную копию ключа и его состояние .

Синтаксис

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

Параметры

[in] hKey

Дескриптор ключа, который необходимо дублировать.

[in] pdwReserved

Зарезервировано для использования в будущем и должно иметь значение NULL.

[in] dwFlags

Зарезервировано для будущего использования и должно быть равно нулю.

[out] phKey

Адрес дескриптора повторяющегося ключа. Завершив использование ключа, отпустите дескриптор, вызвав функцию CryptDeographyKey .

Возвращаемое значение

Если функция выполнена успешно, возвращается ненулевое значение (TRUE).

Если функция завершается сбоем, возвращаемое значение равно нулю (FALSE). Чтобы получить дополнительные сведения об ошибке, вызовите Метод GetLastError.

Код ошибки, предваряемый "NTE", создается конкретным поставщиком служб CSP. Некоторые возможные коды ошибок перечислены в следующей таблице.

Код возврата Описание
ERROR_CALL_NOT_IMPLEMENTED
Так как это новая функция, существующие поставщики служб конфигурации могут не реализовать ее. Эта ошибка возвращается, если поставщик служб CSP не поддерживает эту функцию.
ERROR_INVALID_PARAMETER
Один из параметров содержит недопустимое значение. Чаще всего это недопустимый указатель.
NTE_BAD_KEY
Дескриптор исходного ключа недопустим.

Комментарии

CryptDuplicateKey создает копию ключа и точное его состояние . Один из сценариев, в котором можно использовать эту функцию, заключается в том, что приложению необходимо зашифровать два отдельных сообщения с одним и тем же ключом, но с разными значениями соли. Создается исходный ключ, а затем создается повторяющийся ключ с помощью функции CryptDuplicateKey . Затем различные значения соли задаются для исходных и повторяющихся ключей с помощью отдельных вызовов функции CryptSetKeyParam .

Для уничтожения всех ключей, созданных с помощью CryptDuplicateKey, необходимо вызвать CryptDegradkey. Уничтожение исходного ключа не приводит к уничтожению повторяющегося ключа. После того как дубликат ключа создан, он отделяется от исходного ключа. Между двумя ключами нет общего состояния.

Примеры

В следующем примере показано создание ключа сеанса, который является дубликатом существующего ключа сеанса. Пример, включающий полный контекст для этого примера, см. в разделе Пример программы 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
Header wincrypt.h
Библиотека Advapi32.lib
DLL Advapi32.dll

См. также раздел

CryptDecryptKey

CryptSetKeyParam

Функции создания ключей и обмена