Функция CryptDecrypt (wincrypt.h)
В CryptoAPI были внесены важные изменения для поддержки взаимодействия с электронной почтой S /MIME, влияющие на обработку сообщений в конвертах. Дополнительные сведения см. в разделе Примечания статьи 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
Дескриптор ключа, используемого для расшифровки. Приложение получает этот дескриптор с помощью функции CryptGenKey или CryptImportKey .
Этот ключ задает используемый алгоритм расшифровки.
[in] hHash
Дескриптор хэш-объекта. Если данные необходимо расшифровать и хэшировать одновременно, дескриптор хэш-объекту передается в этом параметре. Хэш-значение обновляется расшифрованным открытым текстом. Этот параметр полезен при одновременной расшифровке и проверке подписи.
Перед вызовом CryptDecrypt приложение должно получить дескриптор хэш-объекта путем вызова функции CryptCreateHash . После завершения расшифровки хэш-значение можно получить с помощью функции CryptGetHashParam , его также можно подписать с помощью функции CryptSignHash или использовать для проверки цифровой подписи с помощью функции CryptVerifySignature .
Если хэш не выполняется, этот параметр должен быть равен нулю.
[in] Final
Логическое значение, указывающее, является ли этот раздел расшифровываемой последней частью ряда. Это значение равно TRUE , если это последний или единственный блок. Если это не последний блок, это значение равно FALSE. Дополнительные сведения см. в подразделе "Примечания".
[in] dwFlags
Определены следующие значения флагов.
Значение | Значение |
---|---|
|
Используйте оптимальное заполнение асимметричного шифрования (OAEP) (PKCS 1 версии 2). Этот флаг поддерживается только поставщиком расширенного шифрования Майкрософт с шифрованием и расшифровкой RSA. Этот флаг нельзя объединить с флагом CRYPT_DECRYPT_RSA_NO_PADDING_CHECK . |
|
Выполните расшифровку большого двоичного объекта , не проверяя заполнение. Этот флаг поддерживается только поставщиком расширенного шифрования Майкрософт с шифрованием и расшифровкой RSA. Этот флаг нельзя объединить с флагом CRYPT_OAEP . |
[in, out] pbData
Указатель на буфер, содержащий данные для расшифровки. После выполнения расшифровки открытый текст помещается обратно в этот же буфер.
Число зашифрованных байтов в этом буфере задается с помощью pdwDataLen.
[in, out] pdwDataLen
Указатель на значение DWORD , указывающее длину буфера pbData . Перед вызовом этой функции вызывающее приложение задает значение DWORD в число байтов для расшифровки. При возврате значение DWORD содержит количество байтов расшифрованного открытого текста.
При использовании блочного шифра длина данных должна быть кратна размеру блока, если только это не последний раздел данных для расшифровки и параметр Final имеет значение TRUE.
Возвращаемое значение
Если функция выполняется успешно, функция возвращает ненулевое значение (TRUE).
Если функция завершается сбоем, она возвращает ноль (FALSE). Чтобы получить дополнительные сведения об ошибке, вызовите Метод GetLastError.
Коды ошибок, предваряемые NTE, создаются конкретным поставщиком служб CSP. Ниже приведены некоторые возможные коды ошибок.
Значение | Описание |
---|---|
|
Один из параметров указывает недопустимый дескриптор. |
|
Один из параметров содержит недопустимое значение. Чаще всего это недопустимый указатель. |
|
Ключ сеансаhKey указывает алгоритм, который не поддерживается этим поставщиком служб CSP. |
|
Данные для расшифровки недопустимы. Например, если используется блочный шифр и флаг Final имеет значение FALSE, значение, указанное в pdwDataLen , должно быть кратно размеру блока. Эта ошибка также может быть возвращена, если заполнение будет признано недопустимым. |
|
Параметр dwFlags не является нулевым. |
|
Параметр hHash содержит недопустимый дескриптор. |
|
Параметр hKey не содержит допустимый дескриптор ключа. |
|
Размер выходного буфера слишком мал для хранения созданного открытого текста. |
|
Не удается найти контекст CSP, указанный при создании ключа. |
|
Приложение дважды попыталось расшифровать одни и те же данные. |
|
Сбой функции каким-то неожиданным образом. |
Комментарии
Если требуется расшифровать большой объем данных, это можно сделать в разделах, многократно вызывая CryptDecrypt . Параметр Final должен иметь значение TRUE только при последнем вызове CryptDecrypt, чтобы обработчик расшифровки смог правильно завершить процесс расшифровки. Если значение Final имеет значение 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)
}
Microsoft Enhanced Cryptographic Provider поддерживает прямое шифрование с помощью открытых ключейRSA и расшифровку с помощью закрытых ключей RSA. Шифрование использует заполнение PKCS #1. При расшифровке это заполнение проверяется. Длина расшифровки зашифрованных данных должна совпадать с длиной модуля ключа RSA, используемого для расшифровки данных. Если зашифрованный текст содержит нули в наиболее значительных байтах, эти байты должны быть включены во входной буфер данных и в длину входного буфера. Зашифрованный текст должен быть в формате с минимальным эндианом .
Примеры
Пример использования этой функции см. в разделе Пример программы C: расшифровка файла.
Требования
Минимальная версия клиента | Windows XP [только классические приложения] |
Минимальная версия сервера | Windows Server 2003 [только классические приложения] |
Целевая платформа | Windows |
Header | wincrypt.h |
Библиотека | Advapi32.lib |
DLL | Advapi32.dll |
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по