將密碼轉換為雜湊函式
這是理論上的問題。我想知道這是否可能(以及最終的後果是什麼),而不是我要在我的一個項目中這樣做。;)
創建的第一個散列函式基於對稱密碼(就像第一個 Unix crypt是基於DES一樣)。這個想法很簡單。使用密碼作為密鑰來編碼一個常量。
我想知道是否仍然可以將任何現代對稱密碼轉換為散列函式(第二個問題:轉換為加密散列函式)。當您有編碼和解碼的消息時,是否可以(更容易)猜出密鑰?
我們不僅可以將分組密碼轉換為散列函式,而且還可以。
通常的散列函式(MD5、SHA-1、SHA-256…)使用依賴於分組密碼E的Merkle-Damgård 結構。執行狀態r被初始化為正常值。然後將輸入數據分成若干塊,每個塊用作分組密碼的密鑰:r用E加密,使用目前塊作為密鑰;結果與r相加(或異或) ,這將為下一個塊產生新的狀態r。最後獲得的狀態是雜湊輸出。
如果要將 Merkle-Damgård 構造應用於AES等標準分組密碼,您將遇到以下問題:
- 內部狀態的大小是雜湊輸出的大小,也是密碼的塊大小。AES 是 128 位分組密碼,導致 128 位輸出,這對於當今的技術來說有點太小了(這意味著最多只能抵抗 2 64次評估的衝突,這是昂貴但可行的)。
- MD 結構運用了分組密碼的不同尋常的特徵。特別是,輸入數據被用作key,並且衝突攻擊(雜湊函式的主要關注點)對應於對底層密碼的相關密鑰攻擊。當分組密碼被用於它們的設計目的時,相關密鑰攻擊對它們來說不是問題,即加密。眾所周知,AES在相關密鑰方面有輕微的弱點,但這對加密來說不是問題。如果在基於 MD 的散列函式中使用 AES 作為建構塊,這將成為一個問題。(抗相關密鑰攻擊不是 AES 競賽的設計標準。)
因此,基於 MD 的散列函式使用自定義分組密碼,這些密碼被設計為對相關密鑰攻擊特別健壯(或者,至少,我們希望如此)。在 SHA-1 的情況下,內部分組密碼擁有自己的名稱SHACAL。
另一個例子是Whirlpool,它基於塊密碼“W”,這是一種具有更大塊大小(512 位)的 AES衍生產品,並改進了密鑰計劃,使其對相關密鑰更加強大(不幸的是,它也使它變得更慢)。這解決了上面解釋的問題。(Whirlpool 沒有使用 Merkle-Damgård 結構,而是使用了 Miyaguchi-Preneel,這是一種具有自身特點的獨特結構。)
另一個例子是Skein,它是 SHA-3 候選者之一。它建立在一個名為 Threefish 的內部分組密碼之上;再次,具有大塊的分組密碼(“標準”Skein 中的 512 位,可擴展至 1024 位)。
一些 SHA-3 候選者沒有重用 AES,而是重用了 AES的一部分;特別是 ECHO 和 SHAvite-3。這個想法是能夠使用旨在加速 AES 的硬體優化散列函式,尤其是最近 x86 處理器的AES-NI操作碼。但這並不是重用分組密碼本身。
必須記住的是,從分組密碼中建構散列函式是困難的。這不是相同的使用上下文。一個根本的區別是,分組密碼有一個攻擊者不知道(並試圖猜測)的密鑰,而散列函式沒有秘密(當試圖建立衝突時,攻擊者知道散列函式中每個操作的所有資訊) )。