Hash

破解在重複雜湊後下降到單個值的雜湊

  • November 8, 2015

假設我有一個散列函式(如下面的那個)和一個密碼,並且我知道如果我一遍又一遍地對任何字元串進行散列,它最終會下降到一個唯一值。

有沒有已知的方法可以按照這種模式破解雜湊函式?此屬性是否適合任何可利用的漏洞?

雜湊函式(在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 是一個強雜湊函式),但重複應用這個雜湊函式最終會在空字元串處循環。

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