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

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

В 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

Определены следующие значения флагов.

Значение Значение
CRYPT_OAEP
0x00000040
Используйте оптимальное заполнение асимметричного шифрования (OAEP) (PKCS 1 версии 2). Этот флаг поддерживается только поставщиком расширенного шифрования Майкрософт с шифрованием и расшифровкой RSA. Этот флаг нельзя объединить с флагом CRYPT_DECRYPT_RSA_NO_PADDING_CHECK .
CRYPT_DECRYPT_RSA_NO_PADDING_CHECK
0x00000020
Выполните расшифровку большого двоичного объекта , не проверяя заполнение. Этот флаг поддерживается только поставщиком расширенного шифрования Майкрософт с шифрованием и расшифровкой RSA. Этот флаг нельзя объединить с флагом CRYPT_OAEP .

[in, out] pbData

Указатель на буфер, содержащий данные для расшифровки. После выполнения расшифровки открытый текст помещается обратно в этот же буфер.

Число зашифрованных байтов в этом буфере задается с помощью pdwDataLen.

[in, out] pdwDataLen

Указатель на значение DWORD , указывающее длину буфера pbData . Перед вызовом этой функции вызывающее приложение задает значение DWORD в число байтов для расшифровки. При возврате значение DWORD содержит количество байтов расшифрованного открытого текста.

При использовании блочного шифра длина данных должна быть кратна размеру блока, если только это не последний раздел данных для расшифровки и параметр Final имеет значение TRUE.

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

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

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

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

Значение Описание
ERROR_INVALID_HANDLE
Один из параметров указывает недопустимый дескриптор.
ERROR_INVALID_PARAMETER
Один из параметров содержит недопустимое значение. Чаще всего это недопустимый указатель.
NTE_BAD_ALGID
Ключ сеансаhKey указывает алгоритм, который не поддерживается этим поставщиком служб CSP.
NTE_BAD_DATA
Данные для расшифровки недопустимы. Например, если используется блочный шифр и флаг Final имеет значение FALSE, значение, указанное в pdwDataLen , должно быть кратно размеру блока. Эта ошибка также может быть возвращена, если заполнение будет признано недопустимым.
NTE_BAD_FLAGS
Параметр dwFlags не является нулевым.
NTE_BAD_HASH
Параметр hHash содержит недопустимый дескриптор.
NTE_BAD_KEY
Параметр hKey не содержит допустимый дескриптор ключа.
NTE_BAD_LEN
Размер выходного буфера слишком мал для хранения созданного открытого текста.
NTE_BAD_UID
Не удается найти контекст CSP, указанный при создании ключа.
NTE_DOUBLE_ENCRYPT
Приложение дважды попыталось расшифровать одни и те же данные.
NTE_FAIL
Сбой функции каким-то неожиданным образом.

Комментарии

Если требуется расшифровать большой объем данных, это можно сделать в разделах, многократно вызывая 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

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

CryptCreateHash

CryptEncrypt

CryptGenKey

CryptGetHashParam

CryptGetKeyParam

CryptImportKey

CryptMsgOpenToEncode

CryptSignHash

CryptVerifySignature

Функции шифрования и расшифровки данных