除了你的函数不返回任何""
和"0"
,最终的哈希值只包含十六进制字符的 MD5 哈希值0
–<code>9 和a
–<code>f,它们是:
string(32) "cfcd208495d565ef66e7dff9f98764da"
string(32) "c4ca4238a0b923820dcc509a6f75849b"
string(32) "c81e728d9d4c2f636f067f89cc14862c"
string(32) "eccbc87e4b5ce2fe28308fd9f2a7baf3"
string(32) "a87ff679a2f3e71d9181a67b7542122c"
string(32) "e4da3b7fbbce2345d7772b0674a318d5"
string(32) "1679091c5a880faf6fb5e6087eb1b2dc"
string(32) "8f14e45fceea167a5a36dedd4bea2543"
string(32) "c9f0f895fb98ab9159f51fd0297e236d"
string(32) "45c48cce2e2d7fbdea1afc51c7c6ad26"
string(32) "0cc175b9c0f1b6a831c399e269772661"
string(32) "92eb5ffee6ae2fec3ad71c777531578f"
string(32) "4a8a08f09d37b73795649038408b5f33"
string(32) "8277e0910d750195b448797616e091ad"
string(32) "e1671797c52e15f763380b45e841ec32"
string(32) "8fa14cdd754f91cc6554c9e71929cce7"
如果我们使用相同的md7($c, 32)
:
NULL
string(32) "4a8a08f09d37b73795649038408b5f33"
string(32) "4a8a08f09d37b73795649038408b5f33"
string(32) "e1671797c52e15f763380b45e841ec32"
string(32) "0cc175b9c0f1b6a831c399e269772661"
string(32) "e1671797c52e15f763380b45e841ec32"
string(32) "c4ca4238a0b923820dcc509a6f75849b"
string(32) "c9f0f895fb98ab9159f51fd0297e236d"
string(32) "4a8a08f09d37b73795649038408b5f33"
string(32) "a87ff679a2f3e71d9181a67b7542122c"
string(32) "cfcd208495d565ef66e7dff9f98764da"
string(32) "45c48cce2e2d7fbdea1afc51c7c6ad26"
string(32) "a87ff679a2f3e71d9181a67b7542122c"
string(32) "c9f0f895fb98ab9159f51fd0297e236d"
string(32) "e1671797c52e15f763380b45e841ec32"
string(32) "c9f0f895fb98ab9159f51fd0297e236d"
再次,0
返回NULL
。但更有趣的是 { 1
, 2
, 8
}, { 3
, 5
, 7
} 和 { c
, f
} 的字符导致相同的哈希值。这是因为它们的 MD5 哈希值确实以相同的八位字节开头。当您使用这些散列来构建最终的 MD7 散列时,它们生成的散列的前 32 个十六进制字符也是相同的。
所以对于 ≤ 32 的长度,只有 16 个可能的 MD7 散列,对于 ≤ 64,有 16 2 个MD7 散列,依此类推。最大长度为 3·32·32=3072 并且可能的 MD7 哈希值的数量为 16 3·32。
但是最后的 3072 个字符长的 MD7 哈希没有 16^192 熵。因为最后 1024 个字符是从已知的 MD7 哈希的长度推导出来的,所以只剩下 2048 个未知字符。
由于哈希循环可以反转,因此也可以获得文本及其长度的初始 MD5。
这是一个例子:
function md7_info($hash) {
$hashlen = strlen($hash);
$md5_to_hex = array();
foreach (str_split('0123456789abcdef') as $c) $md5_to_hex[md5($c)] = $c;
$md5_text = '';
foreach (str_split(substr($hash, 0, 1024), 32) as $h) $md5_text .= $md5_to_hex[$h];
$md5_textlen = '';
foreach (str_split(substr($hash, 1024, 1024), 32) as $h) $md5_textlen .= $md5_to_hex[$h];
return array($md5_text, $md5_textlen, $hashlen);
}
原始文本长度的MD5也可以反转。所以最后剩下的信息就是MD5和文本长度。没有获得更多的安全性。事实上,文本长度的知识确实揭示了额外的信息。