用于查找MD5哈希值的PHP脚本?

时间:2011-02-18 23:39:53

标签: php md5

这基本上是一个假设的程序 - 有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%。

你知道发生了什么吗?

3 个答案:

答案 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个字符的值,通常用32个字节表示,它只包含字母和数字。在这种情况下,它总是由数字0到9和字母A到F(或者它是a到f?)组成,所以你实际上只需要检查那些。您现在做出错误的假设,即32个字符的md5代码是基数为36的数字。

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';