DecryptMessage (常规) 函数

DecryptMessage(常规)函数解密消息。 某些包不加密和解密消息,而是执行并检查完整性 哈希

摘要 式安全支持提供程序 (SSP)仅为客户端和服务器之间交换的消息提供加密和解密机密性作为 SASL 机制。

此函数还与 Schannel SSP 一起使用,以向消息发送方发出请求,以便重新协商连接属性或关闭连接。

注释

如果一个线程正在加密,另一个线程正在解密,则可以同时从单个安全支持提供程序接口 (SSPI) 上下文中的两个不同的线程调用 EncryptMessage (常规)和 DecryptMessage (常规)。 如果多个线程正在加密,或者多个线程正在解密,则每个线程应获取唯一的上下文。

 

有关将此函数用于特定 SSP 的信息,请参阅以下主题。

主题 说明
DecryptMessage (摘要) 使用 Digest 解密消息。
DecryptMessage (Kerberos) 使用 Kerberos 解密消息。
DecryptMessage (Negotiate) 使用 Negotiate 解密消息。
DecryptMessage (NTLM) 使用 NTLM 解密消息。
DecryptMessage (Schannel) 使用 Schannel 解密消息。

 

语法

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

参数

phContext [in]

用于解密消息 的安全上下文 的句柄。

pMessage [in, out]

指向 SecBufferDesc 结构的指针。 在输入时,结构引用一个或多个 SecBuffer 结构。 其中一种可能是SECBUFFER_DATA类型。 该缓冲区包含加密的消息。 加密消息已就地解密,覆盖其缓冲区的原始内容。

使用摘要 SSP 时,在输入时,结构引用一个或多个 SecBuffer 结构。 其中一个必须是类型SECBUFFER_DATA或SECBUFFER_STREAM,并且必须包含加密的消息。

将 Schannel SSP 与不面向连接的上下文一起使用时,在输入上,该结构必须包含四 个 SecBuffer 结构。 只有一个缓冲区的类型SECBUFFER_DATA并且包含已加密的消息,该消息已就地解密。 其余缓冲区用于输出,并且必须为类型SECBUFFER_EMPTY。 对于面向连接的上下文,必须提供SECBUFFER_DATA类型缓冲区,如非连接型上下文所述。 此外,还必须提供包含安全令牌的第二个SECBUFFER_TOKEN类型缓冲区。

MessageSeqNo [in]

传输应用程序预期的序列号(如果有)。 如果传输应用程序不维护序列号,则必须将此参数设置为零。

使用摘要 SSP 时,此参数必须设置为零。 摘要 SSP 在内部管理序列号。

使用 Schannel SSP 时,此参数必须设置为零。 Schannel SSP 不使用序列号。

pfQOP [出局]

指向 ULONG 类型的变量的指针,该变量接收指示保护质量的包特定标志。

使用 Schannel SSP 时,不会使用此参数,应设置为 NULL

此参数可以是以下标志之一。

价值 含义
SECQOP_WRAP_NO_ENCRYPT
消息未加密,但生成了标头或预告片。
注意: KERB_WRAP_NO_ENCRYPT具有相同的值和相同的含义。
SIGN_ONLY
使用摘要 SSP 时,当 安全上下文 设置为仅验证 签名 时,请使用此标志。 有关详细信息,请参阅 “保护质量”。

 

返回值

如果函数验证消息是否按正确的顺序接收,该函数将返回SEC_E_OK。

如果函数无法解密消息,它将返回以下错误代码之一。

返回代码 说明
SEC_E_BUFFER_TOO_SMALL
消息缓冲区太小。 与摘要 SSP 一起使用。
SEC_E_CRYPTO_SYSTEM_INVALID
不支持为安全上下文选择的密码。 与摘要 SSP 一起使用。
SEC_E_INCOMPLETE_MESSAGE
输入缓冲区中的数据不完整。 应用程序需要从服务器读取更多数据并再次调用 DecryptMessage (General)。
SEC_E_INVALID_HANDLE
phContext 参数中指定了无效的上下文句柄。 与摘要和 Schannel SSP 一起使用。
SEC_E_INVALID_TOKEN
缓冲区的类型不正确,或者找不到SECBUFFER_DATA类型的缓冲区。 与 Schannel SSP 一起使用。
SEC_E_MESSAGE_ALTERED
消息已更改。 与摘要和 Schannel SSP 一起使用。
SEC_E_OUT_OF_SEQUENCE
消息未按正确的顺序接收。
SEC_E_QOP_NOT_SUPPORTED
安全上下文既不支持保密性,也不支持完整性。 与摘要 SSP 一起使用。
SEC_I_CONTEXT_EXPIRED
消息发送方已使用连接完成,并已启动关闭。 有关启动或识别关闭的信息,请参阅 关闭 Schannel 连接。 与 Schannel SSP 一起使用。
SEC_I_RENEGOTIATE
远程方需要新的握手序列或应用程序刚刚启动关闭。 返回到协商循环并调用 AcceptSecurityContext(常规)InitializeSecurityContext (常规),传递空输入缓冲区。
如果函数返回 类型为 SEC_BUFFER_EXTRA 的缓冲区,则应将此缓冲区作为输入缓冲区传递给 AcceptSecurityContext (常规) 函数。
与 Schannel SSP 一起使用。
Schannel 内核模式不支持重新协商。 调用方应忽略此返回值或关闭连接。 如果忽略该值,客户端或服务器可能会因此关闭连接。

 

注解

使用 Schannel SSP 时,当消息发送方关闭连接时, DecryptMessage(常规) 函数将返回SEC_I_CONTEXT_EXPIRED。 有关启动或识别关闭的信息,请参阅 关闭 Schannel 连接

使用 Schannel SSP 时,当消息发送方希望重新谈判连接(安全上下文)时,DecryptMessage(常规)将返回SEC_I_RENEGOTIATE。 应用程序通过调用 AcceptSecurityContext(常规)InitializeSecurityContext(常规 )(客户端)(客户端)并传入空输入缓冲区来处理请求重新协商。 此初始调用返回一个值后,继续作,就像应用程序正在创建新连接一样。 有关详细信息,请参阅[创建 Schannel 安全上下文](creating-an-schannel-security-context.md)。

有关与 GSSAPI 互作的信息,请参阅 SSPI/Kerberos 与 GSSAPI 的互作性

要求

要求 价值
支持的最低客户端
Windows XP [仅限桌面应用]
支持的最低服务器
Windows Server 2003 [仅限桌面应用]
标题
Sspi.h(包括 Security.h)
图书馆
Secur32.lib
DLL
Secur32.dll

另请参阅

SSPI 函数

EncryptMessage (常规)

秒缓冲区

SecBufferDesc