cryptDecodeMessage 函数 (wincrypt.h)

CryptDecodeMessage 函数解码、解密和验证加密消息。

当加密消息的类型未知时,可以使用此函数。 dwMsgTypeFlags 常量可以与按位 OR 运算组合,以便函数将尝试查找其中一种类型。 找到其中一种类型时,函数将报告找到的类型,并返回适合该类型的数据。

在每次传递中, 函数仅破解单个级别的加密或编码。 对于其他破解,必须再次调用此函数或其他 简化消息函数之一。

语法

BOOL CryptDecodeMessage(
  [in]                DWORD                       dwMsgTypeFlags,
  [in]                PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
  [in]                PCRYPT_VERIFY_MESSAGE_PARA  pVerifyPara,
  [in]                DWORD                       dwSignerIndex,
  [in]                const BYTE                  *pbEncodedBlob,
  [in]                DWORD                       cbEncodedBlob,
  [in]                DWORD                       dwPrevInnerContentType,
  [out, optional]     DWORD                       *pdwMsgType,
  [out, optional]     DWORD                       *pdwInnerContentType,
  [out, optional]     BYTE                        *pbDecoded,
  [in, out, optional] DWORD                       *pcbDecoded,
  [out, optional]     PCCERT_CONTEXT              *ppXchgCert,
  [out, optional]     PCCERT_CONTEXT              *ppSignerCert
);

参数

[in] dwMsgTypeFlags

指示消息类型: 消息类型可与按位 OR 运算符结合使用。 此参数可以是以下消息类型之一:

  • CMSG_DATA_FLAG
  • CMSG_SIGNED_FLAG
  • CMSG_ENVELOPED_FLAG
  • CMSG_SIGNED_AND_ENVELOPED_FLAG
  • CMSG_HASHED_FLAG
注意返回后,使用消息的类型设置 pdwMsgType 指向的 DWORD
 

[in] pDecryptPara

指向包含解密参数 的CRYPT_DECRYPT_MESSAGE_PARA 结构的指针。

[in] pVerifyPara

指向包含验证参数 的 CRYPT_VERIFY_MESSAGE_PARA 结构的指针。

[in] dwSignerIndex

指示要验证消息的可能多个签名者中的哪个签名者。 可以在对 函数的多次调用中更改此索引,以验证其他签名者。

对于第一个签名者,dwSignerIndex 设置为零。 如果函数返回 FALSE,并且 GetLastError 返回CRYPT_E_NO_SIGNER,则上一次调用返回消息的最后一个签名者。 此参数仅用于CMSG_SIGNED_AND_ENVELOPED或CMSG_SIGNED类型的消息。 对于所有其他消息类型,应将其设置为零。

[in] pbEncodedBlob

指向要解码的已编码 BLOB 的指针。

[in] cbEncodedBlob

编码的 BLOB 的大小(以字节为单位)。

[in] dwPrevInnerContentType

仅适用于处理嵌套加密消息时。 处理外部加密消息时,必须将其设置为零。 对嵌套加密消息进行解码时,它设置为之前调用外部消息的 CryptDecodeMessagepdwInnerContentType 处返回的值。 它可以是 pdwMsgType 中列出的任何 CMSG 类型。 为了向后兼容,请将 dwPrevInnerContentType 设置为零。

[out, optional] pdwMsgType

指向指定返回的消息类型的 DWORD 的指针。 此参数可以是以下消息类型之一:

  • CMSG_DATA
  • CMSG_SIGNED
  • CMSG_ENVELOPED
  • CMSG_SIGNED_AND_ENVELOPED
  • CMSG_HASHED

[out, optional] pdwInnerContentType

指向指定内部消息类型的 DWORD 的指针。 此处也使用了用于 pdwMsgType 的消息类型代码。

如果没有加密嵌套,则返回CMSG_DATA。

[out, optional] pbDecoded

指向用于接收解码消息的缓冲区的指针。

如果不需要解码的消息,则此参数可以为 NULL ,或者为内存分配设置解码消息的大小。 如果此参数为 NULL,则不会返回已解码的消息。 有关详细信息,请参阅 检索未知长度的数据

[in, out, optional] pcbDecoded

指向变量的指针,该变量指定 pbDecoded 参数指向的缓冲区的大小(以字节为单位)。 当函数返回时,此变量包含解码的消息的大小。

注意 处理缓冲区中返回的数据时,应用程序必须使用返回的数据的实际大小。 实际大小可以略小于输入时指定的缓冲区的大小。 (输入时,缓冲区大小通常指定得足够大,以确保最大可能的输出数据适合 buffer。) 输出时,此参数指向的变量将更新,以反映复制到缓冲区的数据的实际大小。
 

[out, optional] ppXchgCert

指向 指向CERT_CONTEXT 结构的指针的指针,该结构的证书对应于解码 消息所需的私钥 。 此参数仅为消息类型设置CMSG_ENVELOPED和CMSG_SIGNED_AND_ENVELOPED。

[out, optional] ppSignerCert

指向指向签名者证书上下文CERT_CONTEXT结构的指针的指针。 此参数仅为消息类型设置CMSG_SIGNED和CMSG_SIGNED_AND_ENVELOPED。

返回值

如果函数成功,则函数) 返回非零 (TRUE

如果函数失败,它将返回零 (FALSE) 。 有关扩展的错误信息,请调用 GetLastError

CryptDecryptMessageCryptVerifyMessageSignatureCryptVerifyMessageHash 函数可以传播到此函数。

以下错误代码最常由 GetLastError 函数返回。

返回代码 说明
ERROR_MORE_DATA
如果 pbDecoded 参数指定的缓冲区不够大,无法容纳返回的数据,则函数将设置ERROR_MORE_DATA代码,并将所需的缓冲区大小(以字节为单位)存储在 由ERROR_MORE_DATA decoded 指向的变量中。

注解

dwMsgTypeFlags 参数指定允许的消息集。 例如,若要解码 SIGNED 或 ENVELOPED 消息,请将 dwMsgTypeFlags 设置为 CMSG_SIGNED_FLAG |CMSG_ENVELOPED_FLAG。 必须指定 pDecryptParapVerifyPara 参数之一或两者。

对于已成功解码或验证的消息,将更新 ppXchgCertppSignerCert 指向的证书上下文指针。 必须通过调用 CertFreeCertificateContext 来释放它们。 如果函数失败,则设置为 NULL

在调用函数之前,可以将 ppXchgCertppSignerCert 参数设置为 NULL ,这表示调用方对获取交换证书或签名者 证书上下文不感兴趣。

要求

要求
最低受支持的客户端 Windows XP [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 wincrypt.h
Library Crypt32.lib
DLL Crypt32.dll

另请参阅

CryptDecryptMessage

CryptVerifyMessageHash

CryptVerifyMessageSignature

简化的消息函数