Hash
Pi如何構造MD2雜湊函式S-table?
為了好玩,我正在學習更多關於密碼學和散列的知識。我正在按照 RFC 1319 ( https://www.rfc-editor.org/rfc/rfc1319 ) 實現 MD2 雜湊函式。我會先說我知道有庫,我知道這是一個舊的雜湊,我不打算在任何現實世界中使用它,所以不要驚慌失措。
在學習 S 表時,我注意到 MD2 使用基於 Pi 的 S 表。我不明白的是,這些數字與 Pi 有什麼關係。奇怪的是,我找不到任何描述它的地方。RFC 只是說:
此步驟使用從 pi 的數字構造的 256 字節“隨機”排列。
在參考程式碼中,有如下註釋:
從 pi 的數字構造的 0..255 的排列。它給出了一個“隨機”的非線性字節替換操作。
查看前幾個字節:
41, 46, 67
我看不出你是如何從 Pi 獲得這些數字的。我試過查看 Pi 的二進製表示,這些數字似乎與 pi 的第一個字節不匹配。
我通常的Google搜尋只是讓我回到 RFC 或其他似乎完全複製上述評論的實現。我在哪裡可以找到解釋 Pi 建構此表的位置。
我給 Ron Rivest 發了一封電子郵件,得到了回复。
的位數 $ \pi $ 用作Durstenfeld shuffle中使用的一種隨機數生成器(另請參見 Knuth vol 3, sec 3.4.2)。
下面是一些根據他發給我的描述和程式碼改編的虛擬碼。
S = [0, 1, ..., 255] digits_Pi = [3, 1, 4, 1, 5, 9, ...] # the digits of pi def rand(n): x = next(digits_Pi) y = 10 if n > 10: x = x*10 + next(digits_Pi) y = 100 if n > 100: x = x*10 + next(digits_Pi) y = 1000 if x < (n*(y/n)): # division here is integer division return x % n else: # x value is too large, don't use it return rand(n) for i in 2...256: #inclusive j = rand(i) tmp = S[j] S[j] = S[i-1] S[i-1] = tmp
該
next
函式僅遍歷 pi 的數字。你會注意到它rand
沒有使用一些可能的輸出。Rivest 博士說,使用這些值不會給出均勻分佈,因為它們太大了。