Keys
是否有隻需要一條消息的密鑰交換協議?
假設我想與某人交換一個秘密,但我只能向另一個人發送一條消息,然後我們使用該秘密進行加密。Diffie-Hellman 和 ECDH 需要來回發送多條消息以獲取共享密鑰。
是否存在只需要從一方安全發送一條消息的密鑰交換?(我知道通過明文發送密鑰是可行的,但這並不安全。)
(例如,將消息定義為網際網路上的數據包或一條簡訊)
對於沒有同步握手的前向保密,您需要 Signal 使用的“棘輪”協議。這是一個非常聰明的系統,真的:
- 每一方都生成一個非對稱密鑰對,並將公鑰提供給任何想要它的人。
- 每一方生成並儲存一定數量的$$ EC $$DH 參數 - 為您希望很快需要與之交談的每個人設置一組 - 然後使用私鑰對參數的公共部分進行簽名,並使簽名部分也公開可用。
在 Signal 的情況下,密鑰和簽名的公共參數被發送到中央伺服器。假設您要開始安全通信並且信任伺服器、有某種方法來驗證公鑰,或者不關心身份驗證,那麼您可以執行以下步驟:
- 下載收件人的密鑰及其下一個尚未使用的公鑰交換參數(伺服器和收件人都跟踪已使用的參數)。
- 或者,驗證密鑰並驗證參數上的簽名。
- 生成您自己的臨時密鑰交換參數集,並使用您的私鑰簽署公共部分。
- 使用您的參數中的私有部分和接收者參數中的公共部分來派生對稱密鑰。
- 或者,使用該密鑰加密消息。
- 將您的公鑰、雙方簽名的公鑰參數以及消息全部發送給收件人。
- 刪除臨時關鍵參數。
收件人:
- 查找預簽名的密鑰交換參數,並驗證他們剛剛收到的一個之前從未使用過。
- (可選)驗證發件人的公鑰及其公鑰交換參數上的簽名。
- 檢索他們相應的密鑰交換參數的私有部分,並使用它加上發送者的公共部分來重新導出對稱密鑰。
- 刪除密鑰交換參數中現在使用的私有部分,以確保前向保密。
- 使用交換的密鑰解密消息,和/或加密要發回的消息。
對於您的方案,如果您沒有中央伺服器,則需要事先檢索公鑰交換參數(以及可選的公鑰以驗證它)。但是,您將能夠通過一條消息非同步完成密鑰交換並啟動安全通信……並且(至少在接收者收到消息並完成密鑰交換後)它將是前向秘密的.