Protocol-Design

基於 SHA-256 的流密碼

  • January 7, 2021

任何人都可以評論這裡描述的流密碼 是否安全?作者聲稱它是牢不可破的,但沒有提供任何證據或證據來支持這一點。為了完整起見,我複制了下面的算法。

加密常式(Alice $ \to $ 鮑勃)

  1. 計算共享密鑰: $ s= $ Curve25519(Alice_private_key, Bob_public_key)
  2. 計算 N 個種子 $ s_1,\dots,s_n $ :

$$ s_0 = \mathrm{SHA256}(s);\quad s_n = \mathrm{SHA256}(s_{n-1}) $$ 3. 計算 N 個鍵 $ k_1,\dots,k_n $ :

$$ k_n = \mathrm{SHA256}(\overline{s_n}) $$ (在哪裡 $ \bar{s} $ 是按位恭維 $ s $ ) 4. 通過 xor 加密明文:

$$ c_n = p_n \oplus k_n $$

收到後,鮑勃通過重複相同的步驟來解密密文,除了他導出共享秘密 $ s $ 使用他的私鑰和 Alice 的公鑰。

一些簡短的想法:

共享秘密生成:

$$ s=E_a(B)=E_b(A) $$ 共享密鑰是通過使用您的私鑰加密其他使用者的公鑰來生成的。這實際上是一個 ECDH 步驟,非常合理,也是 C25519 的主要目標之一 $ ^{[1]} $ . 密鑰生成:

$$ s_0=\mathrm{SHA256}(s); s_i=\mathrm{SHA256}(s_{i-1}) $$ 首先,使用上面的定義,它們生成種子。這似乎不是一種將一顆種子擴展到許多種子的不合理方式。 $$ k_n = \mathrm{SHA256}(\overline{s_n}) $$ 是的,我很高興 $ k_n $ 應該看起來很隨機。 Xor 組合器: 這一點也不無道理,大多數流密碼都使用這種技術將其流與明文組合。

總體? 假設第一步所需的關係成立,我不確定和懷疑,那麼第一印像是這個方案應該沒問題。歸根結底,它基本上是使用ecdh來播種 $ \mathrm{SHA256} $ - 基於流密碼。從密碼學上講,這意味著它充其量只能具有這些原語中最弱的安全界限。雖然這當然不是真正的“牢不可破”,但它應該在計算上是安全的。但是,它還有一些更重要的問題無法通過“它是否安全”來解決?我現在會注意其中的一些…

密鑰重用 正如原作者所指出的,該方案僅生成一個密鑰流,由兩個公鑰通過 ECDH 步驟播種。重用異或密鑰流的危險是嚴重的——它會洩露明文的異或,這通常足以讓完全中斷:

$$ c_a=m_a\oplus K;c_b=m_b\oplus K \implies c_a\oplus c_b = m_a\oplus m_b $$ 這可以通過在原始步驟中添加一個隨機數來解決,這可以說是該方案的最大問題。那是, $$ s_0=\mathrm{SHA256}(s||N) $$ 在哪裡 $ N $ 是一個隨機數,儘管它不一定是不可預測的。 我為什麼要在乎? 這是大多數自製計劃的最大問題。除非一個方案可以證明比現有的其他方案有一些優勢,否則我為什麼不直接使用這些方案呢?在這種情況下,考慮到 SHA 呼叫的數量,它不會特別快,由於生成流的遞歸性質,並行化也不是很好,畢竟它只是一個基於 xor 的流密碼。請參閱此問題,了解為什麼您應該始終認為至少 3 $ ^{[1]} $ 使用加密算法而不是經過身份驗證的加密算法之前的時間。


$$ 1 $$:感謝DrLecter對這一點的澄清。 $$ 2 $$: 在過去,人們常常被告知“三思而後行 $ x $ “。但是,正如我們都知道的那樣,很多人仍然這樣做了 $ x $ . 因此,我正在推動提高所需的“思考”數量。顯然,作為一名密碼學家,我希望至少獲得64 位安全性,但現在必須做到 3 個。

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