題目一
題目1:可在ubuntu主機(jī)上預(yù)先安裝md5collgen,題目為“生成兩個(gè)MD5哈希值一致但是文件內(nèi)容不同的文件”。
所謂“文件內(nèi)容不同但卻有相同的哈希值”就是 碰撞。
在這個(gè)題目中,我們將生成兩個(gè)具有相同MD5哈希值的不同文件。這兩個(gè)文件的開始部分需要相同,即它們共享相同的前綴。我們可以使用md5collgen程序?qū)崿F(xiàn)這一點(diǎn),它允許我們提供具有任意內(nèi)容的前綴文件。
md5collgen的原理
MD5將輸入的數(shù)據(jù)按照64字節(jié)一組(M1-Mn)進(jìn)行切分,然后在這些分組上進(jìn)行迭代地計(jì)算。其核心是壓縮函數(shù),其接受兩個(gè)輸入,分別是64字節(jié)的數(shù)據(jù)分組和前一次迭代的輸出,壓縮函數(shù)compression function會(huì)輸出128位的IHV(intermediate hash value),這個(gè)輸出將在下一次迭代時(shí)參與運(yùn)算。如果當(dāng)前的迭代是最后一次,IHV就是最終的hash值。而第一次迭代IHV0的IHV的輸入是固定值。
安裝md5collgen
先從github下載md5collgen工具包源碼,將其上傳至ubuntu中(官網(wǎng)下載好像沒makefile文件)
然后進(jìn)行解壓 unzip
sudo apt install build-essential
sudo apt install libboost-all-dev
然后執(zhí)行make命,安裝好md5collgen工具
利用md5collgen生成文件
在md5collgen-master下新建一個(gè)文本文件 prefix.txt(作為相同前綴的文件)
執(zhí)行命令:
./md5collgen -p prefix.txt -o out1.bin out2.bin
目錄下生成了對應(yīng)的兩個(gè)文件
diff out1.bin out2.bin
md5sum out1.bin
md5sum out2.bin
文件不一樣,但哈希值一致。
hexdump -C out1.bin
hexdump -C out2.bin
在圖形界面也可以看出,兩個(gè)文件不一致
經(jīng)觀察可得兩文件的前綴相同,文件內(nèi)容有不同。通過分析md5collgen的原理可以明白形成這一現(xiàn)象原因。從prifix.txt中取前綴,若前綴不是64的倍數(shù),則用零填充。md5collgen為兩個(gè)輸出文件生成128字節(jié)的內(nèi)容,這兩個(gè)輸出文件就是在這128字節(jié)中存在部分差異。
題目二
新建一個(gè)文件source_code.c,用于存放源代碼(并給定數(shù)組的內(nèi)容)
執(zhí)行編譯:
編譯后的結(jié)果:
在二進(jìn)制文件中找到xyz數(shù)組的位置:
hexdump -C source_code
我們可以選擇前 12480 個(gè)字節(jié)作為前綴prefix文件,中間12480到12608作為中間的128字節(jié)文件,后面第12609個(gè)字節(jié)到文件結(jié)束作為后綴suffix文件。
head -c 12480 source_code > prefix
tail -c +12609 source_code > suffix
前綴prefix文件:(部分)
后綴suffix文件:(部分)
用前綴prefix文件上運(yùn)行md5collgen 來生成兩個(gè)具有相同MD5散列值的輸出(即數(shù)組內(nèi)容相同):
./md5collgen -p task2_prefix -o task2_out1.bin task2_out2.bin
文章來源:http://www.zghlxwxcb.cn/news/detail-820111.html
diff task2_out1.bin task2_out2.bin
md5sum task2_out1.bin
md5sum task2_out2.bin
可視化:
文件內(nèi)容不同
哈希值相同文章來源地址http://www.zghlxwxcb.cn/news/detail-820111.html
到了這里,關(guān)于使用md5collgen進(jìn)行MD5碰撞實(shí)驗(yàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!