Функция CryptCreateHash (wincrypt.h)
Синтаксис
BOOL CryptCreateHash(
[in] HCRYPTPROV hProv,
[in] ALG_ID Algid,
[in] HCRYPTKEY hKey,
[in] DWORD dwFlags,
[out] HCRYPTHASH *phHash
);
Параметры
[in] hProv
Дескриптор CSP, созданный вызовом CryptAcquireContext.
[in] Algid
Значение ALG_ID , определяющее используемый хэш-алгоритм.
Допустимые значения для этого параметра зависят от используемого CSP. Список алгоритмов по умолчанию см. в разделе Примечания.
[in] hKey
Если тип хэш-алгоритма является хэш-ключом, например хэш-код проверки подлинности сообщений на основе хэша (HMAC) или алгоритм кода проверки подлинности сообщений (MAC), ключ для хэша передается в этом параметре. Для алгоритмов, не являющихся ключами, этот параметр должен иметь нулевое значение.
Для алгоритмов с ключами ключ должен быть ключом блочного шифра , например RC2, который имеет режим шифрацепочки блоков шифра (CBC).
[in] dwFlags
Определено следующее значение флага.
Значение | Значение |
---|---|
|
Этот флаг не используется. |
[out] phHash
Адрес, на который функция копирует дескриптор в новый хэш-объект. Завершив использование хэш-объекта, отпустите дескриптор, вызвав функцию CryptDeographyHash .
Возвращаемое значение
Если функция выполняется успешно, функция возвращает значение TRUE.
Если функция завершается сбоем, она возвращает значение FALSE. Для получения дополнительных сведений об ошибке вызовите Метод GetLastError.
Коды ошибок, предваряемые NTE, создаются конкретным поставщиком служб CSP, который вы используете. В следующей таблице показаны некоторые возможные коды ошибок.
Код возврата | Описание |
---|---|
|
Один из параметров указывает недопустимый дескриптор. |
|
Один из параметров содержит недопустимое значение. Чаще всего это недопустимый указатель. |
|
Во время операции в операционной системе не хватает памяти. |
|
Параметр Algid указывает алгоритм, который не поддерживается этим поставщиком служб конфигурации. |
|
Параметр dwFlags не равен нулю. |
|
Хэш-алгоритм с ключом, например CALG_MAC, задается в Algid, а параметр hKey равен нулю или указывает недопустимый дескриптор ключа. Этот код ошибки также возвращается, если ключом является потоковый шифр или режим шифра, отличный от CBC. |
|
Во время операции у поставщика служб конфигурации не хватает памяти. |
Комментарии
Список поставщиков служб Майкрософт и алгоритмы, которые они реализуют, см. в разделе Поставщики служб шифрования Майкрософт.
Вычисление фактического хэша выполняется с помощью функций CryptHashData и CryptHashSessionKey . Для них требуется дескриптор хэш-объекта. После добавления всех данных в хэш-объект можно выполнить любую из следующих операций:
- Хэш-значение можно получить с помощью CryptGetHashParam.
- Ключ сеанса можно получить с помощью CryptDeriveKey.
- Хэш можно подписать с помощью CryptSignHash.
- Подпись можно проверить с помощью CryptVerifySignature.
Примеры
В следующем примере показано инициализация хэширования потока данных. Он создает и возвращает вызывающему приложению дескриптор хэш-объекта. Этот дескриптор используется в последующих вызовах CryptHashData и CryptHashSessionKey для хэширования любого потока данных. Пример, включающий полный контекст для этого примера, см. в разделе Пример программы C: создание и хэширование ключа сеанса. Еще один пример, в котором используется эта функция, см. в разделах Пример программы C. Подписывание хэша и Проверка хэш-подписи.
//--------------------------------------------------------------------
// Declare variables.
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
//--------------------------------------------------------------------
// Get a handle to a cryptography provider context.
if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
PROV_RSA_FULL,
0))
{
printf("CryptAcquireContext complete. \n");
}
else
{
printf("Acquisition of context failed.\n");
exit(1);
}
//--------------------------------------------------------------------
// Acquire a hash object handle.
if(CryptCreateHash(
hCryptProv,
CALG_MD5,
0,
0,
&hHash))
{
printf("An empty hash object has been created. \n");
}
else
{
printf("Error during CryptBeginHash!\n");
exit(1);
}
// Insert code that uses the hash object here.
//--------------------------------------------------------------------
// After processing, hCryptProv and hHash must be released.
if(hHash)
CryptDestroyHash(hHash);
if(hCryptProv)
CryptReleaseContext(hCryptProv,0);
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows XP [только классические приложения] |
Минимальная версия сервера | Windows Server 2003 [только классические приложения] |
Целевая платформа | Windows |
Header | wincrypt.h |
Библиотека | Advapi32.lib |
DLL | Advapi32.dll |