HITB GSEC CTF 2017 Crypto377: Hashinator Writeup

題目從 rockyou 裡面抽取一個 password 補至 128 字元,並使用給定的 hash function 把內容拼成 hash。我們需要從 hash 「解密」得到本來的密碼。

首先提供的代碼如下:

設 \(h_1, h_2, …, h_{32}\) 為 32 個 hash functions,及 \(l_0, l_1, …, l_{32}, r_0, r_1, …, r_{32}\) 為長度為 64 的字串。

如果 \((l_0, r_0)\) 為 hash function 的輸入,對於 \(k=1, 2, …, 32\),我們有:

\(l_k := l_{k-1} \oplus h_{33-k}(r_{k-1})\)\(r_k := r_{k-1} \oplus h_k(l_k)\) ---- [*]

整個 hash function 的輸出為 \((l_{32}, r_{32})\)。

問題是,如果我們知道 \(h_1, h_2, …, h_{32}\) 和 \((l_{32}, r_{32})\),怎樣可以得到 \((l_0, r_0)\)?

[*] 整理一下可得出,對於 \(k=1,2, …, 32\),我們有:

\(r_{k-1} = r_k \oplus h_k(l_k)\) 及 \(l_{k-1} := l_k \oplus h_{33-k}(r_k\oplus h_k(l_k))\)---- [**]

就是這樣,我們可以得到 \((l_0, r_0)\) 。

 


發表迴響