很早时候就想写这个东东了。在网上下载了一个C语言的MD5代码,后来朋友又发给我一份用 mm0 mm1 等寄存器(64位)的汇编代码,两者都能完成MD5运算。
MD5运算的结果是一个“摘要”,16B数据。输入可以是无穷的,但输出是有限的(16B)。可见它是一个不可逆算法(是有损变换)。
网上有说MD5被破解了,不是很确切。下载了fastcoll程序代码,看了一下,它只是相当快地找到两个不一样的输入,而输出是一样的,这就是说它能快速实现了MD5碰撞。可惜程序并不能自己构造一个输入,使得输出的结果是事先指定好的,也就是说它不能找到一个指定的16B所对应的输入。
所以,要是想到得一个输出所对应的输入,只有查表法和穷举法了。查表法要的是超大硬盘,穷举法要的是速度(可配合字典)。
为了追求速度,会用到汇编程序实现MD5,因为MD5中的 FF GG HH II 变换用到的 & | ~ ^ + 还有循环移位等都很适合汇编指令。而用C程序写的MD5程序编译后,看它的汇编指令中有很多可优化的地方。
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) // C语言实现的循环移位
编译后为
mov eax, dword ptr [ebp-14] // mov eax, x
shl eax, 0C // eax << n
mov ecx, dword ptr [ebp-14]