DecryptMessage (常规) 函数

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

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

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

备注

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

 

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

主题 描述
DecryptMessage (摘要) 使用摘要解密消息。
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 [out]

指向 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 (General) InitializeSecurityContext (General) ,传递空的输入缓冲区。
如果函数返回 类型为 SEC_BUFFER_EXTRA 的缓冲区,则应将此缓冲区作为输入缓冲区传递给 AcceptSecurityContext (General) 函数。
与 Schannel SSP 一起使用。
Schannel 内核模式不支持重新协商。 调用方应忽略此返回值或关闭连接。 如果忽略该值,客户端或服务器可能会因此关闭连接。

 

备注

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

使用 Schannel SSP 时, DecryptMessage (常规) 返回SEC_I_RENEGOTIATE消息发送方想要重新协商连接 (安全上下文) 。 应用程序通过调用 AcceptSecurityContext (General) ( 服务器端) 或 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 (General)

SecBuffer

SecBufferDesc