Integrity
DH 共享密鑰可以提供完整性嗎?
假設 A 和 B 事先交換了他們的公鑰。現在,A 和 B 希望通過不安全的通道進行通信,並希望提供消息的完整性和機密性。A 使用使用 DH 計算的共享密鑰使用對稱密碼對消息進行加密。如果 B 可以解密該消息,B 是否可以確定該消息是由 A 編寫和加密的?
一般來說,答案是否定的。
首先,您需要確保您的 DH 密鑰協議經過身份驗證。否則,您根本無法保證您正在與 A 交談。
其次,您使用的對稱密碼需要提供真實性,因此您應該使用一些 AEAD 方案。否則有人可以更改對稱加密的消息。
您的設置是:
- Alice 和 Bob 擁有彼此的公鑰
- 他們使用 DH 進行密鑰交換
- 他們想要保密性和完整性
在其原始形式中,DH 密鑰交換不使用公鑰,也沒有身份驗證。您想要在兩方之間進行雙向通信的是相互身份驗證,例如使用經過身份驗證的 DH,但還有其他選擇。TLS 通常只在一側進行身份驗證,因此這不起作用。
現在使用來自 kex 交換的密鑰,您可以使用KDF來獲取兩個密鑰:一個用於加密,一個用於MAC。
現在出現了一個難題:MAC-then-encrypt vs encrypt-then-MAC?(連結到關於 crypto-SE 的問題)
從連結中的 asnwers 中,如果您想使用其中之一,建議將是encrypt-then-MAC 。
像這樣的結構通常稱為身份驗證加密,重點是操作模式以及 MAC 是如何包含在其中的。其他例子是 GCM和EAX。
如果你想使用數字簽名來保證完整性,那麼還有簽密。
最後一點:雖然不是問題,但在您的協議中獲取前向保密屬性可能會很有趣。這通常通過使用匹配的密鑰交換協議來解決。