Stream-Cipher

基於雜湊的流密碼,其中輸入是常量、密鑰、隨機數和計數器

  • June 2, 2020

這是一個出於好奇的問題!

散列函式產生的輸出被認為在計算上是不可行的。

為了便於說明,讓我們考慮一個久經考驗的雜湊函式,如 SHA 256,屬於任何家族(2 或 3)。由於 SHA 256 的塊大小為 512 位或 64 字節,我們可以按照 ChaCha20 流密碼的啟發按照以下方式填充它。

cccc cccc cccc cccc kkkk kkkk kkkk kkkk kkkk kkkk kkkk kkkk bbbb nnnn nnnn nnnn

c- 一些固定常數 k- 鍵 n- 隨機數 b- 計數器(32 位)

每個字母字元串對應一個字節

注意:可以為 nonce 字節犧牲常量,從而促進位長 >= 128 位的隨機 IV。計數器也可以以同樣的方式支持 64 位。

我們可以生成 $ 2^{n} . (blocksize/2) $ 字節的偽隨機密鑰流,可以與明文異或得到密文,其中 $ n $ 是計數器的位長, $ blocksize $ 是使用的散列函式的塊大小(以字節為單位)。在這種情況下 $ blocksize $ SHA 256 是 64…

讓使用的計數器為 $ n $ 位。有 $ 2^{n} $ 計數器的可能值。由於散列函式的輸出是 $ blocksize / 2 $ 計數器的任何單個值的字節,該方案最多可以生成 $ 2^{n} . (blocksize/2) $ 字節。

這裡 $ n = 32 $ 所以我們得到, $ (2^{32}) . (64/2) $ 字節。

我意識到,給予 $ x $ 輸入字節(其中 $ x $ = len(constants) + len(key) + len(nonce) + len(counter)) 並得到 $ x/2 $ 考慮到雜湊函式必須再次執行(對於每個大小為 $ x $ , (大小的附加數據 $ x $ )) 帶有 MD 投訴填充資訊(字節0x80後跟 $ 55 $ 空字節,和 $ 8 $ 字節長度編碼)。對於每次呼叫流生成函式,這可能會花費雙倍的 CPU 時鐘週期。

在 SHA 256 的情況下 $ x = 64 $ 字節。

此外,與其他可用的流密碼(如 Chacha20 / Salsa20)相比,此方案效率極低!

但,

  • 這是一個好方案嗎?
  • 該協議中可能存在哪些安全漏洞(理論/實現)?
  • 如果這是安全的,這個方案可以提供 $ 256 $ 位安全?
  • 對這個方案有哪些可能的量子攻擊?
  • 由於 SHA-256 系列雜湊函式不受旁道攻擊,這會是一個額外的優勢嗎?

每一個建議和指導,將不勝感激!:)

當然,你可以做到這一點。正式地,散列函式的輸出不是直接為此設計的,但 SHA-256 的輸出無疑是隨機的,足以用作流密碼的基礎。實際上,ChaCha 和 Salsa使用基本相同的方法,但 PRF 不同(與使用分組密碼時的 PRP 相比)。

當然,魔鬼在細節中。隨機數(96 位)和計數器(32 位)相當短。除此之外,它們不遵循先擁有更多靜態隨機數,然後再使用計數器的慣例。有一個用於域分離的隨機數很好,但由於密鑰應該是完全隨機的,我想這個方案並不是嚴格要求的。

至於適用性:您沒有指定任何填充方案,而且您似乎使用的是完整的 512 位塊大小。這意味著您應該有權訪問基於塊的低級 SHA-256 功能來實施該方案。否則,您將有兩個完整的 SHA-256 塊來執行一個 256 位輸出和一個具有填充和長度編碼的塊。然後輸出是最後一個塊操作的輸出(這也取決於第一個塊操作,因為狀態保持不變)。因此,在這種情況下,與使用完整 SHA-256 時至少使用普通流密碼相比,您將有 4 倍的缺點。

如果您使用塊大小,那麼您可以為起始狀態定義單獨的 SHA-256 常量,而不是嘗試將它們硬塞到輸入塊中。

通常雜湊函式不使用表查找,並且應該相對安全地抵禦側通道攻擊。當然,旁道攻擊是依賴於實現的,所以這個細節並不是任何系統的最終結論。


一個小提示:雖然是合乎邏輯的,但輸出與通用散列函式的輸入塊大小並不完全相關。所以指定 $ n / 2 $ 因為輸出大小對我來說有點奇怪。

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