共用方式為


編碼和譯碼哈希訊息

哈希數據是由任何類型的內容和內容的 哈希 所組成。 當只需要確認訊息內容自哈希建立以來未被修改時,可以使用這個方法。

建立哈希訊息時,可能會有多個哈希演算法和多個哈希。 下圖描述編碼哈希訊息所需的工作。 此程式會在圖例後面的文字中描述。

建立哈希訊息

建立哈希訊息

  1. 取得指向要哈希的資料的指標。
  2. 選取要使用的哈希演算法。
  3. 使用哈希算法將數據放入哈希函數。
  4. 包含要哈希的原始數據、哈希演算法,以及編碼訊息中的哈希。

若要使用低階訊息函式來完成剛才概述的工作,請使用下列程式。

使用低階訊息函式來哈希和編碼訊息

  1. 建立或擷取要哈希的內容。

  2. 取得密碼編譯提供者。

  3. 初始化 CMSG_HASHED_ENCODE_INFO 結構。

  4. 呼叫 CryptMsgCalculateEncodedLength,以取得編碼訊息 BLOB 的大小。 為其配置記憶體。

  5. 呼叫 CryptMsgOpenToEncode,傳入 CMSG_HASHED 作為 dwMsgType 參數,以及指向 CMSG_HASHED_ENCODE_INFO 的指標作為 pvMsgEncodeInfo 參數。 因為這個呼叫,您取得了已開啟訊息的控制代碼。

  6. 呼叫 CryptMsgUpdate ,傳入步驟 5 中擷取的句柄,以及要哈希和編碼的數據指標。 您可以視需要呼叫此函式,以完成編碼程式。

  7. 呼叫 CryptMsgGetParam,傳入步驟 5 中擷取的句柄和適當的參數類型,以存取所需的編碼數據。 例如,傳遞 CMSG_CONTENT_PARAM 以取得整個 PKCS #7 訊息的指標。

    如果此編碼結果需做為另一個編碼訊息(例如信封訊息)的 內部數據,則必須傳遞 CMSG_BARE_CONTENT_PARAM。 如需顯示此例子的範例,請參閱 用於編碼信封訊息的替代程式碼

  8. 呼叫 CryptMsgClose 關閉訊息,

此程式的結果是包含原始數據的編碼訊息、哈希演算法,以及該數據的 哈希。 在步驟 7 中,將獲得指向編碼訊息 BLOB 的指標。

下列兩個步驟將解碼並驗證雜湊數據。

解碼雜湊數據

  1. 取得編碼 BLOB 的指標。
  2. 呼叫 CryptMsgOpenToDecode,並傳遞必要的自變數。
  3. 呼叫 CryptMsgUpdate 一次,傳遞步驟 2 中擷取的控制代碼,以及要譯碼的資料指標。 這會根據訊息類型,對訊息採取適當的動作。
  4. 呼叫 CryptMsgGetParam,傳入步驟 2 中擷取的控制代碼,以及適當的參數類型以存取所需的解碼數據。 例如,傳入CMSG_CONTENT_PARAM以取得解碼內容的指標。

驗證哈希

  1. 呼叫 CryptMsgControl,傳入 CMSG_CTRL_VERIFY_HASH 以驗證哈希。
  2. 呼叫 CryptMsgClose 以關閉訊息。

如需範例程式,請參閱 範例 C 程式:編碼和譯碼哈希訊息