如果知道雜湊的一部分,會失去多少原始熵?
- 你有一個
n
位的熵源- 例如,您使用 SHA-512 對其進行雜湊處理
k
SHA-512 輸出的位被公開披露,但 SHA-512 雜湊也是需要保護的私鑰 (k<=512)問題是通過揭示/失去
k
散列中的位在原始熵源中失去了多少位?特別是:原始熵源的熵小於雜湊輸出大小。因為如果它與雜湊輸出更多或相同,那麼它將等同於
512-k
,問題是……如果它更少怎麼辦?
像 SHA-512 這樣的好的散列函式被認為表現得像一個隨機預言機,並且沒有透露任何關於它的輸入,但是如果源的潛在熵(更少的字節)小於散列輸出大小,那麼這可以被用作潛在的搜尋問題.
如果原始源的字節數少於散列輸出大小,並且這個字節數是計算上可行的搜尋問題(即 < 80 字節),那麼揭示 k 字節的散列相當於揭示多達 k 字節的輸入源,因為可以找到輸出的候選原像。
考慮在輸入源中顯示的雜湊字節數少於熵字節數的場景,將會有許多輸入映射到相同的縮寫雜湊輸出。然而,理想情況下,這些輸入將是來自輸入源的隨機分佈,並且在散列輸出大小等於輸入大小之前不會顯示任何源熵。
進一步擴展這個想法,很明顯輸入熵的一些東西被揭示了,因為隨著揭示的字節數接近輸入的字節數,可能的原像數量減少,這減少了熵,直到沒有並且我們有的階段(理想情況下)只有一個原像。
我對此建模並通過實驗發現對於 SHA512,對於已知的散列函式輸出的每個字節失去的輸入熵量大約(理想情況下)一個字節。這在定義加密雜湊算法的上下文中是有意義的。
例如
具有 6 位潛在熵的輸入值: $ 9840563 $
前 6 個 SHA512 半字節: $ 8ae967 $
$ 8: 1049140 \approx 2^{20} $
$ 8a: 65275 \approx 2^{16} $
$ 8ae: 4099 \approx 2^{12} $
$ 8ae9: 270 \approx 2^{8} $
$ 8ae96: 13 \approx 2^{4} $
$ 8ae967: 1 = 1 $
所以你有一個隨機字元串 $ Input $ 和 $ n < 512 $ 一點點的熵。把它想像成一場遊戲,對手在每一回合都會猜測 $ Input $ ,如果猜對了,那麼對手就贏了。自從 $ Input $ 有 $ n $ 熵位,平均而言,最佳對手將獲勝 $ 2^{n-1} $ 猜測。
所以現在讓我們通過計算來修改遊戲 $ Output = SHA512(Input) $ ,並顯示 $ k $ 位 $ Output $ 給對手。對手的目標仍然是猜測 $ Input $ ,但問題是他們成功的速度有多快。
讓我們考慮一下極限情況 $ k = 512 $ . 是的,所有的輸出散列位都暴露給了對手。如果 SHA-512 真的是 512 位原像抗性(如它所聲稱的那樣),那麼只給出 $ Output $ 平均需要 $ 2^{511} $ 猜測找到任何字元串 $ str $ 這樣 $ SHA512(str) = Output $ ,並且該字元串可能不是 $ Input $ . 但攻擊者可以直接猜測 $ Input $ 比那更快。然後我們得出結論,即使顯示完整的 SHA-512 輸出也不會讓對手更容易猜測 $ Input $ .
這聽起來可能非常出乎意料,但這裡發生了兩件事。首先,您沒有明確指定您的場景,所以我必須填寫空白,可能以與您的預期不同的方式。你問(我的粗體字):
問題是通過揭示/失去散列中的 4*k 位在原始熵源中失去了多少位?
也許你的意思是問類似這樣的問題:如果我們透露 $ k $ 雜湊輸出的位,剩餘多少熵 $ 512 - k $ 位的輸出有?
第二:Kerckhoff 原理。當我們這麼說 $ Input $ 有 $ n $ 熵位,我們隱含的假設是對手知道機率分佈 $ Input $ 從中採樣並可以使用這些知識來設計猜測其值的最佳策略。然後我的觀察是,揭示一個秘密值的整個摘要可以將其保密性保留到雜湊函式的原像電阻值。在這種情況下,輸入的保密性受假設的熵值的限制,該熵值低於 512 位。
有了這個,我們可以攻擊重新制定的問題:
- 如果我們透露 $ k $ 雜湊輸出的位,剩餘多少熵 $ 512 - k $ 位的輸出有?
假設任何 $ k $ SHA-512 的位截斷有 $ k $ 位原像電阻。在這種情況下:
- 如果 $ 512 - k < n $ ,那麼攻擊者猜出失去的雜湊輸出位會更快,因此它們的熵不能大於 $ 512 - k $ . 熵損失至少為 $ n + k - 512 $ .
- 如果 $ 512 - k ≥ n $ ,然後又因為原像抗性,攻擊者的最佳策略是猜測 $ Input $ 直接地。