2015-12-27 60 views
0

我知道是不可能解密MD5哈希。但是,我正在嘗試解決一個謎題遊戲,並且很多提示都使用MD5加密。由於我在谷歌上找不到一些加密的文字,我想知道是否有可能製作一個C++程序來存儲常見的英文單詞和它們的加密,並且在給定特定的加密時搜索答案。「解密」MD5在c + +

編輯:提示是單詞,而不是短語。

+1

提示不可能存儲爲MD5散列,因爲程序將永遠無法恢復它們。你是如何得出這個結論的? – sinelaw

+0

也許而不是提示你的意思是「答案」?如果用戶必須輸入完整的答案並且程序只是檢查它是否正確,那麼可以使用散列函數(例如MD5)。但是,如果您指的是向用戶顯示的提示,則它們必須以不同的方式存儲。 – sinelaw

+0

@sinelaw提示的單詞被加密爲MD5哈希值,而不是完整的短語。 –

回答

3

這不是一個加密,它是一個安全的散列函數:它被設計成只有一種方式。並且沒有辦法給出一個散列來告訴它原始輸入字符串包含一些單詞;你需要完整地猜測整個提示,否則你不會得到任何信息。

但是,如果提示只是單詞,那麼您肯定可以建立候選單詞散列表並在其中搜索給定的散列表;那會很容易。

2

如前所述,散列是一個不可逆轉的數學函數。所以不可能「解密」散列。

但是,正如您猜測的那樣,計算可疑結果的哈希值並將其與哈希值進行比較是完全正確的。在現實世界的場景中,會有一個salt用於使這不可能,但由於這是一種測試,因此可以使用rainbow table

+1

隨時留下評論爲什麼你認爲這是「沒用」。沒有反饋,我無法改進帖子。 – nvoigt

-1

MD5哈希是,就像這個詞所說的一種散列函數。散列函數是一種將輸入顯示在更小的輸出範圍上的函數。這也是單向函數,這是不可能的「dehash」東西

一個例子:

輸入:所有可能的字符 輸出:0到100萬之間的數字。

(100萬肯定是不夠的,見http://www.oxforddictionaries.com/words/how-many-words-are-there-in-the-english-language

所以說你是散列文本,每一個字可以在許多被顯示。哈希函數通常不保證一個單詞不會顯示在同一個數字上。但是由於有更多的單詞沒有意義,散列函數將在大多數情況下工作

+0

散列函數的概念不僅僅是爲了縮短,事實上我很多情況下它被用於相反的情況,比如從短密碼派生加密密鑰。 – zaph

+0

據我所知,散列函數用於將對象或其他輸入投影到一個小值,因此可以更緊湊地存儲。這至少在散列表中完成,其中散列函數的結果遠小於輸入 – Houbie

+0

@SimonHoubracken:再小的輸出範圍,情況並非如此。例如,假設使用以16位整數爲鍵值的散列表,您可能需要一個散列函數,該函數在整個表中僞隨機地但可重複地散佈密鑰(例如,以最大限度地減少惡意用戶設計將會發生衝突的輸入的能力)。如果你正在使用閉散列化/開放尋址,並且隱約地使用所有65536個可能的鍵,你可能需要說100k桶,並且你需要一個至少有100k個可能值的散列函數來遍歷整個元素(例如一個32位散列用於16位輸入)。 –

0

解密散列的方式是根據字符串生成一個散列,並將結果與​​您擁有的散列進行比較。

如果你知道例如遊戲只使用字母,那麼你可以創建一個包含字母表的所有組合的表,獲取這個數據庫並使用MD5對它們進行散列,然後將它們與您擁有的散列進行比較。

你可以用你想要的任何編程語言來做到這一點,只需google:md5 hash「language」。你會發現一個準備使用哈希函數。然後,你就必須寫:

  • 代碼生成的可能的字的數據庫,
  • 哈希那些話
  • 比較,你有

希望這有助於在一個哈希。