共用方式為


編碼信封數據

信封數據是由任何類型的加密內容和一或多個收件者的內容加密會話密鑰所組成。 信封郵件會保留郵件秘密的內容,只允許指定的人員或實體擷取內容。

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

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

金鑰傳輸金鑰管理會使用預期的接收者的公鑰來加密會話密鑰。 接收者會使用與用來加密之公鑰相關聯的私鑰來解密會話密鑰。 接收者接著會使用解密的會話密鑰來解密信封數據。 使用金鑰傳輸時,接收者尚未確認傳送者身分識別的相關信息。

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

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

下圖顯示編碼信封數據的典型 CMS 事件序列。

編碼信封數據

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

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

編碼信封訊息

  1. 建立或擷取內容。

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

  3. 取得收件者憑證。

  4. 初始化 CMSG_ENVELOPED_ENCODE_INFO 結構。

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

  6. 呼叫 CryptMsgOpenToEncode,將 CMSG_ENVELOPED 傳入作為 dwMsgType,以及將 的 CMSG_ENVELOPED_ENCODE_INFO 指標作為 pvMsgEncodeInfo。 由於此呼叫,您將會取得已開啟的訊息控制代碼。

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

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

    如果此編碼結果要當做另一個編碼訊息的 內部數據,例如信封訊息,則必須傳遞 CMSG_BARE_CONTENT_PARAM 參數。 如需範例,請參閱 替用程式碼以編碼封裝消息

  9. 呼叫 CryptMsgClose 來關閉訊息,

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

範例 C 程式:編碼加密且簽署的訊息