編碼帶正負號的資料

已簽署的資料是由任何類型的內容和由零或多個簽署者加密的內容所組成。 產生的雜湊可以確認原始訊息自簽署後尚未修改,且特定人員或實體已簽署資料。

下圖描述編碼已簽署訊息的程式。 下圖後面的清單描述這些步驟。

訊息可能會有多個簽署者、雜湊演算法和憑證。 雖然此圖只顯示憑證、 CRLCTL 可以使用相同的程式。 無論憑證顯示於何處,它們都會放入圖例中。

編碼帶正負號的訊息

編碼 已簽署資料的 一般程式如下。

編碼帶正負號的資料

  1. 資料會視需要) 建立 (,並擷取其指標。
  2. 隨即開啟包含簽署者憑證的 憑證存放區
  3. 會擷取憑證的私密金鑰。 使用憑證之前,必須設定兩個屬性。 其中一個是用來將憑證系結至特定 CSP,並在該 CSP 內系結至特定 私密金鑰容器。 另一個是用來指出呼叫雜湊作業時要使用的 雜湊 演算法。 這些只需要設定一次。
  4. 憑證的 屬性會決定雜湊演算法。
  5. 資料雜湊是透過雜湊函式傳送資料所建立。
  6. 簽章是藉由使用私密金鑰加密雜湊,透過憑證上的 屬性取得。
  7. 下列資料包含在已完成且已簽署的訊息中:
    • 要簽署的原始資料
    • 雜湊演算法
    • 簽章
    • 簽署者資訊結構,其中包含憑證簽發者和序號 (簽署者識別碼)
    • 簽署者的憑證 (選擇性)

此程式說明簡單的案例。 更複雜的案例牽涉到訊息中包含的已驗證屬性。 當內容類型是 BYTE 字串以外的任何專案,或是至少有一個已驗證的屬性以及任何資料類型時,需要兩個標準驗證屬性:內容 (資料) 類型,以及內容的雜湊。 在這些情況下, CryptoAPI 會自動提供這兩個必要屬性。 低階訊息函式會雜湊已驗證的屬性、使用私密金鑰加密雜湊,並提供此作為簽章。

使用低階訊息函式,使用下列程式來完成剛才列出的工作。

編碼已簽署的訊息

  1. 建立或擷取內容。

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

  3. 取得簽署者憑證。

  4. 初始化 CMSG_SIGNER_ENCODE_INFO 結構。

  5. 初始化 CMSG_SIGNED_ENCODE_INFO 結構。

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

  7. 呼叫CryptMsgOpenToEncode,針對dwMsgType傳入 CMSG_SIGNED,以及針對 pvMsgEncodeInfoCMSG_SIGNED_ENCODE_INFO指標,以取得已開啟之訊息的控制碼。

  8. 呼叫 CryptMsgUpdate,傳入步驟 7 中擷取的控制碼,以及要簽署和編碼之資料的指標。 您可以視需要呼叫此函式,以完成編碼程式。

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

    如果此編碼的結果是要作為另一個編碼訊息 的內部資料 ,例如信封訊息,則必須傳遞CMSG_BARE_CONTENT_PARAM參數。 如需顯示此範例的範例,請參閱 編碼信封訊息的替代程式碼

  10. 呼叫 CryptMsgClose以關閉訊息。

此程式的結果是包含原始資料的編碼訊息、該資料的加密雜湊 (簽章) ,以及簽署者資訊。 另外還有所需編碼 BLOB 的指標。

如需 C 程式碼詳細資料,請參閱 範例 C 程式:簽署、編碼、解碼和驗證訊息