Hash

如何使用已知或可猜測的塊破解用作流密碼的 sha256

  • May 21, 2022

使用 SHA-256 作為流密碼似乎存在加密弱點,但是,我不太確定如何在解密中實現它們。

假設我有一個使用 64 字節塊的加密函式。我用前一個塊的雜湊加密每個塊以生成我的密文。這裡的薄弱環節是,我知道,或者可以猜到第一個字節塊。

在下面連結的其中一篇文章中,我讀到:

我應該提到,如果您的消息中有任何完整的已知或可猜測的明文塊,那麼您的方案很容易被破壞,因為給定 pad(i) 任何人都可以計算 pad(i+1)。所以猜測一個明文塊,將其與密文進行異或以恢復可能的填充值,然後計算下一個填充值並查看該塊中恢復的密文是否有效。

誰能詳細說明這裡的確切含義?如果我知道第一個塊,我是否將它與散列的第一個塊進行異或?如果是這樣,那如何幫助我破解 H(prevHashedBlock + currentPlaintextBlock) 的下一個雜湊?

我知道這與散列狀態等有關,但我在網上找不到太多。

我已閱讀以下文章:

從加密雜湊函式建構流密碼是否可行?

SHA-256 作為 CTR 分組密碼是否安全?

如果在 CTR 模式下使用 SHA-256,則沒有這樣的弱點。ChaCha20 已經是以這種方式建構的。

您正在以連結方式使用 SHA-256 來輸出流以使用 x-or 加密消息;

$$ \begin{align} O_1 & = H(key) \oplus H(message)\ O_i & = H(O_{i-1}) \end{align} $$

然後使用 x-oring 執行加密 $ O_i $ s。

$$ C_i = P_i \oplus O_i $$

現在假設您有某個塊的已知明文 $ j $ . 這意味著你得到 $ O_j $

$$ O_j = P_j \oplus C_j $$

現在使用流產生方程

$$ \begin{align} O_{j+1} &= H(O_j)\ O_{j+2} &= H(O_{j+1})\ \vdots \quad & \quad\quad\vdots \ O_{j+t} &= H(O_{j+t-1})\ \vdots \quad & \quad\quad\vdots \ \end{align} $$

如您所見,您從該位置獲得了流輸出的其餘部分 $ j $ . 如果您擁有第一個位置,那麼您將獲得所有。

這是這種方案的弱點,另一方面,CTR 模式是為 PRF 設計的,通常使用一些好的散列函式對其進行初始化。


看圖

在此處輸入圖像描述

可以看到,如果你得到任何輸出 $ O_j $ 那麼您可以通過雜湊連結獲得其餘部分。

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