2010年10月29日 星期五

一個菜鳥關於winrar密碼無法秒破的研究結果

作者: Alexboo (知己方能百戰百勝) 看板: Gossiping
標題: Re: [問卦] 有沒有WINRAR的密碼無解的八卦
時間: Sat May 29 20:25:22 2010

※ 引述《accprote (KS)》之銘言:
: RAR是普遍用的壓縮格式
: 然後各大網站的分享者通常會保護自己的東西
: 所以都會加密
: 但是rar的加密好像現在還是無解
: 有沒有RAR密碼的八卦?


哎呀  八卦版居然對技術問題有興趣

那我轉貼一篇長文解釋吧...


http://bbs.pediy.com/showthread.php?t=62908

一個菜鳥關於winrar密碼無法秒破的研究結果

研究的原因:

由於有一個重要的Rar檔案,極需解開,首先試用了ARPC,但是解壓
的速度極慢,每秒只有30個左右,所以斷了窮舉破解的念頭,卻仍不死心
,因為我從不崇尚窮舉破解的方法,除非每秒可以跑幾千萬次的,我或許
可以一試,所以決定研究一下Winrar 3.x密碼演算法,以期是否可以破
解該密碼。查看了網路上的資料,包括看雪FAQ裏的回答,都聲稱只能用
窮舉法破解,起先並不理解,但通過研究,我理解了看雪前輩們在FAQ裏
所說的原因,不禁讓我佩服 Winrar加密思路的成熟。雖然研究的結果沒
有什麼新意,但我還是決定把我的研究結果與大家一起分享,為那些仍然
以為winrar密碼可以象破解註冊碼一樣的,通過修改winrar彈出框之類的
更改檔案流程指向可以達到跳過密碼檢驗的朋友,做一個簡要的說明。


一、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加密前,有
  一個XOR運算,是先將每16位元組塊與上一個16位元組塊加密結果進行XOR,
  然後再進行AES演算法的。我用一個簡單的示意代碼看說明:

  ;===============================================

packblock[0]=packblock[i]^initVector
  encryptBlock[0]=AES(packblock[0])     ;(KEY為AES的密鑰)
  for i=1 to   blocks-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]=AES_Reverse(encryptBlock[0])     ;(KEY為AES的密鑰)
packblock[0]=packblock[i]^initVector

  for i=1 to   blocks-1
  packblock[i]=AES_Reverse(encryptBlock[i])     ;(KEY為AES的密鑰)
    packblock[i]=packblock[i]^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兩種演算法互相牽制,而兩種
  演算法當前都無法破解,至少目前還沒有辦法秒破,也理解了看雪高手講
  的道理。

五、對窮舉提高演算法效率的一些設想。

  我用ASM寫完了RAR窮舉解密的演算法模組,但是如何提高效率,優化窮舉
  的速度泥?我有如下的想法:

1、從壓縮資料裏找尋特徵,省掉解壓縮、CRC檢驗代碼和生成initVector
     生成代碼。目前,通過多次實驗,我找到的一個特徵(不知道這個是否
     正確),即解密完的最後一個16位元組塊的最後一個位元組必須為0。
     因為經過多次的試驗,我發現有加密的資料段長度都會比未加密前的資
     料長,那麼,最後一個16個位元組的資料塊解密完,多出的部分就都為0
     ,但多出幾個位元組泥?多次實驗,長度不一,我試想著從加密資料段
     最後一個16個位元組塊著手,只解這一塊,看是否一個位元組為0,這
     樣,只解密16個位元組的資料,來大大提高效率?如果能進行到這一
     步了,再通過解全部資料,進行CRC校驗的判斷。

2、如果第一個特徵不成立的話,針對特定格式的壓縮檔案,比如doc、jpg
     等,部分資料固定,壓縮完的資料是否存在相互牽制的資料?從而把判
     斷提前,這一步,我不知道如何找到壓縮完的資料是否存在相互牽制的
     資料。


以上是研究的一點點成果,歡迎大家討論,至於聽說如美國情報機構,完成
了對RAR檔案的秒破,還有在臺灣一論壇上看到,有人提到RAR文件被人秒破
過,我不太相信,我覺得美國情報局這樣的機構,有可能可以秒破,但應該
是建立在已經通過非常規手段,跑出一份對應表,只做查詢密碼才有可能做
到.


====

給按END的

簡單的說就是除了窮舉 你也破不了

不過中文不是問題就是了 :)


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.172.208.136
推 wyvernlee:略懂                                                  05/29 20:26
推 dio0204:喔喔~~~~~~~~~~~~~~~原來如此                             05/29 20:26
推 oo0:                    E N D                                   05/29 20:26
推 Hu1din:嗯嗯  原來如此                                           05/29 20:27
推 RedHouse:拿1.0的來破就好了,誰叫你挑戰版新版的                   05/29 20:27
→ LVE: 哈 看完之後馬上破了一個檔案,今晚不睡了阿!                 05/29 20:27
推 s902131:略懂                                                    05/29 20:27
推 WizZ:所以有生之年都看不到林..                                   05/29 20:27
→ deeder1:END                                                     05/29 20:27
推 tk1211:嗯 差不多就是這樣                                        05/29 20:27
→ digimaster:花點小錢加入論壇會員就好了 花時間在破解密碼上?呿~   05/29 20:28
→ doctor2tw: END                                                  05/29 20:29
推 wackyjazz:閱                                                    05/29 20:29
推 estupid:略懂略懂                                                05/29 20:30
推 opopoppj:快推 不然有人嫌我們笨                                  05/29 20:30
→ bear2008:直接貼結論還比較快                                     05/29 20:30
推 protoss666:END                                                  05/29 20:31
推 akira00150:推 但是我看不懂                                      05/29 20:32
推 momowawa1981:恩 原PO想法跟我差不多 不錯                         05/29 20:32
推 wolves0117:沒錯 跟我想的一樣   嗯嗯  嗯嗯 嗯嗯                  05/29 20:32
推 gmoz:簡單的說就是 他根據你輸入的密碼解完檔案之後再比對          05/29 20:33
→ netsphere:喔                                                    05/29 20:33
→ gmoz:不是先檢查密碼對不對再開始解壓縮  是這樣嗎?                05/29 20:33
噓 ewings:這是google搜索的結果第一個網頁的文章吧,來人檢舉吧        05/29 20:35
→ Alexboo:給 gmoz: 對  因為根本沒紀錄密碼啊... XD                 05/29 20:35
推 boyen3:密碼學... 當初差點被這科搞死                             05/29 20:36
推 yphs88:alexboo那這樣超大檔案密碼一不小心輸入錯誤不就囧了?       05/29 20:37
→ Alexboo:給 yphs88: 是啊...                                      05/29 20:41
推 a1e:密碼學的東西拜託不要貼上來...那個真的會整死人...            05/29 20:41
→ Alexboo:給 a1e: 這還沒講到密碼學的經隨啦...XD                   05/29 20:43
推 adila:原來是這樣啊!                                             05/29 20:45
推 tom222:我用一個簡單的示意代碼看說明:                           05/29 20:48
推 hkshen:原來是這樣阿                                             05/29 20:51
推 hank11235813:真巧 我也是這樣認為的                              05/29 20:53
推 ohhiyomylove:略懂                                               05/29 20:55
推 mmmbop:恩 沒錯 就是這樣                                         05/29 21:08
推 andywolfer:有生之年還是看不到林志玲大戰林百里這個傳說了         05/29 21:13
推 Janius:最後三行字很貼心                                         05/29 21:24
推 afooque:專業推! 雖然沒看完                                     05/29 21:48

沒有留言:

張貼留言

您好.本資料庫並非第一手資料.如果你有對文章作者的詢問,意見與需求,請自行找尋文章作者並提供意見,謝謝.