1. 程式人生 > >[轉載]RAR壓縮包密碼破解原理

[轉載]RAR壓縮包密碼破解原理

RAR的名字源自其作者Eugene Roshal,為Roshal ARchive的縮寫。Eugene Roshal最初編寫了DOS
  版本的編碼和解碼程式,後來移植到很多平臺,例如比較著名的Windows平臺上的WinRAR。Eugene Roshal有條件的公開了解碼
  程式的原始碼,但是編碼程式仍然是私有的。
[編輯本段]
主要特點
  RAR檔案的副檔名是.rar,MIME型別是application/x-rar-compressed。
  同樣是無損資料壓縮,RAR檔案通常比ZIP檔案壓縮比要高,但是壓縮速度較慢。因為RAR檔案頭也要佔據一定空間,在資料壓縮餘地不大時,壓縮過的檔案可能比原檔案要大。RAR的一個主要優點是可以把檔案壓縮目標分割到多個檔案,並且很容易從這樣的分割的壓縮檔案解壓出原始檔。
  另外,RAR也支援緊縮格式,把所有檔案壓縮到同一個資料區以加大壓縮比,代價是解壓一個單獨的檔案時必須解壓其前面的所有檔案。新的RAR的加密演算法使用的是AES,而舊的RAR的加密演算法是私有的。這兩種演算法都很難破解,所以在沒有密碼的情況下只能用字典暴力破解法來破解。RAR中也可以加入冗餘的修復資訊,在檔案損壞但是修復資訊足夠完好時可以對壓縮包進行修復。
[編輯本段]
開啟工具
  RAR,WINRAR
  RAR檔案是一種最常用的壓縮檔案,用WinRAR軟體開啟處理。
  WinRAR 是 32 位 Windows 版本的 RAR 壓縮檔案管理器 ——一個允許你建立、管理和控制壓縮檔案的強大工具。存在一系列的 RAR 版本,應用於數個作業系統環境:Windows、Linux、FreeBSD 、DOS、OS/2、MacOS X。
[編輯本段]
為什麼不能被秒破?
  一、Rar檔案生成的流程。
  Winrar加密檔案時,總的分兩個步驟:
  1:先把原始檔壓縮,壓成一段資料段。
  2:再將壓縮完的資料段加密。
  對於同一個原始檔來說,不進行加密,壓縮完,其rar檔案中的資料段是一模一樣的。但是如果對同一個原始檔來說,即使使用同一個密碼,加密完rar檔案中的資料段是不一樣的,這是由於加密的金鑰是依賴於一個Salt(8個位元組的金鑰,用來加密時使用,存放在rar檔案頭中裡)
  所以要解密rar加密檔案關鍵在於資料解密這一步,那我們接下來研究一下如何加密的。
  二、加密“壓縮完的資料段”的流程
  1、獲取金鑰:
  將明文的密碼與Salt一起,通過HASH演算法,生成兩個16位元組的金鑰。(一個是KEY(AES演算法的引數),一個是initVector) 
  2、以Key和initVector來加密壓縮資料:
  這裡,是一個迴圈加密的結構,每16位元組作為一個塊,進行加密(這可能正是為什麼加密完的檔案長度總為16倍數的原因)。加密採用AES演算法(RAR採用的是AES的rijndael的標準應用)。這裡注意:AES加密前,有一個異或運算,是先將每16位元組塊與上一個16位元組塊加密結果進行異或,然後再進行AES演算法的。我用一個簡單的示意程式碼看說明:
  ;===============================================
  packblock[0]=packblock^initVector
  encryptBlock[0]=AES(packblock[0]) ;(KEY為AES的金鑰)
  for i=1 to 塊數量-1
  packblock=packblock^encryptBlock[i-1]
  encryptBlock=AES(packblock) ;(KEY為AES的金鑰)
  next
  ;packblock表示壓縮完的每16位元組資料
  ;encryptBlock表示加密完的每16位元組資料
  ;===============================================
  三、解密的過程
  由於AES演算法是對稱的,所以解密的過程,是加密過程的逆運算。但解密時AES演算法過程與加密所用的不一樣(是因為解密過程中由KEY生成的子金鑰表不一樣)。仍然需要我們將密碼輸入,與salt一起生成兩個16位元組金鑰,KEY和initVector。
  ;===============================================
  packblock[0]=AES1(encryptBlock[0]) ;(KEY為AES的金鑰)
  packblock[0]=packblock^initVector
  for i=1 to 塊數量-1
  packblock=AES1(encryptBlock) ;(KEY為AES的金鑰)
  packblock=packblock^encryptBlock[i-1]
  next
  ;===============================================
  那判斷密碼是否正確的在什麼地方呢?
  解密的過程是解密後的資料塊進行解壓縮,然後解成原始檔,對該檔案進行CRC校驗,存在RAR檔案中的原始檔CRC校驗碼比較,相同則密碼正確,不相同則密碼錯誤。
  四、無法秒破的原因
  從上面,我們瞭解了RAR檔案的整體思路。地球人都知道,解密時,肯定有個步驟是來判斷密碼的正確與否。而且,依據以往的經驗,我們也許可以將某些判斷的點移動,那樣可以縮減破解的流程思路。那RAR的這一步在哪裡?它把校驗放在了最後的一步。如果要秒破,我們該怎麼做泥?至少我認為目前是不可能的。
  我們從解密過程逆反過來看看:
  1、CRC檢驗這一塊修改跳轉?根本毫無意義,因為它已經是最後一步了。你可以修改RAR檔案頭的CRC值,你可以將它改得和你用任意密碼解壓出來的檔案CRC值一樣,但你的檔案根本就不是原來的檔案了。可能已經完全面目全非了。所以,對這一過程不可行。CRC校驗本身是不可逆的
  2、那麼把判斷提前到壓縮完的資料?
  解壓的時候,有沒有什麼來判斷壓縮資料是否正確?壓縮完的資料,有沒有固定的特徵,是否可以做為解壓的判斷,在這一步裡,我們也無法找到有效的可用的固定特徵。因為這一步涉及到RAR的壓縮演算法。即使一個原始檔,即使你的檔案前一部分是完全相同的,只對後面的部分進行改過,那麼壓縮完,資料也是完全一樣的。因為壓縮完的資料首先是一個壓縮表,後面是編碼。檔案不一樣,掃描完的壓縮表也不一樣,編碼又是依賴於壓縮表,所以,這裡頭找不到壓縮完的資料有任何的固定特徵可以用來判斷的。
  不管壓縮資料是什麼樣的,Winrar都一如既往地進行解壓,沒有進行壓縮資料是否有效的判斷。
  3、那假如我們破解了AES了泥?
  由於AES只依賴於KEY,如果AES演算法被破解了,我們知道了KEY,我們可以解出壓縮完的資料,但是這裡有一個問題,還有一個initVector金鑰,用來第一個16位元組塊的異或,你沒有initVector引數,你第一個16位元組塊的資料便無法解得出來。
  4、那就只能從第一步Hash的演算法入手
  即使你能破解hash,但hash後的結果泥?沒有結果,你怎麼返推密碼。
  所以綜上,發現rar的加密是由hash和AES兩種演算法互相牽制,而兩種演算法當前都無法破解,至少目前還沒有辦法秒破。
[編輯本段]
如何給RAR加密
  RAR 和 ZIP 兩種格式均支援加密功能。
  若要加密檔案,在壓縮之前你必須先指定密碼,或直接在 壓縮檔名和引數 對話方塊中指定。
  在 命令列 模式時使用開關 -p[密碼]。
  而在 WinRAR 圖形介面時,要輸入密碼你可以按下 Ctrl+P 或者是在 檔案選單 選擇“設定預設密碼”命令。
  另一種方式是單擊 WinRAR 視窗底部左下角的鑰匙圖示。在 壓縮檔名和引數對話方塊 裡的“高階選項”組中按下“設定密碼”按鈕輸入密碼。
  和 ZIP 不同,RAR 格式不只允許資料,而且其它的可感知的壓縮檔案區域:檔名、大小、屬性、註釋和其它塊都可加密。如果你希望這樣做,你需要在密碼對話方塊中設定“加密檔名” 選項,或在命令列模式使用 -p[密碼] 的開關 -hp[密碼]。以這種方式加密的檔案,如果沒有密碼甚至不可能檢視檔案列表。
  當不再需要的時候,別忘了將輸入的密碼刪除。不然你或許又加密了別的壓縮檔案,但卻不希望使用同一組密碼。要刪除密碼時,只需要輸入空字串來替換原先的密碼,或者先關閉 WinRAR 並重新啟動一次。當有密碼存在時,鑰匙的圖示是紅色的,否則它是黃色的。而且,當你使用密碼開始壓縮操作時,標題欄 壓縮檔名和引數對話方塊也會閃爍兩次。
  如果你在 壓縮檔名和引數 對話方塊直接輸入它,你不需要刪除密碼。這不同於其它方式,此類密碼僅在單一壓縮操作有效,並在完成後它會自動刪除。
  當解壓加密的檔案時,開始操作之前你也可以不需要事先輸入密碼。如果 WinRAR 遇到加密的檔案,而解壓之前未先輸入密碼的話,它便會提示使用者輸入密碼。
  WinRAR 支援 ZIP 2.0 格式使用私有加密演算法。 RAR 壓縮檔案使用更強大的 AES-128 標準加密。如果你需要加密重要的資訊,選擇 RAR 壓縮檔案格式會比較好一些。為了確實的安全性,密碼長度請最少要 8 個字元。不要使用任何語言的單詞作為密碼,最好是任意的隨機組合字元和數字,並且要注意密碼的大小寫。請記住,如果你遺失你的密碼,你將無法取出加密的檔案,就算是 WinRAR 的作者本身也無法解壓加密過的檔案。