The program that found the key is composed of two parts: a master, which partitions the search space and centralizes the results, and a slave, which does the work. Run the master on one machine, and the slave on everything you can get your hand on.
I did no cleanup of the code, as this is a one-shot thing. I'm not really interested in breaking everyone's SSL sessions...
Warning: some C compilers (especially cc on the MIPS and alpha machines) take forever to compile the slave with maximum optimizations. I used gcc instead. Even then, some old versions of gcc crashed when trying to optimize the code.
Be aware that my code will not do what you tell it to do. You give
it two 7-digit hexadecimal numbers, and for each number
xxyyzzt
between the two (starting with the first and
stopping just short of the second), it will try the keys (FF-xx)
00 t0 zz yy
to (FF-xx) FF tF zz yy
.
This is because of the little-endianness of MD5, and because I wanted
to sweep the keys in (roughly) reverse order. I ran it with 0 and
10000000 as arguments to sweep the entire key space.
Note also that the master will fall apart if you have more than a few hundred slaves. I should have put a hash table in there, and collapsed the adjacent intervals in the "done" list.
If you want to participate in the cypherpunks key cracking ring, don't use this code. Have a look at their web page and use their code. It is slightly faster than mine anyway.