EncryptMessage (常规) 函数

EncryptMessage(常规)函数加密消息以提供隐私EncryptMessage(常规) 允许应用程序在所选机制支持的 加密算法 之间进行选择。 EncryptMessage(常规)函数使用上下文句柄引用的安全上下文。 某些包没有要加密或解密的消息,而是提供可以检查的完整性 哈希

使用摘要 式安全支持提供程序 (SSP)时,此函数仅可用作 SASL 机制。

使用 Schannel SSP 时,此函数使用与接收消息的远程方协商的 会话密钥 来加密消息。 加密算法由正在使用的 [密码 套件](密码 suites-in-schannel.md)确定。

注释

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

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

主题 说明
EncryptMessage (摘要) 使用 Digest 加密消息以提供隐私。
EncryptMessage (Kerberos) 使用 Kerberos 加密消息以提供隐私。
EncryptMessage (协商) 使用 Negotiate 加密消息以提供隐私。
EncryptMessage (NTLM) 使用 NTLM 加密消息以提供隐私。
EncryptMessage (Schannel) 使用 Schannel 加密消息以提供隐私。

语法

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

参数

phContext [in]

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

fQOP [in]

指示保护质量的特定于包的标志。 安全包可以使用此参数启用加密算法的选择。

使用摘要 SSP 时,此参数必须设置为零。

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

价值 含义
SECQOP_WRAP_NO_ENCRYPT
生成标头或预告片,但不加密消息。
注意: KERB_WRAP_NO_ENCRYPT具有相同的值和相同的含义。
SECQOP_WRAP_OOB_DATA
发送 Schannel 警报消息。 在这种情况下, pMessage 参数必须包含标准的双字节 SSL/TLS 事件代码。 此值仅受 Schannel SSP 支持。

pMessage [in, out]

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

该函数不处理具有SECBUFFER_READONLY属性的缓冲区。

包含消息的 SecBuffer 结构的长度不得大于从 QueryContextAttributes (常规) (SECPKG_ATTR_STREAM_SIZES) 函数获取的 cbMaximumMessage

使用摘要 SSP 时,必须有第二个类型为SECBUFFER_PADDING或SEC_BUFFER_DATA缓冲区来保存 签名 信息。 若要获取输出缓冲区的大小,请调用 QueryContextAttributes (常规) 函数并指定SECPKG_ATTR_SIZES。 该函数将返回 SecPkgContext_Sizes 结构。 输出缓冲区的大小是 cbMaxSignaturecbBlockSize 成员中的值的总和。

不使用 SSL 的应用程序必须提供类型为 SECBUFFER_PADDING 的 SecBuffer

MessageSeqNo [in]

传输应用程序分配给消息的序列号。 如果传输应用程序不维护序列号,此参数必须为零。

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

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

返回值

如果函数成功,该函数将返回SEC_E_OK。

如果函数失败,它将返回以下错误代码之一。

返回代码 说明
SEC_E_BUFFER_TOO_SMALL 输出缓冲区太小。 有关详细信息,请参阅“备注”。
SEC_E_CONTEXT_EXPIRED 应用程序引用已关闭的上下文。 正确写入的应用程序不应收到此错误。
SEC_E_CRYPTO_SYSTEM_INVALID 不支持为安全上下文选择的密码
SEC_E_INSUFFICIENT_MEMORY 没有足够的内存可用于完成请求的操作。
SEC_E_INVALID_HANDLE phContext 参数中指定了无效的上下文句柄。
SEC_E_INVALID_TOKEN 找不到SECBUFFER_DATA类型缓冲区。
SEC_E_QOP_NOT_SUPPORTED 安全上下文既不支持保密性,也不支持完整性

注解

EncryptMessage(常规)函数基于消息和安全上下文中的会话密钥加密消息。

如果传输应用程序创建了支持序列检测 的安全上下文 ,并且调用方提供了序列号,则函数将此信息与加密消息一起包含。 包括此信息可防止重播、插入和抑制消息。 安全包包含从传输应用程序传递的序列号。

使用摘要 SSP 时,通过调用 QueryContextAttributes(常规) 函数并指定SECPKG_ATTR_SIZES来获取输出缓冲区的大小。 该函数将返回 SecPkgContext_Sizes 结构。 输出缓冲区的大小是 cbMaxSignaturecbBlockSize 成员中的值的总和。

与 Schannel SSP 一起使用时, pMessage 参数必须包含以下缓冲区的 SecBufferDesc 结构。

注释

必须按显示的顺序提供这些缓冲区。

缓冲区类型 说明
SECBUFFER_STREAM_HEADER 内部使用。 无需初始化。
SECBUFFER_DATA 包含要加密的 纯文本 消息。
SECBUFFER_STREAM_TRAILER 内部使用。 无需初始化。
SECBUFFER_EMPTY 内部使用。 无需初始化。 大小可以为零。

使用 Schannel SSP 时,通过调用 QueryContextAttributes (General) 函数并指定SECPKG_ATTR_STREAM_SIZES属性来确定每个缓冲区的最大大小。 此函数返回一个 SecPkgContext_StreamSizes 结构,其成员包含标头(cbHeader 成员)、消息(cbMaximumMessage 成员)和预告片(cbTrailer 成员)缓冲区的最大大小。

为了获得最佳性能,应从连续内存中分配 pMessage 结构。

Windows XP/2000: 此函数也称为 SealMessage。 应用程序现在应仅使用 EncryptMessage (常规)。

要求

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

另请参阅