这基本上是一个假设的程序 - 有2 ^ 128个组合(或者它是2 ^ 128-1?不确定。或者128应该用127替换?)但它不起作用。
<?php
$end = (int)base_convert("zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",36,10);
$count = 0;
for($count = 0; $count < $end; $count++) {
$startHash = base_convert((string)$count,10,36);
//Add zeros to the beginning if the length is less than 32
while(strlen($starthash) < 32) {
$starthash = "0" + $startHash;
}
$endHash = md5($startHash);
if($startHash == $endHash) {
file_put_contents("MD5.txt", file_get_contents("MD5.txt") + $startHash + "\n");
}
}
?>
我甚至不确定为什么;它甚至没有任何错误。我期待的是它使用100%的CPU,但它的使用率不超过0.1%。
你知道发生了什么吗?
答案 0 :(得分:1)
我看到的主要问题是你与$startHash
的情况不一致。 php中的变量区分大小写。
答案 1 :(得分:1)
你的循环变量$count
是一个普通的PHP整数。它永远不会增长到128位。您应该使用二进制字符串或更好:
$end = gmp_init("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
$count = gmp_init("0");
for ( ; gmp_cmp($count, $end) == 0; $count=gmp_add($count, 1)) {
似乎你正试图看看散列的十六进制表示是否散列到自身。所以你应该gmp + base_convert到16。
最后尝试file_put_contents($fn, $data, FILE_APPEND)
我怀疑你会得到一个结果。即使CPU使用量增加。
答案 2 :(得分:1)
md5函数有第二个参数,允许您获取16字节的原始代码。
您可能遇到的另一个问题是PHP不是那么快并且通常会超时。用不同的语言编写程序,添加一些线程并定期保存值可能会更好,这样你就可以在关机后恢复程序。
[编辑] 也许这会让你知道要等多久。 md5 = 16字节= 4个整数,每个最大值为40亿($ FFFFFFFF)。因此,要遍历这16个字节的所有值,您需要嵌套四个for循环,每个循环运行到40亿:
<?
for($a = 0; $a <= 0xFFFFFFFF; $a++){
for($b = 0; $b <= 0xFFFFFFFF; $b++){
for($c = 0; $d <= 0xFFFFFFFF; $c++){
for($d = 0; $d <= 0xFFFFFFFF; $d++){
$code =
str_pad(dechex($a), 8, "0", STR_PAD_LEFT).
str_pad(dechex($b), 8, "0", STR_PAD_LEFT).
str_pad(dechex($c), 8, "0", STR_PAD_LEFT).
str_pad(dechex($d), 8, "0", STR_PAD_LEFT);
$md5code = md5($code);
if ($code == $md5code)
{
echo $code . "\n"; // Found one
}
}
}
}
}
echo 'done';