可以使用可逆雜湊算法作為壓縮函式嗎?
正如我們所知,任何對 SHA-256 的輸入都將作為 64 十六進制長度的輸出返回。是否有可能創建一個可以做與 SHA-256 相同的事情但可以反轉的雜湊,所以如果我們有 64 長度的十六進制數的輸出,我們可以反轉它並開始像“我喜歡程式”這樣的輸入?這將是一種很酷的壓縮大文本的方法。可能嗎?
嚴格來說,所有散列函式都在壓縮,因為輸出可能小於輸入,但我想您是在詢問壓縮以後可以無損解壓縮的數據。
**由於鴿巢原理,這是不可能的。**雜湊算法的固定輸出空間小於輸入空間的事實意味著對於相同的輸出總是會有多個可能的輸入。即使您可以找到原像(即“反轉”雜湊),您也不知道它是原始原像還是只是原像。如果輸入大小足夠小(小於散列),那麼它可能是可能的,因為您可以丟棄較大的原像並只保留非常有限數量的有意義的小原像(例如,只有有效的 ASCII 字元串),但它不是壓縮.
作為一個極端的例子,想像一個帶有簡單原像攻擊的“散列函式”:具有多項式 x + 1(即偶校驗位)的 1 位 CRC。如果我給你這個函式的輸出並且輸出是 1,你將完全不知道輸入是什麼。您可以計算輸入,但找不到輸入。對於 1 位雜湊,輸入空間中所有可能輸入的一半映射到相同的輸出!
這種不可能是Schneier Facts 中流行笑話的基礎:
對於 Bruce Schneier,SHA-1 僅僅是一種壓縮算法。
- 如果問題是關於(目前形式)
可逆加密雜湊函式
然後不!
加密安全散列函式的單向屬性將防止這種情況發生。雜湊函式不使用鍵。因此,如果您可以反轉,那麼每個人都會反轉並且根本不會有安全的雜湊函式。
此外,在數學上也是不可能的;散列函式使用任意大輸入來消化固定大小 $ \ell $
$$ H:{0,1}^* \to {0,1}^\ell $$
可逆性需要 1-1 和 on,如果函式不是 1-1,則不能反轉函式,而且很明顯,加密雜湊函式不是 1-1,因為固定輸出大小。1-1 是密碼散列函式的一個壞屬性,所描述的是一個排列。
用鴿洞原理可以清楚地看到這一點;你有少量的洞用於任意編號的鴿子。因此,至少一個洞會包含不止一隻鴿子。當你嘗試映射回來時,你會選擇哪隻鴿子?失敗!
此外,加密雜湊函式需要修改輸入以縮小輸出,這會導致and 操作失去資訊( $ \wedge $ ) 是不可逆的。
因此,您需要的與我們想要的加密安全雜湊函式正好相反。原圖會失敗!
- 如果問題是關於(第一次修訂)
可壓縮加密;
然後不!
與散列函式不同的加密方案是可逆操作。因此,輸出空間必須至少與輸入空間相同。
如果要壓縮,請在加密前進行。解密後就可以解壓了。
$$ c =E_k(compress(m)) \quad \text{ and } m =decompress(D_k(c)) $$
但是,請注意,加密之前的壓縮可能會出現問題,如CRIME(壓縮比資訊洩漏變得容易);
CRIME (Compression Ratio Info-leak Made Easy) 是一種針對秘密 Web cookie 的安全漏洞,它使用 HTTPS 和 SPDY 協議進行連接,這些協議也使用數據壓縮。當用於恢復秘密身份驗證 cookie 的內容時,它允許攻擊者在經過身份驗證的 Web 會話上執行會話劫持,從而允許發起進一步的攻擊。CRIME 被分配了 CVE-2012-4929。
原始論文 - 2002 - John Kelsey -壓縮和明文資訊洩漏
以及後續的BREACH
BREACH(反義詞:Browser Reconnaissance and Exfiltration via Adaptive Compression of Hypertext)是在使用 HTTP 壓縮時針對 HTTPS 的安全漏洞。BREACH 是基於 CRIME 安全漏洞建構的。安全研究人員 Angelo Prado、Neal Harris 和 Yoel Gluck 在 2013 年 8 月的 Black Hat 會議上宣布了 BREACH
正如Hola所指出的,另一個問題是實現無側通道壓縮。如果存在側通道攻擊的可能性,人們也可以考慮這一點。
因此,如果您想在加密之前使用壓縮,請認真分析您的決定。
具有諷刺意味的是,由於安全性,現代加密方案會做相反的事情(增加一點大小)。塊/流密碼需要 IV/nonce 來實現 Ind-CPA 安全性。AES-GCM 和 ChaCha20-Poly1305 等現代加密方法模式會產生一個身份驗證標籤,它也會增加輸出大小。