比如WinRAR、veracrypt之類的加密軟體,在解密一個文件時,它是不知道正確的口令的,當用戶輸入一串口令後,它們會提示「口令正確」或「口令錯誤」,這是否意味著密文中隱含口令信息?是如何實現的呢?


這類問題一般有兩種解決思路,WinRAR正好都用過了。

  • 在WinRAR 4.x及以前的版本中,WinRAR是直接解密密文,然後檢查解密結果的格式是否符合RAR壓縮包應有的文件格式——比如開頭有沒有寫類型標識,文件里的各種表能不能讀出有意義的內容,等等。如果解密後出來的東西,是一團解析不了的垃圾的話,那就說明密碼不對,解密出來的根本不是個有效的RAR壓縮包。
  • 從WinRAR 5.x開始,WinRAR在加密後的壓縮包里附上了密碼的信息摘要(Digest),這東西形象來講就是一段信息的「指紋」。解壓的時候,WinRAR只要對比一下用戶輸入的密碼是不是有一樣的「指紋」,就能知道密碼是否正確了。這段指紋並不會泄露出原始的密碼,因為WinRAR使用的信息摘要演算法具有抗原像性(Preimage Resistant)。這是摘要演算法的一種數學特性,它意味著「攻擊者拿到輸出(摘要)之後也沒法反推出對應的輸入(原始密碼)」。

簡單總結一下的話:

  • WinRAR 4.x以前的壓縮包,裡面沒有任何有關密碼的信息,能不能通過驗證全看解密結果。雖然會浪費一些解密的時間,但是完全根絕了從壓縮包直接破解密碼的可能。
  • WinRAR 5.x及以後,裡面會附上一段密碼的信息摘要用作驗證。只要摘要演算法的抗原像性沒有被攻破,密碼本身就是安全的。

覺得本文有價值的話,歡迎點個贊支持一下。對信息安全感興趣的同學,也歡迎閱讀我寫的其他信息安全科普類文章:

  • 一個黑客能用一台手機做到什麼事情?
  • 指紋識別/指紋支付安全嗎?
  • 有什麼技術可以防止自己的產品被反編譯?
  • 如果把 AES、DES 等各種加密演算法排列組合,然後對一明文進行逐一加密,這樣的組合加密演算法強度大嗎?
  • 如何看待文章《量子加密驚現破綻》稱「上海交大團隊攻破量子加密」,以及潘建偉團隊對此的回應?


WinRAR 的方式幾個回答里已經說的很全了。

不過 VeraCrypt 又不太一樣。VeraCrypt 繼承了 TrueCrypt 的方式,在文件頭保存了一個加密後的固定字元串「VERA」(TrueCrypt 是「TRUE」)。當用戶輸入密碼的時候,軟體會先嘗試用密碼去解密這個字元串,然後看解密的結果是不是「VERA」。


簡單的方法是有的。你可以在文件開頭淫一首詩,然後加密保存了。你如果用用戶輸入的密碼解密了文件還是這首詩,你就可以假設密碼是對的,然後繼續往下做。


假設我是加密軟體,我會在文件里的一個根據壓縮協議可有可無的地方悄悄簽個名,比如「zippedByMinecraftFuns」,然後再加密壓縮

下一個人用我的軟體打開時,輸入密碼後我只要看看這個位置(文件首/尾)有沒有這個暗號就可以了

當然應該是有一個統一的口令的,不然就沒法兼容了


假設RAR解壓軟體裡面有一段程序,實現了功能F,

原文件內容為M

原文件加密後的內容為C

密碼為K

那麼,在壓縮的時候,計算一下

MAC = F(C,K)

並把MAC值寫到加密後的文件里。這個MAC值是公開的,你從MAC中不可能得出原文的K或M。

解壓縮的時候,先計算一個XMAC = F(C,K1),其中K1是用戶輸入的密碼。

如果XMAC == MAC,那麼就用這個K1去解密文件。

以上演算法叫「加密 + 認證」。

如果對明文M算MAC,即MAC = F(M,K),然後再加密,叫「認證 + 加密」。


這個不是什麼很難的問題,題主說的沒錯,加密軟體的確不知道真正的密碼是什麼,但是不代表它不能驗證密碼是否正確。

在加密文件的時候,加密軟體會將密碼的hash值一起打包進加密後的文件里,解密是會用同樣的方法只需要比較你輸入的密碼的hash值是否正確即可。

hash值有兩個特徵: 重複,不可逆。比如說-2和2的平方都是4,所以你是無法從4倒推回2的。因此不必擔心密碼泄露的問題了。


簡單舉個例子, 題主有個密碼, 假設是 123456

解壓軟體用123456加密內容, 假設內容是 (加密亂碼)//7106760

這個7106760是什麼東西呢, 就是 123^2+456^2, 從7106760想倒推123456, 就是已知 x^2+y^2=7106760, 求xy. 求不出來吧, 密文中確實隱藏了密碼, 但是你拿到了也不知道真正的密碼

只要有這種單向不可逆的過程, 就可以保護密碼, 當然我說的很簡單, 加密軟體也不用重複造輪子, 用成熟的一些演算法就可以了, 比如MD5, SHA1 等等


驗證有多種方式/流程。說2個最常見的

1.利用散列。這東西有多種叫法,商密規範叫雜湊,搞WEB的喜歡叫單向函數。個人覺得單向函數要貼切些,因為直接反應出了不可逆這點。流程大致如下。

第一次用生成的密鑰key進行散列運算,得到特定長度+不可逆的信息摘要A,進行存儲。當需要驗證時,讓用戶重新輸入密碼,然後按照之前的散列演算法得出信息摘要B,然後對比A與B,相同就說明密碼正確,然後能進行下一步操作(用key加/解密),不同就返回錯誤。

WinRAR用的就是這種,veracrypt早期版本也是,新版的長時間沒關注了,加眼藥水沒不清楚。

2.利用數字證書(公鑰/私鑰)。這個更複雜些,往往牽涉到多種演算法的綜合應用。

當然,驗證方式還有很多,例如 SM9的 基於IBC的方法,你家小區進門RFID鑰匙的方法,等等。


密碼是解壓演算法的一部分。


看下解密後文件頭格式對不對應該就行。


推薦閱讀:
相关文章