彩虹表(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%。
下回讨论:如何生成破解率高的彩虹表。
作者 haungrui的专栏