Hash

Pi如何構造MD2雜湊函式S-table?

  • May 23, 2021

為了好玩,我正在學習更多關於密碼學和散列的知識。我正在按照 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 博士說,使用這些值不會給出均勻分佈,因為它們太大了。

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