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

只有在處理巢狀密碼編譯訊息時才適用。 處理外部密碼編譯訊息時,它必須設定為零。 譯碼巢狀密碼編譯訊息時,它會由先前呼叫外部訊息的 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 參數所指向之緩衝區的大小,以位元組為單位。 當函式傳回時,此變數會包含譯碼訊息的大小。

注意 處理緩衝區中傳回的數據時,應用程式必須使用傳回之數據的實際大小。 實際大小可能比輸入上指定的緩衝區大小稍微小一點。 (輸入時,通常會指定足夠的緩衝區大小,以確保最大可能的輸出數據會符合 buffer.) On 輸出中,此參數所指向的變數會更新,以反映複製到緩衝區的數據的實際大小。
 

[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 函式傳回。

傳回碼 Description
ERROR_MORE_DATA
如果 pbDecoded 參數指定的緩衝區不夠大,無法保存傳回的數據,則函式會設定ERROR_MORE_DATA程式代碼,並以位元組為單位來儲存 所指向的變數中所需的緩衝區大小。

備註

dwMsgTypeFlags 參數會指定一組允許的訊息。 例如,若要譯碼 SIGNED 或 ENVELOPED 訊息,請將 dwMsgTypeFlags 設定為 CMSG_SIGNED_FLAG |CMSG_ENVELOPED_FLAG。 必須指定 pDecryptParapVerifyPara 參數的或兩者。

針對成功譯碼或驗證的訊息,會更新 ppXchgCertppSignerCert 所指向的憑證內容指標。 您必須呼叫 CertFreeCertificateContext 來釋放它們。 如果函式失敗,它們會設定為 NULL

呼叫函式之前, ppXchgCertppSignerCert 參數可以設定為 NULL ,這表示呼叫端對取得交換憑證或簽署者 憑證內容不感興趣。

規格需求

需求
最低支援的用戶端 Windows XP [僅限傳統型應用程式]
最低支援的伺服器 Windows Server 2003 [僅限傳統型應用程式]
目標平台 Windows
標頭 wincrypt.h
程式庫 Crypt32.lib
Dll Crypt32.dll

另請參閱

CryptDecryptMessage

CryptVerifyMessageHash

CryptVerifyMessageSignature

簡化的訊息函式