Функция CryptDecrypt (wincrypt.h)
Важные изменения в поддержке Secure/Multipurpose Internet Mail Extensions (S/MIME) для взаимодействия с электронной почтой были сделаны в CryptoAPI, которые влияют на обработку конвертированных сообщений. Дополнительные сведения см. в разделе "Примечания" CryptMsgOpenToEncode.
Синтаксис
BOOL CryptDecrypt(
[in] HCRYPTKEY hKey,
[in] HCRYPTHASH hHash,
[in] BOOL Final,
[in] DWORD dwFlags,
[in, out] BYTE *pbData,
[in, out] DWORD *pdwDataLen
);
Параметры
[in] hKey
Дескриптор ключа, используемый для расшифровки. Приложение получает этот дескриптор с помощью функции
Этот ключ задает используемый алгоритм расшифровки.
[in] hHash
Дескриптор хэш-объекта . Если данные должны быть расшифрованы и хэшированы одновременно, дескриптор в хэш-объект передается в этом параметре. Хэш-значение обновляется с помощью расшифрованных открытого текста. Этот параметр полезен при одновременном расшифровке и проверке подписи.
Перед вызовом CryptDecryptприложение должно получить дескриптор хэш-объекта, вызвав функцию CryptCreateHash. После завершения расшифровки хэш-значение можно получить с помощью функции CryptGetHashParam, ее также можно подписать с помощью функции CryptSignHash или использовать для проверки цифровой подписи с помощью функции CryptVerifySignature.
Если хэш не выполняется, этот параметр должен быть равен нулю.
[in] Final
Логическое значение, указывающее, является ли это последним разделом в расшифровке серии. Это значение TRUE, если это последний или единственный блок. Если это не последний блок, это значение FALSE. Дополнительные сведения см. в разделе "Примечания".
[in] dwFlags
Определены следующие значения флагов.
Ценность | Значение |
---|---|
|
Используйте оптимальную асимметричную заполнения шифрования (OAEP) (PKCS #1 версии 2). Этот флаг поддерживается только расширенным поставщиком шифрования Майкрософт с шифрованием ИЛИ расшифровкой RSA. Этот флаг нельзя объединить с флагом CRYPT_DECRYPT_RSA_NO_PADDING_CHECK. |
|
Расшифровка BLOB без проверки заполнения. Этот флаг поддерживается только расширенным поставщиком шифрования Майкрософт с шифрованием ИЛИ расшифровкой RSA. Этот флаг нельзя объединить с флагом CRYPT_OAEP. |
[in, out] pbData
Указатель на буфер, содержащий данные для расшифровки. После выполнения расшифровки открытый текст помещается обратно в этот же буфер.
Число зашифрованных байтов в этом буфере указывается pdwDataLen.
[in, out] pdwDataLen
Указатель на значение
Если используется блочного шифра
Возвращаемое значение
Если функция выполнена успешно, функция возвращает ненулевое значение (TRUE).
Если функция завершается ошибкой, она возвращает ноль (FALSE). Для получения расширенных сведений об ошибке вызовите GetLastError.
Коды ошибок, предуставленные NTE, создаются конкретным используемым поставщиком служб CSP. Ниже приведены некоторые возможные коды ошибок.
Замечания
Если требуется расшифровать большой объем данных, его можно сделать в разделах, вызвав CryptDecrypt. Параметр Final должен иметь значение TRUE только при последнем вызове CryptDecrypt, чтобы модуль расшифровки смог правильно завершить процесс расшифровки. Следующие дополнительные действия выполняются при окончательныхTRUE:
- Если ключ является ключом блочного шифра, данные заполняются на несколько размеров блока шифра. Чтобы найти размер блока шифра, используйте CryptGetKeyParam, чтобы получить значение KP_BLOCKLEN ключа.
- Если шифр работает в режиме цепочки , следующая операция CryptDecrypt сбрасывает регистр обратной связи шифра в значение KP_IV ключа.
- Если шифр являетсяшифром потока
, следующий вызов CryptDecrypt сбрасывает шифр на исходноесостояния .
Невозможно задать регистр обратной связи шифра в значение KP_IV ключа, не задав параметру Final значение TRUE. Если это необходимо, как и в случае, если вы не хотите добавить дополнительный блок заполнения или изменить размер каждого блока, можно имитировать его, создав дубликат исходного ключа с помощью функции CryptDuplicateKey и передачи дубликата ключа в функцию CryptDecrypt. Это приводит к тому, что KP_IV исходного ключа помещаются в повторяющийся ключ. После создания или импорта исходного ключа не удается использовать исходный ключ для шифрования, так как регистр обратной связи ключа будет изменен. В следующем псевдокоде показано, как это можно сделать.
// Set the IV for the original key. Do not use the original key for
// encryption or decryption after doing this because the key's
// feedback register will get modified and you cannot change it.
CryptSetKeyParam(hOriginalKey, KP_IV, newIV)
while(block = NextBlock())
{
// Create a duplicate of the original key. This causes the
// original key's IV to be copied into the duplicate key's
// feedback register.
hDuplicateKey = CryptDuplicateKey(hOriginalKey)
// Decrypt the block with the duplicate key.
CryptDecrypt(hDuplicateKey, block)
// Destroy the duplicate key. Its feedback register has been
// modified by the CryptEncrypt function, so it cannot be used
// again. It will be re-duplicated in the next iteration of the
// loop.
CryptDestroyKey(hDuplicateKey)
}
расширенного поставщика шифрования Майкрософт поддерживает прямое шифрование с помощью RSAоткрытых ключей и расшифровки с помощью закрытых ключей RSA . Шифрование использует PKCS #1 заполнение. При расшифровке этот заполнение проверяется. Длина расшифровки шифров данных должна быть той же длиной, что и модуль ключа RSA, используемого для расшифровки данных. Если зашифрованный текст имеет нули в наиболее значимых байтах, эти байты должны быть включены в буфер входных данных и в длину входного буфера. Шифр должен быть в формате маленький.
Примеры
Пример использования этой функции см. в разделе Пример программы C: расшифровка файла.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows XP [только классические приложения] |
минимальный поддерживаемый сервер | Windows Server 2003 [только классические приложения] |
целевая платформа | Виндоус |
заголовка | wincrypt.h |
библиотеки |
Advapi32.lib |
DLL | Advapi32.dll |