MD5は64バイトずつのブロックに拡張して区切って計算する(最後の64バイトにはデータ長が入っている)。
最終ブロック以外は毎回同じ演算を繰り返し、中間結果も毎回同じになる。
ブロックごとに中間結果を表示した例:
... 7F034A05 C467F7CC F2402BBD 7AC190D3 A420EECA 8123F762 CD92FE59 809D22FF 46800832 628A2121 8E6CCA4C E026777A 7D1BC186 E88279E2 127EC4D7 C4CC1303 ←最終ブロックの演算結果がこれ↓ MD5 (testdata3.txt) = 86c11b7de27982e8d7c47e120313ccc4
テストデータにちょっと追記して再度実行
... 7F034A05 C467F7CC F2402BBD 7AC190D3 A420EECA 8123F762 CD92FE59 809D22FF 46800832 628A2121 8E6CCA4C E026777A ←最終ブロックいっこ手前までは同じ 75862391 1007D95F 8A0731D5 EF3DDC0F MD5 (testdata4.txt) = 912386755fd90710d531078a0fdc3def
つまり、最終ブロックいっこ手前の計算結果をどっかに退避しておけば、毎度毎度先頭から計算しなくても済むということになる。
というか、最終ブロックいっこ手前の演算結果をMD5SUMから逆算できるんじゃないか?これ