具有預共享密鑰的完美前向保密
我最近一直在研究如何在單向連接上進行完美的前向保密(伺服器只能將消息推送到客戶端,客戶端無法響應)。
我想出的是使用隨機共享密鑰作為起始位置並將其用作第一條推送消息的對稱密碼密鑰的想法。一旦推送了這條消息,就會對密鑰進行雜湊處理,這個雜湊的結果就是第二條消息的密鑰。這繼續充當一種雜湊樹,即:
$$ \begin{aligned} K_0 &= R && \ K_1 &= H(K_0) &&= H(R) \ K_2 &= H(K_1)&&= H(H(R)) \ \vdots &\qquad\vdots && \qquad\vdots \ K_n &= H(K_{n-1}) &&= H^n(R) \end{aligned} $$ 如果這被正確實現並且之前的密鑰總是被完全銷毀(可能只保存在 RAM 中)那麼我相信這可以提供完美的前向保密假設客戶端和伺服器可以安全地交換初始隨機值(想法是這些通過 QR 交換程式碼或類似機制)。
與互動式 Diffie-Hellman 相比,我知道這種方法的唯一缺點是,如果伺服器或客戶端在此系統中受到威脅,則使用其中的資訊可能會導致被動攻擊,而不是互動式 (MITM) 攻擊。
我懷疑這是一個新的或獨特的想法,但只是在我嘗試實施之前尋找一些人來支持這個想法。我想知道是否有人對我可能錯過的其他事情有任何想法,或者我是否是災難性的錯誤,這根本行不通。
一個可能的缺陷是,如果使用任何 $ K_j $ 允許它洩漏,所有以後的安全性都將失去。這使得 $ K_j $ 在某些用途中明顯不適合,例如直接作為短消息的密鑰流。
這 $ K_j $ 必須足夠寬,以至於在推導它們時幾乎不可能達到一個循環。對於轉換為的合理參數 $ n^2<2\cdot|K_j|\cdot\epsilon $ , 在哪裡 $ \epsilon $ 是一個小的可接受的剩餘風險,並且 $ |K_j| $ 是位寬 $ K_j $ . 如果 $ K_j $ 是一個 128 位密鑰,十年內每微秒 100 個密鑰,我得到 $ \epsilon\approx2^{-19.4} $ . 當某些要求規定非常低時,這可能是一個問題 $ \epsilon $ , 像 $ 2^{-40} $ .
上述兩個可以用一個寬密鑰(和散列)來解決,使用諸如HKDF或其中之一的密鑰派生函式派生為工作密鑰(可能更短) ,最好不要使用與用於派生的散列函式相同的散列函式這 $ K_j $ .
另一種:如果對手只能測試一個候選鍵 $ K_j $ 成本相對較高 $ C_0 $ ,並且在一些可以想像的用途中 $ K_j $ 就像一個已知常量塊的加密,一個嘗試蠻力的對手,並且散列的成本最低 $ C_1 $ 從如何獲得巨大的速度提升 $ K_j $ 是派生出來的;就像是 $ \mathcal O(\min(n,C_0/C_1)) $ ,忽略每個雜湊的記憶體獲取成本。這可以通過使用來解決,以便導出 $ K_{j+1} $ 從 $ K_j $ ,而不是散列,是一個慢速密鑰拉伸函式,例如scrypt或較小的PBKDF2,具有成本參數,使得 $ C_1\approx C_0 $ .
我立即想到的最後一個:接收者必須忘記目前 $ K_j $ 僅在驗證下一個之後,或者如果失去的消息是假設的一部分,則在稍後的某個之後。在後一種情況下,限制可以跳過的連續消息的數量可能是一個好主意,否則就會出現微不足道的拒絕服務攻擊。