編碼信封資料

信封資料包含任何類型的加密內容,以及一或多個收件者的加密內容加密工作階段金鑰。 信封郵件會保留郵件秘密的內容,只允許指定的人員或實體擷取內容。

CMS) (密碼編譯訊息語法可用來編碼信封訊息。 CMS 支援三種金鑰管理技術:金鑰傳輸、金鑰協定和先前散發的對稱金鑰加密金鑰 (KEK) 。 先前的分散式對稱 KEK 也稱為郵寄清單金鑰發佈。

在這三種技術中,會產生單一工作階段金鑰來加密信封訊息。 金鑰管理問題會處理傳送者加密工作階段金鑰的方式,並由接收者解密。 單一加密郵件可以使用金鑰管理技術的混合,散發給許多收件者。

金鑰傳輸金鑰管理會使用預期的接收者公開金鑰來加密工作階段金鑰。 接收者會使用與用來加密之公開金鑰相關聯的私密金鑰來解密工作階段金鑰。 接收者接著會使用解密的工作階段金鑰來解密信封的資料。 使用金鑰傳輸時,接收者尚未確認傳送者身分識別的相關資訊。

在金鑰協定管理中,會產生暫時、暫時Diffie-Hellman私密金鑰,並用來加密工作階段金鑰。 對應至暫時私密金鑰的公開金鑰會包含在郵件收件者資訊的一部分。 收件者會使用收到的暫時金鑰解密工作階段金鑰,並使用這個解密的工作階段金鑰來解密信封訊息。 使用暫時金鑰合約搭配接收者的私密金鑰,訊息接收者確實已確認寄件者身分識別的相關資訊。

針對使用先前分散式 對稱金鑰的金鑰管理,每個訊息都包含使用先前分散式金鑰加密金鑰加密的內容加密金鑰。 接收者會使用先前發佈的金鑰加密金鑰來解密內容加密金鑰,然後使用解密的內容加密金鑰來解密信封的訊息。

下列圖例顯示編碼信封資料的一般 CMS 事件序列。

編碼信封資料

  • 擷取 純文字 訊息的指標。
  • 會產生對稱 (會話) 金鑰。
  • 對稱金鑰和指定的加密演算法可用來加密訊息資料。
  • 隨即開啟憑證存放區
  • 收件者的憑證是從存放區擷取的。
  • 公開金鑰是從收件者的憑證擷取。
  • 使用收件者的公開金鑰時,對稱金鑰會加密。
  • 從收件者的憑證中,會擷取收件者的識別碼。
  • 下列資訊包含在數位信封訊息中:資料加密演算法、加密的資料、加密的對稱金鑰,以及收件者資訊結構。

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

編碼信封郵件

  1. 建立或擷取內容。

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

  3. 取得收件者憑證。

  4. 初始化 CMSG_ENVELOPED_ENCODE_INFO 結構。

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

  6. 呼叫CryptMsgOpenToEncode,針對dwMsgType傳入 CMSG_ENVELOPED,以及pvMsgEncodeInfoCMSG_ENVELOPED_ENCODE_INFO指標。 由於此呼叫,您將會收到已開啟訊息的控制碼。

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

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

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

  9. 呼叫 CryptMsgClose以關閉訊息。

此程式的結果是包含加密資料的編碼訊息、使用收件者的公開金鑰加密的 對稱金鑰 ,以及收件者資訊資料結構。 收件者的加密內容和加密對稱金鑰的組合是該收件者 的數位信封 。 任何類型的內容都可以封存給多個收件者。

範例 C 程式:編碼信封、帶正負號的訊息