Hash
破解在重複雜湊後下降到單個值的雜湊
假設我有一個散列函式(如下面的那個)和一個密碼,並且我知道如果我一遍又一遍地對任何字元串進行散列,它最終會下降到一個唯一值。
有沒有已知的方法可以按照這種模式破解雜湊函式?此屬性是否適合任何可利用的漏洞?
雜湊函式(在python中):
def compute_hash(uinput): if len(uinput) > 32: return blen = 32 n = blen - len(uinput) % blen if n == 0: n = blen pad = chr(n) ninput = uinput + pad * n r = "" for i in range(0, blen, 4): s = ninput[i:i+4] h = 0 for j in range(len(s)): h = (h << 4) + ord(s[j]) g = h & 4026531840 if not(g == 0): h ^= g >> 24 h &= ~g r += chr(h % 256) h = "" for c in r: h += c.encode("hex") return h
這個特定的雜湊函式很弱;看起來這個散列函式所做的是將要散列的字元串填充為 32 字節字元串,然後獲取 8 個 4 字節子字元串,並將每個子字元串單獨映射到單獨的字節中。
這立即使查找原像變得微不足道。從一個隨機的 31 字節原像開始(如果提供 32 字節輸入,則程式碼中似乎存在錯誤),對其進行雜湊處理,並且對於錯誤的每個輸出字節,修改相應的 4 字節子字元串原像,並重複,直到雜湊是預期值。
但是,要回答具有特定屬性的散列函式是否一定是弱的這個一般性問題,我相信我們可以產生一個這樣的散列函式的例子,它不是。一個這樣的例子是:
- 給定空字元串,輸出空字元串
- 給定一個字元串 $ S $ 長度 $ L $ ,生成第一個 $ L-1 $ 位 $ SHAKE256(S) $
給定一個長輸入,這個函式看起來很強大(因為我們認為 SHAKE256 是一個強雜湊函式),但重複應用這個雜湊函式最終會在空字元串處循環。