Compartir a través de


Función DecryptMessage (General)

La función DecryptMessage (General) descifra un mensaje. Algunos paquetes no cifran y descifran mensajes, sino que realizan y comprueban un hash de integridad.

El proveedor de compatibilidad de seguridad implícita (SSP) proporciona confidencialidad de cifrado y descifrado para los mensajes intercambiados entre el cliente y el servidor como un mecanismo SASL únicamente.

Esta función también se usa con el SSP de Schannel para indicar una solicitud de un remitente del mensaje para una renegociación (rehacer) de los atributos de conexión o para un apagado de la conexión.

Nota:

Se puede llamar a EncryptMessage (General) y DecryptMessage (General) al mismo tiempo desde dos subprocesos diferentes en un único contexto de interfaz del proveedor de compatibilidad de seguridad (SSPI) si se cifra un subproceso y el otro se descifra. Si se cifra más de un subproceso o se descifra más de un subproceso, cada subproceso debe obtener un contexto único.

 

Para obtener información sobre cómo usar esta función con un SSP específico, consulte los temas siguientes.

Tema Descripción
DecryptMessage (digest) Descifra un mensaje mediante digest.
DecryptMessage (Kerberos) Descifra un mensaje mediante Kerberos.
DecryptMessage (Negotiate) Descifra un mensaje mediante Negotiate.
DecryptMessage (NTLM) Descifra un mensaje mediante NTLM.
DecryptMessage (Schannel) Descifra un mensaje mediante Schannel.

 

Sintaxis

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

Parámetros

phContext [in]

Identificador del contexto de seguridad que se va a usar para descifrar el mensaje.

pMessage [in, out]

Puntero a una estructura SecBufferDesc . En la entrada, la estructura hace referencia a una o varias estructuras SecBuffer . Uno de estos puede ser de tipo SECBUFFER_DATA. Ese búfer contiene el mensaje cifrado. El mensaje cifrado se descifra en su lugar, sobrescribiendo el contenido original de su búfer.

Al usar el SSP de resumen, en la entrada, la estructura hace referencia a una o varias estructuras SecBuffer . Uno de estos debe ser de tipo SECBUFFER_DATA o SECBUFFER_STREAM, y debe contener el mensaje cifrado.

Al usar el SSP de Schannel con contextos que no están orientados a la conexión, en la entrada, la estructura debe contener cuatro estructuras SecBuffer . Exactamente un búfer debe ser de tipo SECBUFFER_DATA y contener un mensaje cifrado, que se descifra en su lugar. Los búferes restantes se usan para la salida y deben ser de tipo SECBUFFER_EMPTY. En el caso de los contextos orientados a la conexión, se debe proporcionar un búfer de tipo SECBUFFER_DATA, como se indica para contextos no orientados a la conexión. Además, también se debe proporcionar un segundo búfer de tipo SECBUFFER_TOKEN que contenga un token de seguridad.

MessageSeqNo [in]

Número de secuencia esperado por la aplicación de transporte, si existe. Si la aplicación de transporte no mantiene números de secuencia, este parámetro debe establecerse en cero.

Al usar el SSP de resumen, este parámetro debe establecerse en cero. El SSP de resumen administra internamente la numeración de secuencia.

Al usar el SSP de Schannel, este parámetro debe establecerse en cero. El SSP de Schannel no usa números de secuencia.

pfQOP [out]

Puntero a una variable de tipo ULONG que recibe marcas específicas del paquete que indican la calidad de la protección.

Al usar el SSP de Schannel, este parámetro no se usa y debe establecerse en NULL.

Este parámetro puede ser una de las marcas siguientes.

Value Significado
SECQOP_WRAP_NO_ENCRYPT
El mensaje no se cifró, pero se generó un encabezado o finalizador.
Nota: KERB_WRAP_NO_ENCRYPT tiene el mismo valor y el mismo significado.
SIGN_ONLY
Al usar el SSP de resumen, use esta marca cuando el contexto de seguridad se establezca para comprobar la firma únicamente. Para obtener más información, consulte Calidad de protección.

 

Valor devuelto

Si la función comprueba que el mensaje se recibió en la secuencia correcta, la función devuelve SEC_E_OK.

Si la función no puede descifrar el mensaje, devuelve uno de los siguientes códigos de error.

Código devuelto Descripción
SEC_E_BUFFER_TOO_SMALL
El búfer de mensajes es demasiado pequeño. Se usa con el SSP de resumen.
SEC_E_CRYPTO_SYSTEM_INVALID
No se admite el cifrado elegido para el contexto de seguridad . Se usa con el SSP de resumen.
SEC_E_INCOMPLETE_MESSAGE
Los datos del búfer de entrada están incompletos. La aplicación necesita leer más datos del servidor y llamar de nuevo a DecryptMessage (General).
SEC_E_INVALID_HANDLE
Se especificó un identificador de contexto que no es válido en el parámetro phContext . Se usa con los SSP de digest y Schannel.
SEC_E_INVALID_TOKEN
Los búferes son del tipo incorrecto o no se encontró ningún búfer de tipo SECBUFFER_DATA. Se usa con el SSP de Schannel.
SEC_E_MESSAGE_ALTERED
El mensaje se ha modificado. Se usa con los SSP de digest y Schannel.
SEC_E_OUT_OF_SEQUENCE
El mensaje no se recibió en la secuencia correcta.
SEC_E_QOP_NOT_SUPPORTED
Ni la confidencialidad ni la integridad son compatibles con el contexto de seguridad. Se usa con el SSP de resumen.
SEC_I_CONTEXT_EXPIRED
El remitente del mensaje ha terminado de usar la conexión y ha iniciado un apagado. Para obtener información sobre cómo iniciar o reconocer un apagado, consulte Apagar una conexión Schannel. Se usa con el SSP de Schannel.
SEC_I_RENEGOTIATE
La parte remota requiere una nueva secuencia de protocolo de enlace o la aplicación acaba de iniciar un apagado. Vuelva al bucle de negociación y llame a AcceptSecurityContext (General) o InitializeSecurityContext (General), pasando búferes de entrada vacíos.
Si la función devuelve un búfer de tipo SEC_BUFFER_EXTRA, se debe pasar a la función AcceptSecurityContext (General) como un búfer de entrada.
Se usa con el SSP de Schannel.
La renegociación no se admite para el modo kernel de Schannel. El autor de la llamada debe omitir este valor devuelto o apagar la conexión. Si se omite el valor, el cliente o el servidor podrían apagar la conexión como resultado.

 

Observaciones

Cuando se usa el SSP de Schannel, la función DecryptMessage (General) devuelve SEC_I_CONTEXT_EXPIRED cuando el remitente del mensaje ha cerrado la conexión. Para obtener información sobre cómo iniciar o reconocer un apagado, consulte Apagar una conexión Schannel.

Cuando se usa el SSP de Schannel, DecryptMessage (General) devuelve SEC_I_RENEGOTIATE cuando el remitente del mensaje quiere renegociar la conexión (contexto de seguridad). Una aplicación controla una renegociación solicitada llamando a AcceptSecurityContext (General) (servidor) o InitializeSecurityContext (General) ( cliente) y pasando búferes de entrada vacíos. Después de esta llamada inicial devuelve un valor, continúe como si la aplicación creara una nueva conexión. Para obtener más información, consulte [Creación de un contexto de seguridad de Schannel](creating-an-schannel-security-context.md).

Para obtener información sobre cómo interoperar con GSSAPI, consulte Interoperabilidad de SSPI/Kerberos con GSSAPI.

Requisitos

Requisito Value
Cliente mínimo compatible
Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible
Windows Server 2003 [solo aplicaciones de escritorio]
Encabezado
Sspi.h (include Security.h)
Biblioteca
Secur32.lib
Archivo DLL
Secur32.dll

Consulte también

Funciones SSPI

EncryptMessage (General)

SecBuffer

SecBufferDesc