Encryption

使用 OpenPGP 加密電子郵件時,何時使用每個密鑰?

  • October 22, 2012

當您使用PGP加密電子郵件發送電子郵件時,是使用收件人的公鑰加密電子郵件,還是使用您的私鑰?兩個都用嗎?

兩個密鑰對中的四個密鑰分別在什麼時候使用?

讓 Alice 有一個密鑰對 (PubKeyA, PrivKeyA),其中第一個是公共的,第二個是私有的,對於 Bob (PubKeyB, PrivKeyB) 也是如此。Alice 和 Bob 以可靠的方式知道彼此的公鑰(來自密鑰伺服器,或者因為他們親自收到它們等)。如果我們使用 RSA 密鑰,例如,那麼他們可以只使用一對,所以我假設這個第一的。

當 Alice 向 Bob 發送簽名消息時(簽名在 PGP 中是可選的,但很好的做法),會發生以下情況,簡化:

  1. Alice 為某些對稱密碼算法生成密鑰 K,例如 AES(即程序使用良好的隨機數生成器等)
  2. Alice 使用 K 加密消息 M,得到 AES-Enc(M,K)。
  3. Alice 使用 PubkeyB 加密 K,得到 RSA-Enc(K, PubKeyB)。
  4. RSA-Enc(K, PubKeyB) 和 AES-Enc(M) 兩部分以明確的方式組合(因此它們可以稍後拆分)成加密消息 M’ = Enc(M, K, PubKeyB)。
  5. Alice 使用她的 PrivKeyA 對 M’ 進行加密簽名(在 RSA 的情況下,這主要意味著散列 M’ 並使用該私鑰“加密”結果),這給了我們 Sign(M’,PrivKeyA)
  6. Enc(M, K, PubKeyB) 和 Sign(M’,PrivKeyA) 以明確的方式組合到 Alice 發送的消息中。

請注意,我們需要 AES 的安全操作模式來使用 K 加密 M,使用 PubKeyB 加密密鑰 K 的安全方式(使用安全填充方案,如 OAEP),安全散列函式和簽名方式(也使用填充方案)和一種很好的文件格式,可以明確地將所有數據打包進去。閱讀涉及它們的標準……

Bob 在收到消息時執行以下(簡化):

  1. 將消息拆分為 M’ = Enc(M, K, PubKeyB) 和 Sign(M’, PrivKeyA)。
  2. 使用 PubKeyA 檢查 Sign(M’, PrivKeyA) 是 M’ 的有效簽名。如果失敗就停止。如果成功,Bob 確信 M’ 是完整的並且確實是由 Alice 發送的。
  3. 然後將 M’ 拆分為 RSA-Enc(K, PubKeyB) 和 AES-Enc(M)。
  4. 使用他的 PrivKeyB,從 RSA-Enc(K, PubKeyB) 和 PrivKeyB 中解密 K。
  5. 使用 K,從 AES-Enc(M) 和 K 中解密 M。

現在 Bob 也有了 M,並且確信這是 Alice 想要發送的實際消息,並且在傳輸過程中沒有受到影響。

就像我說的,魔鬼在細節中,但這就是它的本質。

現在,在實踐中,PGP 為每個使用者創建 2 個對,一個加密對和一個簽名對。程序還發送帶有消息的密鑰標識符以指示使用哪些密鑰(通常,使用者可以擁有更多的公鑰等)

引用自:https://crypto.stackexchange.com/questions/3928