Função CryptDecrypt (wincrypt.h)

Importante Essa API foi preterida. O software novo e existente deve começar a usar APIs de Próxima Geração de Criptografia. A Microsoft pode remover essa API em versões futuras.
 
A função CryptDecrypt descriptografa dados criptografados anteriormente usando a função CryptEncrypt .

Foram feitas alterações importantes para dar suporte à interoperabilidade de email S/MIME ( Extensões de Email da Internet) Segura/Multiuso para CriptoAPI que afetam o tratamento de mensagens envelveladas. Para obter mais informações, consulte a seção Comentários de CryptMsgOpenToEncode.

Sintaxe

BOOL CryptDecrypt(
  [in]      HCRYPTKEY  hKey,
  [in]      HCRYPTHASH hHash,
  [in]      BOOL       Final,
  [in]      DWORD      dwFlags,
  [in, out] BYTE       *pbData,
  [in, out] DWORD      *pdwDataLen
);

Parâmetros

[in] hKey

Um identificador para a chave a ser usada para a descriptografia. Um aplicativo obtém esse identificador usando a função CryptGenKey ou CryptImportKey .

Essa chave especifica o algoritmo de descriptografia a ser usado.

[in] hHash

Um identificador para um objeto hash. Se os dados forem descriptografados e hash simultaneamente, um identificador para um objeto hash será passado nesse parâmetro. O valor de hash é atualizado com o texto não criptografado descriptografado. Essa opção é útil ao descriptografar e verificar simultaneamente uma assinatura.

Antes de chamar CryptDecrypt, o aplicativo deve obter um identificador para o objeto hash chamando a função CryptCreateHash . Após a conclusão da descriptografia, o valor de hash pode ser obtido usando a função CryptGetHashParam , ele também pode ser assinado usando a função CryptSignHash ou pode ser usado para verificar uma assinatura digital usando a função CryptVerifySignature .

Se nenhum hash for feito, esse parâmetro deverá ser zero.

[in] Final

Um valor booliano que especifica se esta é a última seção de uma série que está sendo descriptografada. Esse valor será TRUE se este for o último ou único bloco. Se esse não for o último bloco, esse valor será FALSE. Para obter mais informações, consulte Comentários.

[in] dwFlags

Os valores de sinalizador a seguir são definidos.

Valor Significado
CRYPT_OAEP
0x00000040
Use o OAEP (Preenchimento de Criptografia Assimétrica Ideal) (PKCS nº 1 versão 2). Esse sinalizador só tem suporte do Provedor criptográfico avançado da Microsoft com criptografia/descriptografia RSA. Esse sinalizador não pode ser combinado com o sinalizador CRYPT_DECRYPT_RSA_NO_PADDING_CHECK .
CRYPT_DECRYPT_RSA_NO_PADDING_CHECK
0x00000020
Execute a descriptografia no BLOB sem verificar o preenchimento. Esse sinalizador só tem suporte do Provedor criptográfico avançado da Microsoft com criptografia/descriptografia RSA. Esse sinalizador não pode ser combinado com o sinalizador CRYPT_OAEP .

[in, out] pbData

Um ponteiro para um buffer que contém os dados a serem descriptografados. Depois que a descriptografia for executada, o texto não criptografado será colocado novamente nesse mesmo buffer.

O número de bytes criptografados nesse buffer é especificado por pdwDataLen.

[in, out] pdwDataLen

Um ponteiro para um valor DWORD que indica o comprimento do buffer pbData . Antes de chamar essa função, o aplicativo de chamada define o valor DWORD como o número de bytes a serem descriptografados. Após o retorno, o valor DWORD contém o número de bytes do texto não criptografado descriptografado.

Quando uma codificação de bloco é usada, esse comprimento de dados deve ser um múltiplo do tamanho do bloco, a menos que esta seja a seção final dos dados a serem descriptografados e o parâmetro Final seja TRUE.

Valor retornado

Se a função for bem-sucedida, a função retornará diferente de zero (TRUE).

Se a função falhar, ela retornará zero (FALSE). Para obter informações de erro estendidas, chame GetLastError.

Os códigos de erro precedidos pelo NTE são gerados pelo CSP específico que está sendo usado. Alguns códigos de erro possíveis seguem.

Valor Descrição
ERROR_INVALID_HANDLE
Um dos parâmetros especifica um identificador que não é válido.
ERROR_INVALID_PARAMETER
Um dos parâmetros contém um valor que não é válido. Geralmente, esse é um ponteiro que não é válido.
NTE_BAD_ALGID
A chave de sessãohKey especifica um algoritmo ao qual esse CSP não dá suporte.
NTE_BAD_DATA
Os dados a serem descriptografados não são válidos. Por exemplo, quando uma codificação de bloco é usada e o sinalizador Final é FALSE, o valor especificado por pdwDataLen deve ser um múltiplo do tamanho do bloco. Esse erro também pode ser retornado quando o preenchimento não é válido.
NTE_BAD_FLAGS
O parâmetro dwFlags é diferente de zero.
NTE_BAD_HASH
O parâmetro hHash contém um identificador que não é válido.
NTE_BAD_KEY
O parâmetro hKey não contém um identificador válido para uma chave.
NTE_BAD_LEN
O tamanho do buffer de saída é muito pequeno para conter o texto não criptografado gerado.
NTE_BAD_UID
O contexto CSP especificado quando a chave foi criada não pode ser encontrado.
NTE_DOUBLE_ENCRYPT
O aplicativo tentou descriptografar os mesmos dados duas vezes.
NTE_FAIL
A função falhou de alguma forma inesperada.

Comentários

Se uma grande quantidade de dados deve ser descriptografada, isso pode ser feito em seções chamando CryptDecrypt repetidamente. O parâmetro Final deve ser definido como TRUE somente na última chamada para CryptDecrypt, para que o mecanismo de descriptografia possa concluir corretamente o processo de descriptografia. As seguintes ações extras são executadas quando Final é TRUE:

  • Se a chave for uma chave de criptografia de bloco, os dados serão preenchidos em um múltiplo do tamanho do bloco da criptografia. Para localizar o tamanho do bloco de uma criptografia, use CryptGetKeyParam para obter o valor KP_BLOCKLEN da chave.
  • Se a criptografia estiver operando em um modo de encadeamento, a próxima operação CryptDecrypt redefinirá o registro de comentários da criptografia para o valor KP_IV da chave.
  • Se a codificação for uma codificação de fluxo, a próxima chamada CryptDecrypt redefinirá a criptografia para seu estado inicial.

Não é possível definir o registro de comentários da codificação como o valor KP_IV da chave sem definir o parâmetro Final como TRUE. Se isso for necessário, como no caso em que você não deseja adicionar um bloco de preenchimento adicional ou alterar o tamanho de cada bloco, você pode simular isso criando uma duplicata da chave original usando a função CryptDuplicateKey e passando a chave duplicada para a função CryptDecrypt . Isso faz com que o KP_IV da chave original seja colocado na chave duplicada. Depois de criar ou importar a chave original, você não pode usar a chave original para criptografia porque o registro de comentários da chave será alterado. O pseudocódigo a seguir mostra como isso pode ser feito.

// 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)
}

O Provedor criptográfico avançado da Microsoft dá suporte à criptografia direta com chaves públicasRSA e descriptografia com chaves privadas RSA. A criptografia usa o preenchimento PKCS nº 1. Na descriptografia, esse preenchimento é verificado. O comprimento dos dados de texto cifrado a serem descriptografados deve ter o mesmo comprimento que o módulo da chave RSA usada para descriptografar os dados. Se o texto cifrado tiver zeros nos bytes mais significativos, esses bytes deverão ser incluídos no buffer de dados de entrada e no comprimento do buffer de entrada. O texto cifrado deve estar no formato little-endian .

Exemplos

Para obter um exemplo que usa essa função, consulte Exemplo de programa C: descriptografando um arquivo.

Requisitos

   
Cliente mínimo com suporte Windows XP [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2003 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho wincrypt.h
Biblioteca Advapi32.lib
DLL Advapi32.dll

Confira também

Cryptcreatehash

Cryptencrypt

Cryptgenkey

Cryptgethashparam

Cryptgetkeyparam

Cryptimportkey

Cryptmsgopentoencode

Cryptsignhash

CryptVerifySignature

Funções de criptografia/descriptografia de dados