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具有相同的值和相同的含义。 |
|
发送 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 结构。 输出缓冲区的大小是 cbMaxSignature 和 cbBlockSize 成员中的值的总和。
不使用 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 结构。 输出缓冲区的大小是 cbMaxSignature 和 cbBlockSize 成员中的值的总和。
与 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 [仅限桌面应用] |
标题 |
|
图书馆 |
|
DLL |
|