Encryption

安全地使用 CryptSignAndEncryptMessage?

  • May 30, 2012

我正在開發一個發送我想要加密和簽名的消息的應用程序。CryptoApi 提供了一個名為CryptSignAndEncryptMessage的函式。描述說,這個函式實際上做了什麼:

CryptSignAndEncryptMessage函式創建指定內容的散列,對散列簽名,對內容進行加密,對加密內容和簽名散列進行散列,然後對加密內容和簽名散列進行編碼。結果與首先對雜湊進行簽名然後加密的結果相同。

如果我理解正確,這個解決方案可能容易受到稱為秘密轉發的攻擊?

秘密轉發使用天真的“簽名和加密”方法,允許 B 將 A 發往 B 的消息轉發給第三方 C,並使 C 認為該消息來自 B,發往 C(雖然它是從 A 到B,並且剛剛由 B 轉發)。這是可能的,因為 B 可以解密已簽名的消息並為 C 重新加密。但是,儘管可以“非法”轉發消息,但無法更改實際消息內容。

這是否反過來意味著,如果我在簽名數據中包含接收者,我就不會受到這種攻擊?

如果我理解正確,這個解決方案可能容易受到稱為秘密轉發的攻擊?

如果 CryptSignAndEncryptMessage 以幼稚的方式實現,那麼它似乎很容易受到轉發攻擊。微軟尚未公佈確切的細節 (AFAIK),因此很難確定。

這是否反過來意味著,如果我在簽名數據中包含接收者,我就不會受到這種攻擊?

一些非常受人尊敬的密碼學家發表了一項建議。它在On the Security of Joint Signature and Encryption 的第 7 節中,與您的建議類似。具體來說,他們建議:

  1. 每當加密某些東西時,包括發件人的身份 $ ID_S $ 連同加密的消息。
  2. 每當簽名時,包括接收者的身份 $ ID_R $ 連同簽名的消息。
  3. 在接收方,每當發送方或接收方的身份與預期不匹配時,輸出 $ \bot $ .

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