PHP скрипт, чтобы найти, если MD5 хэширует сам себя? - PullRequest
1 голос
/ 19 февраля 2011

Это в основном гипотетическая программа - есть 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% ЦП, но не использует более 0,1%.

Ты хоть представляешь, что происходит?

Ответы [ 3 ]

1 голос
/ 19 февраля 2011

Ваша переменная цикла $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)

Я сомневаюсь, что вы получите результат, однако. Даже если загрузка процессора должна увеличиться.

1 голос
/ 19 февраля 2011

Как говорит Майк, твой корпус неправильный.Но помимо этого, хэш md5 на самом деле представляет собой 16-значное значение, которое часто представляется в 32 байтах, чтобы позволить ему состоять только из букв и цифр.В этом случае он всегда будет состоять из цифр от 0 до 9 и букв от A до F (или это от a до f?), Так что вам нужно только проверить их.Теперь вы делаете неверное предположение, что 32-символьный код md5 является основным числом 36.

Функция md5 имеет второй параметр, который позволяет получить 16-байтовый необработанный код.

Другая проблема, с которой вы можете столкнуться, заключается в том, что PHP не так быстр и, как правило, имеет время ожидания.Может быть, лучше написать программу на другом языке, добавить несколько потоков и регулярно сохранять значение, чтобы вы могли возобновить работу программы после завершения работы.

[править] Может быть, это даст вам представление о том, какдолго ждать.md5 = 16 байт = 4 целых числа, максимум 4 миллиарда ($ FFFFFFFF) каждое.Таким образом, чтобы перебрать все значения этих 16 байтов, вам нужно вложить четыре цикла for, каждый из которых работает до 4 миллиардов:

<?
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';
1 голос
/ 19 февраля 2011

Основная проблема, которую я вижу, заключается в том, что вы не согласны со случаем $startHash.Переменные в php чувствительны к регистру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...