編碼帶正負號的數據
已簽署的數據 由任何類型的內容和經由零個或多個簽署者加密的訊息包含的內容哈希 所組成。 產生的哈希可以確認自簽署後原始訊息未被修改,並且是由特定人員或實體簽署的。
下圖描述編碼已簽署訊息的程式。 下圖後面的清單描述這些步驟。
訊息可能會有多個簽署者、哈希演算法和憑證。 雖然此圖僅顯示憑證,CRL和 CTL 可以使用相同的程序。 它們會放在任何顯示憑證的插圖中。
編碼 帶正負號數據 的一般程式如下所示。
編碼已簽署的數據
- 系統會建立數據(如有必要),並擷取其指標。
- 開啟 證書存儲,其中包含簽署者的憑證。
- 擷取憑證的私鑰。 使用憑證之前,必須先在憑證上設定兩個屬性。 其中一個用來將憑證系結至特定 CSP,並在該 CSP 內將憑證系結至特定私人 密鑰容器,。 另一個用來指出呼叫 哈希 作業時,要使用的哈希演算法。 這些只需要設定一次。
- 憑證的 屬性會決定哈希演算法。
- 數據哈希是透過哈希函式傳送數據所建立。
- 簽章是透過使用私鑰加密雜湊值來建立的,該私鑰是透過憑證上的屬性取得的。
- 下列資料會包含在已完成且已簽署的訊息中:
- 待簽署的原始資料
- 哈希演算法
- 簽章
- 簽署者信息結構,其中包含簽署者標識碼(憑證簽發者和序號)
- 簽署者的憑證(選擇性)
此程序說明簡單的案例。 更複雜的案例牽涉到訊息中包含的已驗證屬性。 當內容類型不是 BYTE 字串,或至少有一個已驗證的屬性以及任何數據類型時,需要兩個標準驗證屬性:內容 (data) 類型和內容的哈希。 在這些情況下,CryptoAPI 會自動提供這兩個必要屬性。 低階訊息函式會哈希已驗證的屬性、使用私鑰加密哈希,並提供此做為簽章。
使用低階訊息函式,使用下列程式來完成剛才列出的工作。
編碼已簽署的訊息
建立或擷取內容。
取得密碼編譯提供者。
取得簽署者憑證。
初始化 CMSG_SIGNER_ENCODE_INFO 結構。
初始化 CMSG_SIGNED_ENCODE_INFO 結構。
呼叫 CryptMsgCalculateEncodedLength,以取得編碼訊息 BLOB 的大小。 為其配置記憶體。
呼叫 cryptMsgOpenToEncode,針對 dwMsgType 傳入 CMSG_SIGNED CMSG_SIGNED,以及 pvMsgEncodeInfoCMSG_SIGNED_ENCODE_INFO 指標,以取得已開啟訊息的句柄。
呼叫 CryptMsgUpdate,傳入步驟 7 中擷取的控制代碼,以及要簽署和編碼的數據指標。 您可以視需要呼叫此函式,以完成編碼程式。
呼叫 CryptMsgGetParam,傳入步驟 7 中擷取的句柄和適當的參數類型,以存取所需的編碼數據。 例如,傳入 CMSG_CONTENT_PARAM 以取得整個 PKCS #7 訊息的指標。
如果此編碼結果要當做另一個編碼訊息的 內部數據,例如信封訊息,則必須傳遞 CMSG_BARE_CONTENT_PARAM 參數。 如需查看此範例,請參閱 編碼信封訊息的替代代碼。
呼叫 CryptMsgClose關閉訊息。
此程式的結果是包含原始數據的編碼訊息、該數據的加密哈希(簽章),以及簽署者資訊。 還有一個指向所需編碼 BLOB 的指標。
如需 C 編碼詳細數據,請參閱 範例 C 程式:簽署、編碼、譯碼和驗證訊息。