Compartilhar via


Função DecryptMessage (Geral)

A função DecryptMessage (Geral) descriptografa uma mensagem. Alguns pacotes não criptografam e descriptografam mensagens, mas sim executam e verificam um hash de integridade.

O SSP ( provedor de suporte de segurança ) digest fornece confidencialidade de criptografia e descriptografia para mensagens trocadas entre cliente e servidor apenas como um mecanismo SASL.

Essa função também é usada com o SSP do Schannel para sinalizar uma solicitação de um remetente de mensagem para uma renegociação (refazer) dos atributos de conexão ou para um desligamento da conexão.

Observação

EncryptMessage (Geral) e DecryptMessage (Geral) podem ser chamados ao mesmo tempo de dois threads diferentes em um único contexto de SSPI ( interface do provedor de suporte de segurança ) se um thread estiver criptografando e o outro estiver descriptografando. Se mais de um thread estiver sendo criptografado ou mais de um thread estiver descriptografando, cada thread deverá obter um contexto exclusivo.

 

Para obter informações sobre como usar essa função com um SSP específico, consulte os tópicos a seguir.

Tópico Descrição
DecryptMessage (Resumo) Descriptografa uma mensagem usando o Digest.
DecryptMessage (Kerberos) Descriptografa uma mensagem usando Kerberos.
DecryptMessage (Negociar) Descriptografa uma mensagem usando Negotiate.
DecryptMessage (NTLM) Descriptografa uma mensagem usando NTLM.
DecryptMessage (Schannel) Descriptografa uma mensagem usando o Schannel.

 

Sintaxe

SECURITY_STATUS SEC_Entry DecryptMessage(
  _In_    PCtxtHandle    phContext,
  _Inout_ PSecBufferDesc pMessage,
  _In_    ULONG          MessageSeqNo,
  _Out_   PULONG         pfQOP
);

Parâmetros

phContext [em]

Um identificador para o contexto de segurança a ser usado para descriptografar a mensagem.

pMessage [entrada, saída]

Um ponteiro para uma estrutura SecBufferDesc . Na entrada, a estrutura faz referência a uma ou mais estruturas do SecBuffer . Uma delas pode ser do tipo SECBUFFER_DATA. Esse buffer contém a mensagem criptografada. A mensagem criptografada é descriptografada no local, substituindo o conteúdo original de seu buffer.

Ao usar o SSP do Digest, na entrada, a estrutura faz referência a uma ou mais estruturas do SecBuffer . Um deles deve ser do tipo SECBUFFER_DATA ou SECBUFFER_STREAM e deve conter a mensagem criptografada.

Ao usar o SSP do Schannel com contextos que não são orientados à conexão, na entrada, a estrutura deve conter quatro estruturas do SecBuffer . Exatamente um buffer deve ser do tipo SECBUFFER_DATA e conter uma mensagem criptografada, que é descriptografada no local. Os buffers restantes são usados para saída e devem ser do tipo SECBUFFER_EMPTY. Para contextos orientados à conexão, um buffer de tipo SECBUFFER_DATA deve ser fornecido, conforme observado para contextos não orientados à conexão. Além disso, um segundo buffer de tipo SECBUFFER_TOKEN que contém um token de segurança também deve ser fornecido.

MessageSeqNo [em]

O número de sequência esperado pelo aplicativo de transporte, se houver. Se o aplicativo de transporte não mantiver números de sequência, esse parâmetro deverá ser definido como zero.

Ao usar o SSP do Digest, esse parâmetro deve ser definido como zero. O SSP do Digest gerencia a numeração de sequência internamente.

Ao usar o SSP do Schannel, esse parâmetro deve ser definido como zero. O SSP do Schannel não usa números de sequência.

pfQOP [fora]

Um ponteiro para uma variável do tipo ULONG que recebe sinalizadores específicos do pacote que indicam a qualidade da proteção.

Ao usar o SSP do Schannel, esse parâmetro não é usado e deve ser definido como NULL.

Esse parâmetro pode ser um dos sinalizadores a seguir.

Valor Significado
SECQOP_WRAP_NO_ENCRYPT
A mensagem não foi criptografada, mas um cabeçalho ou trailer foi produzido.
Nota: KERB_WRAP_NO_ENCRYPT tem o mesmo valor e o mesmo significado.
SIGN_ONLY
Ao usar o SSP do Digest, use esse sinalizador quando o contexto de segurança estiver definido para verificar apenas a assinatura . Para obter mais informações, consulte Qualidade da Proteção.

 

Valor de retorno

Se a função verificar se a mensagem foi recebida na sequência correta, a função retornará SEC_E_OK.

Se a função não conseguir descriptografar a mensagem, ela retornará um dos seguintes códigos de erro.

Código de retorno Descrição
SEC_E_BUFFER_TOO_SMALL
O buffer de mensagem é muito pequeno. Usado com o SSP do Digest.
SEC_E_CRYPTO_SYSTEM_INVALID
Não há suporte para a criptografia escolhida para o contexto de segurança . Usado com o SSP do Digest.
SEC_E_INCOMPLETE_MESSAGE
Os dados no buffer de entrada estão incompletos. O aplicativo precisa ler mais dados do servidor e chamar DecryptMessage (Geral) novamente.
SEC_E_INVALID_HANDLE
Um identificador de contexto que não é válido foi especificado no parâmetro phContext . Usado com os SSPs Digest e Schannel.
SEC_E_INVALID_TOKEN
Os buffers são do tipo errado ou nenhum buffer do tipo SECBUFFER_DATA foi encontrado. Usado com o SSP do Schannel.
SEC_E_MESSAGE_ALTERED
A mensagem foi alterada. Usado com os SSPs Digest e Schannel.
SEC_E_OUT_OF_SEQUENCE
A mensagem não foi recebida na sequência correta.
SEC_E_QOP_NOT_SUPPORTED
Não há suporte para confidencialidade nem integridade no contexto de segurança. Usado com o SSP do Digest.
SEC_I_CONTEXT_EXPIRED
O remetente da mensagem terminou de usar a conexão e iniciou um desligamento. Para obter informações sobre como iniciar ou reconhecer um desligamento, consulte desligar umde Conexão Schannel. Usado com o SSP do Schannel.
SEC_I_RENEGOTIATE
A parte remota requer uma nova sequência de handshake ou o aplicativo acabou de iniciar um desligamento. Retorne ao loop de negociação e chame AcceptSecurityContext (Geral) ou InitializeSecurityContext (Geral) passando buffers de entrada vazios.
Se a função retornar um buffer do tipo SEC_BUFFER_EXTRA, isso deverá ser passado para a função AcceptSecurityContext (Geral) como um buffer de entrada.
Usado com o SSP do Schannel.
Não há suporte para renegociação para o modo kernel Schannel. O chamador deve ignorar esse valor retornado ou desligar a conexão. Se o valor for ignorado, o cliente ou o servidor poderão desligar a conexão como resultado.

 

Observações

Quando você usa o SSP do Schannel, a função DecryptMessage (Geral) retorna SEC_I_CONTEXT_EXPIRED quando o remetente da mensagem desligar a conexão. Para obter informações sobre como iniciar ou reconhecer um desligamento, consulte desligar umde Conexão Schannel.

Quando você usa o SSP do Schannel, DecryptMessage (Geral) retorna SEC_I_RENEGOTIATE quando o remetente da mensagem deseja renegociar a conexão (contexto de segurança). Um aplicativo lida com uma renegociação solicitada chamando AcceptSecurityContext (Geral) ( lado do servidor) ou InitializeSecurityContext (Geral) (lado do cliente) e passando buffers de entrada vazios. Depois que essa chamada inicial retornar um valor, prossiga como se seu aplicativo estivesse criando uma nova conexão. Para obter mais informações, consulte [Criando um contexto de segurança do Schannel](creating-an-schannel-security-context.md).

Para obter informações sobre como interoperar com GSSAPI, consulte Interoperabilidade de SSPI/Kerberos com GSSAPI.

Requisitos

Requisito Valor
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]
Cabeçalho
Sspi.h (inclui Security.h)
Biblioteca
Secur32.lib
DLL
Secur32.dll

Consulte também

Funções SSPI

EncryptMessage (Geral)

do SecBuffer

SecBufferDesc