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。
如果函数无法解密消息,它将返回以下错误代码之一。
返回代码 | 描述 |
---|---|
|
消息缓冲区太小。 与摘要 SSP 一起使用。 |
|
不支持为安全上下文选择的密码。 与摘要 SSP 一起使用。 |
|
输入缓冲区中的数据不完整。 应用程序需要从服务器读取更多数据,并再次调用 DecryptMessage (General) 。 |
|
phContext 参数中指定了无效的上下文句柄。 与摘要和 Schannel SSP 一起使用。 |
|
缓冲区的类型不正确,或者找不到SECBUFFER_DATA类型的缓冲区。 与 Schannel SSP 一起使用。 |
|
消息已更改。 与摘要和 Schannel SSP 一起使用。 |
|
未按正确的顺序接收消息。 |
|
安全上下文不支持保密性和完整性。 与摘要 SSP 一起使用。 |
|
消息发送方已完成使用连接,并已启动关闭。 有关启动或识别关闭的信息,请参阅 关闭 Schannel 连接。 与 Schannel SSP 一起使用。 |
|
远程方需要新的握手序列,或者应用程序刚刚启动关闭。 返回到协商循环并调用 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 [仅限桌面应用] |
标头 |
|
库 |
|
DLL |
|
另请参阅