Функция CryptDuplicateKey (wincrypt.h)
Синтаксис
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. Некоторые возможные коды ошибок перечислены в следующей таблице.
Код возврата | Описание |
---|---|
|
Так как это новая функция, существующие поставщики служб конфигурации могут не реализовать ее. Эта ошибка возвращается, если поставщик служб CSP не поддерживает эту функцию. |
|
Один из параметров содержит недопустимое значение. Чаще всего это недопустимый указатель. |
|
Дескриптор исходного ключа недопустим. |
Комментарии
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 |