一、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[i]^initVector encryptBlock[0]=AES(packblock[0]);(KEY為AES的金鑰) fori=1to塊數量-1 packblock[i]=packblock[i]^encryptBlock[i-1] encryptBlock[i]=AES(packblock[i]);(KEY為AES的金鑰) next ;packblock[i]表示壓縮完的每16位元組資料 ;encryptBlock[i]表示加密完的每16位元組資料 ;=============================================== 三、解密的過程 由於AES演算法是對稱的,所以解密的過程,是加密過程的逆運算。但解密時AES演算法過程與加密所用的不一樣(是因為解密過程中由KEY生成的子金鑰表不一樣)。仍然需要我們將密碼輸入,與salt一起生成兩個16位元組金鑰,KEY和initVector。 ;=============================================== packblock[0]=AES1(encryptBlock[0]);(KEY為AES的金鑰) packblock[0]=packblock[i]^initVector fori=1to塊數量-1 packblock[i]=AES1(encryptBlock[i]);(KEY為AES的金鑰) packblock[i]=packblock[i]^encryptBlock[i-1] next ;=============================================== 那判斷密碼是否正確的在什麼地方呢? 解密的過程是解密後的資料塊進行解壓縮,然後解成原始檔,對該檔案進行CRC校驗,存在RAR檔案中的原始檔CRC校驗碼比較,相同則密碼正確,不相同則密碼錯誤。 四、無法秒破的原因 從上面,我們瞭解了RAR檔案的整體思路。地球人都知道,解密時,肯定有個步驟是來判斷密碼的正確與否。而且,依據以往的經驗,我們也許可以將某些判斷的點移動,那樣可以縮減破解的流程思路。那RAR的這一步在哪裡?它把校驗放在了最後的一步。如果要秒破,我們該怎麼做泥?至少我認為目前是不可能的。
一、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[i]^initVector encryptBlock[0]=AES(packblock[0]);(KEY為AES的金鑰) fori=1to塊數量-1 packblock[i]=packblock[i]^encryptBlock[i-1] encryptBlock[i]=AES(packblock[i]);(KEY為AES的金鑰) next ;packblock[i]表示壓縮完的每16位元組資料 ;encryptBlock[i]表示加密完的每16位元組資料 ;=============================================== 三、解密的過程 由於AES演算法是對稱的,所以解密的過程,是加密過程的逆運算。但解密時AES演算法過程與加密所用的不一樣(是因為解密過程中由KEY生成的子金鑰表不一樣)。仍然需要我們將密碼輸入,與salt一起生成兩個16位元組金鑰,KEY和initVector。 ;=============================================== packblock[0]=AES1(encryptBlock[0]);(KEY為AES的金鑰) packblock[0]=packblock[i]^initVector fori=1to塊數量-1 packblock[i]=AES1(encryptBlock[i]);(KEY為AES的金鑰) packblock[i]=packblock[i]^encryptBlock[i-1] next ;=============================================== 那判斷密碼是否正確的在什麼地方呢? 解密的過程是解密後的資料塊進行解壓縮,然後解成原始檔,對該檔案進行CRC校驗,存在RAR檔案中的原始檔CRC校驗碼比較,相同則密碼正確,不相同則密碼錯誤。 四、無法秒破的原因 從上面,我們瞭解了RAR檔案的整體思路。地球人都知道,解密時,肯定有個步驟是來判斷密碼的正確與否。而且,依據以往的經驗,我們也許可以將某些判斷的點移動,那樣可以縮減破解的流程思路。那RAR的這一步在哪裡?它把校驗放在了最後的一步。如果要秒破,我們該怎麼做泥?至少我認為目前是不可能的。