Compartilhar via


Função EncryptMessage (Geral)

A função EncryptMessage (Geral) criptografa uma mensagem para fornecer privacidade. EncryptMessage (Geral) permite que um aplicativo escolha entre algoritmos criptográficos compatíveis com o mecanismo escolhido. A função EncryptMessage (Geral) usa o contexto de segurança referenciado pelo identificador de contexto. Alguns pacotes não têm mensagens a serem criptografadas ou descriptografadas, mas fornecem um hash de integridade que pode ser verificado.

Ao usar o SSP ( provedor de suporte de segurança ) Digest, essa função está disponível apenas como um mecanismo SASL.

Ao usar o SSP do Schannel, essa função criptografa mensagens usando uma chave de sessão negociada com a parte remota que receberá a mensagem. O algoritmo de criptografia é determinado pelo [conjunto de criptografias ](cipher-suites-in-schannel.md) em uso.

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
EncryptMessage (Digest) Criptografa uma mensagem para fornecer privacidade usando o Digest.
EncryptMessage (Kerberos) Criptografa uma mensagem para fornecer privacidade usando Kerberos.
EncryptMessage (Negociar) Criptografa uma mensagem para fornecer privacidade usando Negociar.
EncryptMessage (NTLM) Criptografa uma mensagem para fornecer privacidade usando o NTLM.
EncryptMessage (Schannel) Criptografa uma mensagem para fornecer privacidade usando o Schannel.

Sintaxe

SECURITY_STATUS SEC_Entry EncryptMessage(
  _In_    PCtxtHandle    phContext,
  _In_    ULONG          fQOP,
  _Inout_ PSecBufferDesc pMessage,
  _In_    ULONG          MessageSeqNo
);

Parâmetros

phContext [in]

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

fQOP [in]

Sinalizadores específicos do pacote que indicam a qualidade da proteção. Um pacote de segurança pode usar esse parâmetro para habilitar a seleção de algoritmos criptográficos.

Ao usar o SSP do Digest, esse parâmetro deve ser definido como zero.

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

Valor Significado
SECQOP_WRAP_NO_ENCRYPT
Produza um cabeçalho ou trailer, mas não criptografe a mensagem.
Nota: KERB_WRAP_NO_ENCRYPT tem o mesmo valor e o mesmo significado.
SECQOP_WRAP_OOB_DATA
Enviar uma mensagem de alerta do Schannel. Nesse caso, o parâmetro pMessage deve conter um código de evento SSL/TLS de dois bytes padrão. Esse valor é compatível apenas com o SSP do Schannel.

pMessage [in, out]

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 a ser criptografada. A mensagem é criptografada no local, substituindo o conteúdo original da estrutura.

A função não processa buffers com o atributo SECBUFFER_READONLY.

O comprimento da estrutura SecBuffer que contém a mensagem não deve ser maior que cbMaximumMessage, que é obtido da função QueryContextAttributes (Geral) (SECPKG_ATTR_STREAM_SIZES).

Ao usar o SSP digest, deve haver um segundo buffer do tipo SECBUFFER_PADDING ou SEC_BUFFER_DATA para armazenar informações de assinatura . Para obter o tamanho do buffer de saída, chame a função QueryContextAttributes (Geral) e especifique SECPKG_ATTR_SIZES. A função retornará uma estrutura SecPkgContext_Sizes . O tamanho do buffer de saída é a soma dos valores nos membros cbMaxSignature e cbBlockSize .

Os aplicativos que não usam SSL devem fornecer um SecBuffer do tipo SECBUFFER_PADDING.

MessageSeqNo [in]

O número de sequência que o aplicativo de transporte atribuiu à mensagem. Se o aplicativo de transporte não mantiver números de sequência, esse parâmetro deverá ser 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.

Valor retornado

Se a função for bem-sucedida, a função retornará SEC_E_OK.

Se a função falhar, ela retornará um dos seguintes códigos de erro.

Código de retorno Descrição
SEC_E_BUFFER_TOO_SMALL O buffer de saída é muito pequeno. Para obter mais informações, consulte Comentários.
SEC_E_CONTEXT_EXPIRED O aplicativo está fazendo referência a um contexto que já foi fechado. Um aplicativo escrito corretamente não deve receber esse erro.
SEC_E_CRYPTO_SYSTEM_INVALID Não há suporte para a criptografia escolhida para o contexto de segurança .
SEC_E_INSUFFICIENT_MEMORY Não há memória suficiente disponível para concluir a ação solicitada.
SEC_E_INVALID_HANDLE Um identificador de contexto que não é válido foi especificado no parâmetro phContext .
SEC_E_INVALID_TOKEN Nenhum buffer de tipo SECBUFFER_DATA foi encontrado.
SEC_E_QOP_NOT_SUPPORTED Não há suporte para confidencialidade nem integridade no contexto de segurança.

Comentários

A função EncryptMessage (Geral) criptografa uma mensagem com base na mensagem e na chave de sessão de um contexto de segurança.

Se o aplicativo de transporte criou o contexto de segurança para dar suporte à detecção de sequência e o chamador fornecer um número de sequência, a função incluirá essas informações com a mensagem criptografada. A inclusão dessas informações protege contra reprodução, inserção e supressão de mensagens. O pacote de segurança incorpora o número de sequência passado para baixo do aplicativo de transporte.

Ao usar o SSP digest, obtenha o tamanho do buffer de saída chamando a função QueryContextAttributes (Geral) e especificando SECPKG_ATTR_SIZES. A função retornará uma estrutura SecPkgContext_Sizes . O tamanho do buffer de saída é a soma dos valores nos membros cbMaxSignature e cbBlockSize .

Quando usado com o SSP do Schannel, o parâmetro pMessage deve conter uma estrutura SecBufferDesc com os buffers a seguir.

Observação

Esses buffers devem ser fornecidos na ordem mostrada.

Tipo de buffer Descrição
SECBUFFER_STREAM_HEADER Usado internamente. Nenhuma inicialização necessária.
SECBUFFER_DATA Contém a mensagem de texto sem formatação a ser criptografada.
SECBUFFER_STREAM_TRAILER Usado internamente. Nenhuma inicialização necessária.
SECBUFFER_EMPTY Usado internamente. Nenhuma inicialização necessária. O tamanho pode ser zero.

Ao usar o SSP do Schannel, determine o tamanho máximo de cada um dos buffers chamando a função QueryContextAttributes (Geral) e especificando o atributo SECPKG_ATTR_STREAM_SIZES. Essa função retorna uma estrutura SecPkgContext_StreamSizes cujos membros contêm os tamanhos máximos para os buffers de cabeçalho (membro cbHeader ), mensagem (membro cbMaximumMessage ) e trailer (membro cbTrailer ).

Para obter o desempenho ideal, as estruturas pMessage devem ser alocadas da memória contígua.

Windows XP/2000: Essa função também era conhecida como SealMessage. Os aplicativos agora devem usar Somente EncryptMessage (Geral ).

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]
parâmetro
Sspi.h (inclua Security.h)
Biblioteca
Secur32.lib
DLL
Secur32.dll

Confira também