2009-06-15 137 views
1

假設我有兩個字符串(或字節數組)A和B都具有相同的散列(散列我的意思是像MD5或SHA1)。如果我連接在它後面的另一個字符串,A + C和B + C是否也具有相同的散列H'? C + A和C + B會發生什麼?散列衝突和附加數據

我使用MD5進行了測試,在我的所有測試中,在最後添加了一些使散列相同的內容,但是在開頭附加的內容並沒有。

這是否始終如此(對於所有輸入)?

對於所有(衆所周知的)散列函數,這是否正確?如果不是,是否存在(衆所周知的)散列函數,其中A + C和B + C不會發生衝突(並且C + A和C + B也不會)?

(除了從MD5(x + reverse(x))等構成的東西,我的意思是)

回答

0

這對哈希函數依賴完全。而且,你碰到這種碰撞的可能性非常小。

+0

所以,你知道任何引用列出它的幾個哈希函數? – mihi 2009-06-15 14:50:55

2

詳細取決於散列函數H,但通常它們的工作方式如下:

  1. 消耗輸入X(比方說,512位)的塊
  2. 打破輸入成小塊(比方說,32基於輸入比特)和更新散列內部狀態
  3. 如果有更多的輸入,則轉到步驟1
  4. 在結束時,吐出的內部狀態作爲出的散列值H(X)

因此,如果A和B發生碰撞,即H(A)= H(B),則散列在消耗後將處於相同的狀態。用相同的輸入C進一步更新狀態可以使結果散列值相同。這解釋了爲什麼H(A + C)有時是H(B + C)。但它取決於A和B的大小如何與輸入塊大小以及哈希如何在內部中斷輸入塊。

如果C是散列塊大小的倍數,C + A和C + B可以是相同的,但可能不是。

+0

我不同意這個描述。如果A和B(不同的輸入)在特定的哈希計算中發生碰撞,他們會這樣做,因爲它們已經運行了不同的「內部」狀態,它們已經達到了相同的最終計算(通過一個非常怪異的機會,只要我們有一個好的哈希函數)。 – nik 2009-06-15 15:05:15

+0

現在,如果一個額外的輸入C被添加到兩個輸入的前綴或後綴中,那麼在計算序列中看到的這些「內部」狀態應該顯着改變,不會達到(A,C)和(B,C)的最終計算結果。其中(X,Y)代表Y前綴或後綴X. – nik 2009-06-15 15:07:31

0

這裏討論的散列函數通常是密碼(SHA1,MD5)。這些哈希函數有一個Avalanche effect - 隨着輸入的輕微變化,輸出將發生急劇變化。

C的前綴和後綴擴展名將有效地提供更長的輸入。 因此,向輸入的前面或後面添加任何內容都會顯着改變有效散列輸出。

我不明白你是如何做MD5檢查的,這裏是我的測試。

echo "abcd" | md5sum 
70fbc1fdada604e61e8d72205089b5eb 

echo "0abcd" | md5sum 
f5ac8127b3b6b85cdc13f237c6005d80 

echo "abcd0" | md5sum 
4c8a24d096de5d26c77677860a3c50e3 

你是說,你位於兩個輸入其中有相同的MD5哈希值,然後附加一些東西到輸入的結束或開始和發現,添加在最後導致相同的MD5作爲原始輸入?

請提供樣品與您的測試結果。