彩虹表(Rainbow Table)筆記一,自己建表破解MD5

所用工具來自http://project-rainbowcrack.com/index.htm#download


基本步驟:生成彩虹表(rtgen)——> 排序(rtsort)——> 破解(rcrack)


生成彩虹表可以用以下命令:

rtgen hash_algorithm charset plaintext_len_min plaintext_len_max table_index chain_len chain_num part_index

其中有兩個參數不太好理解:table_index和part_index。如果想詳細研究可以參考以下論文: Philippe Oechslin's original paper 。現在就從測試的角度來“推測”這兩個參數的用途。

首先生成一個覆蓋率較低的Rainbow Table,然後用此表來破解b0baee9d279d34fa1dfd71aadb908c3f(= md5("11111"))

rtgen md5 numeric 5 5 0 100 200 0

rtsort *.rt

rcrack *.rt -h b0baee9d279d34fa1dfd71aadb908c3f

提示找不到對應的字符串。

然後,對part_index值遞增,反覆測試。當part_index等於3時,破解成功。

rt文件定義了,彩虹表每條鏈佔用16bytes,前8bytes爲起點(start point),後8bytes爲終點(end point)。每條鏈所包含的節點數由chain_len定義,在此例中爲100。打開*.rt文件,可以看到起點的數值在文件內部是不斷遞增的,在相鄰的文件之間也是依次遞增的。由“rtgen md5 numeric 5 5 0 100 200 0”、“rtgen md5 numeric 5 5 0 100 200 1”、“rtgen md5 numeric 5 5 0 100 200 3”......"rtgen md5 numeric 5 5 0 100 200 9"生成的文件組完全等效於由“rtgen md5 numeric 5 5 0 100 2000 0”創建的文件。

接下來用md5("99999")進行測試,直到part_index等於9時,破解成功。

分析:5位數字構成的樣本空間爲10W,每個彩虹表包含2W個節點(100 * 200),按道理只需要5個rt文件就能完整覆蓋了。爲什麼直到part_index=9時才能破解md("99999")呢?我想,主要原因在於R運算(http://en.wikipedia.org/wiki/Rainbow_table)無法做到無衝突的均勻覆蓋樣本空間。當然,不能苛求夠構造出這樣的R函數(實際上也是不太可能的)。在每張彩虹表內肯定存在一定數量的衝突節點,不同的彩虹表節點也存在衝突節點,因此彩虹表的覆蓋範圍就不能做簡單的加法和乘法。要提高覆蓋率,就只能通過增加彩虹表所包含的節點數或者彩虹表的數量來提高覆蓋率。在下載彩虹表時,旁邊的說明標註了一個成功率參數(如何得算出還不知道),或許也是這個原因吧。


接下再來測試table_index參數。

用rtgen md5 numeric 5 5 0 100 200 0生成彩虹表,依次遞增table_index,直到table_index=7時,方可成功破解md5("11111")。

打開rt文件,可知每張彩虹表的起點(start point)都一樣,但因table_index值不同,所以不同表中相同起點對應的終點也不盡相同。

分析: table_index is related to the "reduce function"。在生成彩虹表時,也會看到如下提示:“reduce offset:0x00070000”,不同的table_index對應於不同的reduce偏移。從文檔也可以瞭解到,table_index通過影響R函數的運行參數,生成一個新的表,起到提高覆蓋率的作用。


最後,遍歷所有樣本空間00000~99999,比較兩種方法所創建彩虹表的破解成功率:第一組,part_index遞增(0到9);第二組,table_index遞增(0到9)。結果,用第一組md5_numeric#5-5_0_100x200_X.rt彩虹表,會有24756個md5值無法破解,破解率75.244%;用第二組md5_numeric#5-5_X_100x200_0.rt彩虹表,會有15363個md5值無法破解,破解率84.637%。


下回討論:如何生成破解率高的彩虹表。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章