切換
舊版
前往
大廳
主題

ZeroJudge - a554: NCPC PG SHA-4 解題心得

Not In My Back Yard | 2019-07-25 23:22:39 | 巴幣 0 | 人氣 207

題目連結:


題目大意:
給定以下名為 SHA-4 的演算法:
其代表一種雜湊的演算法。輸入為長度為 5 字元的字串,輸出為 5 個 32 位元的整數。

給定一正整數,代表接下來有幾筆測試資料,每筆佔一列。每列給定 5 個 32 位元在十六進位制下的的整數值,代表已經雜湊過的值。

求雜湊前的 5 個字元。(原本的字元只能是字母與數字,即「0」~「9」、「A」~「Z」和「a」~「z」)



範例輸入:
4
0b8414f6 027eeb13 0453edaf 00f93379 002f2d88
0b8419b0 027eec17 0453ef3f 00f933f1 002f2da8
0b8459a5 027efa02 045406ff 00f93981 002f2f10
0b845578 027ef91a 04540577 00f93921 002f2ef8


範例輸出:
5dogs
9cats
fade4
cafe8


解題思維:
乍看之下是一個麻煩且難解的題目。

但是,我們有簡單的作法:
首先,我們將原本的雜湊演算法之 a 、 b 、 c 、 d 、 e 先不代值(讓他們先維持「原樣」,即 a = 「a」 , b = 「b」 ……)。接著我們就丟進迴圈裡迭代,可以發現第一次迭代後,
新的 a 值變為 4 × a + (b + c) + k+ word[0],其中 k = 0x5a82
新的 b 值變為 a
新的 c 值變為 8 × b
新的 d 值變為 c
新的 e 值變為 d

再繼續迭代下去,最後我們得到五個雜湊值依序為

h0 + 4 * (4 * (4 * (4 * (4 * (h0) + h1 + h2 + h4 + k + word[0]) + h0 + 8 * (h1) + h3 + k + word[1]) + 4 * (h0) + h1 + h2 + h4 + k + word[0] + 8 * (h0) + h2 + k + word[2]) + 4 * (4 * (h0) + h1 + h2 + h4 + k + word[0]) + h0 + 8 * (h1) + h3 + k + word[1] + 8 * (4 * (h0) + h1 + h2 + h4 + k + word[0]) + 8 * (h1) + k + word[3]) + 4 * (4 * (4 * (h0) + h1 + h2 + h4 + k + word[0]) + h0 + 8 * (h1) + h3 + k + word[1]) + 4 * (h0) + h1 + h2 + h4 + k + word[0] + 8 * (h0) + h2 + k + word[2] + 8 * (4 * (4 * (h0) + h1 + h2 + h4 + k + word[0]) + h0 + 8 * (h1) + h3 + k + word[1]) + 8 * (h0) + k + word[4]

h1 + 4 * (4 * (4 * (4 * (h0) + h1 + h2 + h4 + k + word[0]) + h0 + 8 * (h1) + h3 + k + word[1]) + 4 * (h0) + h1 + h2 + h4 + k + word[0] + 8 * (h0) + h2 + k + word[2]) + 4 * (4 * (h0) + h1 + h2 + h4 + k + word[0]) + h0 + 8 * (h1) + h3 + k + word[1] + 8 * (4 * (h0) + h1 + h2 + h4 + k + word[0]) + 8 * (h1) + k + word[3]

h2 + 8 * (4 * (4 * (4 * (h0) + h1 + h2 + h4 + k + word[0]) + h0 + 8 * (h1) + h3 + k + word[1]) + 4 * (h0) + h1 + h2 + h4 + k + word[0] + 8 * (h0) + h2 + k + word[2])

h3 + 8 * (4 * (4 * (h0) + h1 + h2 + h4 + k + word[0]) + h0 + 8 * (h1) + h3 + k + word[1])

h4 + 8 * (4 * (h0) + h1 + h2 + h4 + k + word[0])


當然,以上不用這麼辛苦地手動展開並打回電腦上。可以寫一個簡單的程式去按照原本演算法的迴圈迭代即可,如下:
先保存到電腦中的記事本或是任何可以鍵盤輸入的地方。要用到的時候再複製回來。

而我們可以看到最下面的雜湊值(也就是 h4 最後的值)只跟 word[0] (也就是M[0] - 32(32 為空格的 ASCII 編碼值))有關。因此我們可以窮舉 word[0] 可能的值,即題目允許的那 62 個字元。

word[0] 求得之後,換窮舉 word[1],再換 word[2]……以此類推。

最後將 word 陣列裡的 5 個值都加 32 回去即為 M 陣列,也是題目的所求。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作