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
[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
仅适用于处理嵌套加密消息时。 处理外部加密消息时,必须将其设置为零。 对嵌套加密消息进行解码时,它设置为之前调用外部消息的 CryptDecodeMessage 在 pdwInnerContentType 处返回的值。 它可以是 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 参数指向的缓冲区的大小(以字节为单位)。 当函数返回时,此变量包含解码的消息的大小。
[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。
CryptDecryptMessage、CryptVerifyMessageSignature 或 CryptVerifyMessageHash 函数可以传播到此函数。
以下错误代码最常由 GetLastError 函数返回。
返回代码 | 说明 |
---|---|
|
如果 pbDecoded 参数指定的缓冲区不够大,无法容纳返回的数据,则函数将设置ERROR_MORE_DATA代码,并将所需的缓冲区大小(以字节为单位)存储在 由ERROR_MORE_DATA decoded 指向的变量中。 |
注解
dwMsgTypeFlags 参数指定允许的消息集。 例如,若要解码 SIGNED 或 ENVELOPED 消息,请将 dwMsgTypeFlags 设置为 CMSG_SIGNED_FLAG |CMSG_ENVELOPED_FLAG。 必须指定 pDecryptPara 或 pVerifyPara 参数之一或两者。
对于已成功解码或验证的消息,将更新 ppXchgCert 和 ppSignerCert 指向的证书上下文指针。 必须通过调用 CertFreeCertificateContext 来释放它们。 如果函数失败,则设置为 NULL。
在调用函数之前,可以将 ppXchgCert 或 ppSignerCert 参数设置为 NULL ,这表示调用方对获取交换证书或签名者 证书上下文不感兴趣。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | wincrypt.h |
Library | Crypt32.lib |
DLL | Crypt32.dll |