2016-01-13 26 views
0

我明白hash並不是簡單地使用上生成的數字數學可逆的,但我不知道是否有可能有足夠的信息來成功地扭轉哈希,準確地恢復,我開始用的信息。是否有足夠的信息來反轉散列?

例如,我有一個文件,我通過md5()運行它,並得到了6513F99D206D8714EA9EAA4A1EEA8538,然後我添加一些可預見的垃圾文件的底部,並再次運行它得到CBB04474C52FF68F6B2AC38A9A8356A5

因爲我來自同一個文件中的兩個不同的校驗,我確切地知道在文件末尾的垃圾是什麼,會是現在有足夠的信息來縮小可能的答案只有一個?

顯然,這不是出於安全實用,但我對這種特定情況下非常好奇,是否有(或曾經可能)足夠的信息以數學扭轉哈希值。

+1

*「現在是否有足夠的信息來縮小可能的答案,只有一個?」 - - 你究竟想要弄清楚什麼?如果文件內容已知並且垃圾已知,那麼目標是什麼? –

+0

@Artjom B.最終,我想知道是否可以通過數學正確地顛倒散列。我想這不是關於哈希中包含的信息,只是它可以恢復的事實。 – DFR

+2

我會說,這不可行,但這可能取決於哈希函數。如果你有一個特定的哈希函數和一個明確的問題陳述,那麼你可以問[crypto.se]。 –

回答

2

讓我們從基礎開始。如果文件比散列長,那麼它包含比散列更多的信息,並且不能從單個散列恢復它。如果它更短,並且你知道這個事實,那麼在理論上你可以恢復它,例如通過嘗試所有可能的文件達到這個長度。很可能你只會有一場比賽。

爲了更加精確,您不必談文件長度,但熵。如果你知道該文件只是可打印的字母,那就排除了很多候選人。如果它是可讀的文本,那麼更是如此。所以一般的規則是,如果文件的熵小於散列值,你可以希望恢復文件。而且你必須知道這是真的,否則你不能真誠地排除長文件導致相同散列的可能性。

所有他的上方約一個哈希會談。現在你追加垃圾並計算另一個散列。最多會使散列中包含的信息量翻倍。之後,這是同一場比賽。你不能期望恢復比兩個哈希中可以包含更多的信息。通常不是很多。

+0

_「如果文件比散列長,那麼它包含比散列更多的信息,並且不能從單個散列中恢復它。」_這個參數聽起來很明顯,但是在泛化時不穩定。大多數文件也比ZIP壓縮文件長,但後者包含相同(甚至更多)的信息。 – Dubu

+1

@Dubu:你說得對:我故意過度簡化以獲得核心信息。這就是爲什麼第二段通過談論熵來使這更精確的原因。即便如此,自從afaik以來,以上所有內容都受到一些「一般」暗示。沒有任何理論可以排除某些特定散列值只有一個前像的可能性,不管輸入長度如何,即使我認爲這是非常不可能的。但是在長度受限的輸入空間中哈希分佈也可能會出現偏差,所以是的,上面的內容並不精確,但試圖訪問。善意的謊言。 – MvG

1

目前接受的答案並不完全正確。真正的答案是它取決於。首先,回想一下哈希函數將所有二進制序列集合映射到有限集合,通常是一組固定長度的序列,稱爲哈希長度。因此,該函數不能是1對1的值 - 也就是說,必須有多個輸入映射到的函數的一些輸出。所以一般來說,不能有一個算法將散列映射到生成散列的輸入,因爲這個過程沒有很好的定義(沒有明確的答案)。

幸運的是,您正在詢問如何顛倒特定輸入的哈希函數,因此實際上可能是這樣。雖然哈希函數不是1對1,但可能只有一個輸入映射到的某個輸出。如果你的輸入是一個這樣的輸入,你是運氣和一個暴力算法枚舉所有二進制字符串,散列每個,並輸出第一個二值字符串哈希到正確的值將返回正確的答案。也有可能您有一些關於輸入的附加信息。例如,你可能知道它是語法的英文文本或有效的HTML文檔。即使存在多個映射到給定散列值的輸入,也可能只有一個格式正確且大小適合硬盤的輸入映射到該散列值。在理想的情況下,你有一個候選文件的集合,你知道你的文件在其中 - 在這種情況下,幾乎可以肯定的是最多隻有一個哈希值到給定的值,並散列每個這樣的文件,直到哈希匹配正確的值會得到正確的答案。

壞消息是,雖然可能理論上可能顛倒散列值,但密碼散列函數的設計使得這個過程非常低效。如果你無法將輸入空間縮小到很小,那麼你可能需要運行一個大規模的暴力破解過程,在宇宙熱量死亡之前不會完成。