為什么rar密碼不能被破解
一、Rar文件生成的流程。
Winrar加密文件時,總的分兩個步驟:
1:先把源文件壓縮,壓成一段數(shù)據(jù)段。
2:再將壓縮完的數(shù)據(jù)段加密。
對于同一個源文件來說,不進行加密,壓縮完,其rar文件中的數(shù)據(jù)段是一模一樣的。但是如果對同一個源文件來說,即使使用同一個密碼,加密完rar文件中的數(shù)據(jù)段是不一樣的,這是由于加密的密鑰是依賴于一個Salt(8個字節(jié)的密鑰,用來加密時使用,存放在rar文件頭中里),所以要解密rar加密文件關(guān)鍵在于數(shù)據(jù)解密這一步,那我們接下來研究一下如何加密的。
二、加密“壓縮完的數(shù)據(jù)段”的流程
1、獲取密鑰:
將明文的密碼與Salt一起,通過HASH算法,生成兩個16字節(jié)的密鑰。(一個是KEY(AES算法的參數(shù)),一個是initVector)
2、以Key和initVector來加密壓縮數(shù)據(jù):
這里,是一個循環(huán)加密的結(jié)構(gòu),每16字節(jié)作為一個塊,進行加密(這可能正是為什么加密完的文件長度總為16倍數(shù)的原因)。加密采用AES算法(RAR采用的是AES的rijndael的標準應(yīng)用)。這里注意:AES加密前,有一個異或運算,是先將每16字節(jié)塊與上一個16字節(jié)塊加密結(jié)果進行異或,然后再進行AES算法的。我用一個簡單的示意代碼看說明:
;===============================================
packblock[0]=packblock^initVector
encryptBlock[0]=AES(packblock[0]) ;(KEY為AES的密鑰)
for i=1 to 塊數(shù)量-1
packblock=packblock^encryptBlock[i-1]
encryptBlock=AES(packblock) ?。唬↘EY為AES的密鑰)
next
;packblock表示壓縮完的每16字節(jié)數(shù)據(jù)
;encryptBlock表示加密完的每16字節(jié)數(shù)據(jù)
;===============================================
三、解密的過程
由于AES算法是對稱的,所以解密的過程,是加密過程的逆運算。但解密時AES算法過程與加密所用的不一樣(是因為解密過程中由KEY生成的子密鑰表不一樣)。仍然需要我們將密碼輸入,與salt一起生成兩個16字節(jié)密鑰,KEY和initVector。
;===============================================
packblock[0]=AES1(encryptBlock[0]) ;(KEY為AES的密鑰)
packblock[0]=packblock^initVector
for i=1 to 塊數(shù)量-1
packblock=AES1(encryptBlock) ;(KEY為AES的密鑰)
packblock=packblock^encryptBlock[i-1]
next
;===============================================
那判斷密碼是否正確的在什么地方呢?
解密的過程是解密后的數(shù)據(jù)塊進行解壓縮,然后解成源文件,對該文件進行CRC校驗,存在RAR文件中的源文件CRC校驗碼比較,相同則密碼正確,不相同則密碼錯誤。#p#
四、無法秒破的原因
從上面,我們了解了RAR文件的整體思路。地球人都知道,解密時,肯定有個步驟是來判斷密碼的正確與否。而且,依據(jù)以往的經(jīng)驗,我們也許可以將某些判斷的點移動,那樣可以縮減破解的流程思路。那RAR的這一步在哪里?它把校驗放在了最后的一步。如果要秒破,我們該怎么做泥?至少我認為目前是不可能的。
我們從解密過程逆反過來看看:
1、CRC檢驗這一塊修改跳轉(zhuǎn)?
根本毫無意義,因為它已經(jīng)是最后一步了。你可以修改RAR文件頭的CRC值,你可以將它改得和你用任意密碼解壓出來的文件CRC值一樣,但你的文件根本就不是原來的文件了??赡芤呀?jīng)完全面目全非了。所以,對這一過程不可行。CRC校驗本身是不可逆的
2、那么把判斷提前到壓縮完的數(shù)據(jù)?
解壓的時候,有沒有什么來判斷壓縮數(shù)據(jù)是否正確?壓縮完的數(shù)據(jù),有沒有固定的特征,是否可以做為解壓的判斷,在這一步里,我們也無法找到有效的可用的固定特征。因為這一步涉及到RAR的壓縮算法。即使一個源文件,即使你的文件前一部分是完全相同的,只對后面的部分進行改過,那么壓縮完,數(shù)據(jù)也是完全一樣的。因為壓縮完的數(shù)據(jù)首先是一個壓縮表,后面是編碼。文件不一樣,掃描完的壓縮表也不一樣,編碼又是依賴于壓縮表,所以,這里頭找不到壓縮完的數(shù)據(jù)有任何的固定特征可以用來判斷的。
不管壓縮數(shù)據(jù)是什么樣的,Winrar都一如既往地進行解壓,沒有進行壓縮數(shù)據(jù)是否有效的判斷。
3、那假如我們破解了AES了泥?
由于AES只依賴于KEY,如果AES算法被破解了,我們知道了KEY,我們可以解出壓縮完的數(shù)據(jù),但是這里有一個問題,還有一個initVector密鑰,用來第一個16字節(jié)塊的異或,你沒有initVector參數(shù),你第一個16字節(jié)塊的數(shù)據(jù)便無法解得出來。
4、那就只能從第一步Hash的算法入手
即使你能破解hash,但hash后的結(jié)果泥?沒有結(jié)果,你怎么返推密碼。
所以綜上,發(fā)現(xiàn)rar的加密是由hash和AES兩種算法互相牽制,而兩種算法當前都無法破解,至少目前還沒有辦法秒破。