在海綿函式的第一輪中吸收 r + c 位
在標準海綿結構中,
r
在每個吸收步驟中都會消耗比特,並且它們與c
容量比特連接在一起。在第一輪中,容量位為 0,因此r
輸入位只是零擴展。我們可以r + c
在第一輪消耗比特,同時保持隨機海綿的安全特性嗎?直覺地說,似乎容量位在第一步中沒有任何作用,因為沒有需要傳播前一輪的狀態。不過我的直覺可能是錯誤的。
如果它是有效的,這種優化將在 SNARK 程式中特別有用。例如,如果我們將兩個欄位元素壓縮為一個,這將讓我們使用兩個欄位元素的狀態寬度而不是三個。
以下是如何使用您的修改創建第二個原像。
我們假設原始消息至少是 $ 2r+c $ 位長,由一個初始消息段組成 $ M_0 $ ( $ 2r+c $ 位)和消息的其餘部分 $ M_1 $ .
處理塊後 $ M_0 $ ,海綿狀態會有些設定,跟大眾 $ r $ 某個值的位 $ R_0 $ 和容量 $ c $ 某個值的位 $ C_0 $ .
連接值 $ R_0 $ 和 $ C_0 $ 作為初始塊,然後將其添加到 $ M_1 $ , 給 $ R_0 || C_0 || M_1 $ .
散列時,海綿結構將採用 $ R_0 $ 和 $ C_0 $ 位並將初始 Sponge 狀態設置為與初始處理後的狀態完全相同 $ M_0 $ . 然後,它將處理消息的其餘部分 $ M_1 $ ; 因為狀態是相同的,它會執行相同的操作,並生成相同的散列。
並且,由於兩條消息的長度不同,消息也不同,因此我們生成了第二個原像。
此後,OP 詢問了輸入長度是否固定的安全性。好吧,如果輸出的長度 $ n $ 最多是 $ r $ (即一個擠壓週期),那麼很容易產生原像。該方法很簡單;你從最終狀態開始(已知 $ n $ 位在 $ r $ 區域),並為其他任意選擇值 $ r+c-n $ 狀態位。然後,您向後執行散列(使用逆排列和中間消息塊的任意設置)直到達到初始狀態,然後您選擇一條消息,其中第一個 $ r+c $ 位是初始狀態,其餘消息塊是您選擇的任意消息塊。
如果我們有 $ n > r $ ,這仍然可以用於將查找原像的工作量減少 1 倍 $ 2^r $
底線:SHA-3 的整個安全性來自容量位;讓對手任意選擇它們會使事情變得糟糕……