Последовательность рекурсивных циклов PHP не соблюдается - PullRequest
0 голосов
/ 11 декабря 2018

У меня было задание создать md5-трек из четырехсимвольной строки, используя алгоритм грубой силы.Программа принимает хеш md5 в качестве входных данных и выводит четырехзначную строку, соответствующую хешу (отсюда можно ).

Ниже приведен мой исходный код PHP.(Построен поверх уже предоставленного образца)

<!DOCTYPE html>


  Charles Severance MD5 Cracker



  MD5 cracker
  This application takes an MD5 hash of a four digit pin as string and attempts to hash all combinations to determine the original pin.
  
Debug Output:
<?php
$goodtext = "Not found";
// This is our alphabet
$txt = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,./;'[]\\-=<>?:\"{}|_+`~!@#$%^&*()";  // all possible combinations
$show=100;
// If there is no parameter, this code is all skipped
if ( isset($_GET['md5']) ) {
    $time_pre = microtime(true);
    $md5 = $_GET['md5'];
    $noOfchecks=0;
    for($i=0; $i 0 ) 
                    {
                        print "$check $try\n";
                        $show = $show - 1;
                    }
                }
            }
        }
    }
    
    // Compute elapsed time
    $time_post = microtime(true);
    
    print "Total Checks: ";
    print $noOfchecks;
    print "\n";
    print "Elapsed time: ";
    print $time_post-$time_pre;
    print "\n";
}
?>

Оригинальный текст:

Crack MD5

Программа запускается с 0000, вычисляет ееХэш md5 и сравнивает его с предоставленным хешем, и если они равны, он завершает работу и возвращает строку из четырех символов, в противном случае переходит на 0001 и так далее (пока не будет пробована вся строка $ txt ).Кроме того, для отладки он выводит первые 100 строк, для которых он вычисляет хэш и сравнивает его с хешем пользовательского ввода.

Теперь, столкнувшись с проблемой, с которой я сталкиваюсь, когда я ввожу хэш 0000, т.е.

4a7d1ed414474e4033ac29ccb8653d9b

Он начинает вычисление с 0010 shown using the debugged output, как показано выше и достигает 0000 через 58 секунд.(что не должно произойти, так как сначала нужно вычислить для 0000 и немедленно вернуться).Точно так же, если я предоставлю хеш-значение

fc1198178c3594bfdda3ca2996eb65cb

, что для числа 0010, оно начинается с 0000 и достигает 0010 через 50 секунд (и пропускается)0010 в соответствии с последовательностью и возвращается к ней через 50 с.)

Начать в 0000 Сейчас enter image description here

Пропуск 0010 и переход к 0020 вместо

enter image description here

Почему моя программа меняет порядок вычислений на основе ввода , когда он четко определен в моей инициализации цикла, т.е. 0000.

Я использую XAMPP с MAX_EXECUTION_TIME = 100 в php.ini (чтобы избежать тайм-аутов).Браузер - Google Chrome.

1 Ответ

0 голосов
/ 11 декабря 2018

Ваш код отладки печатается только тогда, когда хеш не совпадает.Поскольку вы ввели хеш для 0000, он находит совпадение с первой попытки и не печатает его.

По умолчанию оператор break выходит только из ближайшего цикла.Поэтому, когда вы находите совпадение, вы разрываете цикл, который увеличивает последнюю цифру, но продолжает другие циклы.Поэтому, когда он соответствует 0000, он переходит к следующей итерации цикла $k и пытается выполнить следующее с 0010.

. Когда вы найдете совпадение, вы должны выйти из всех циклов.Вы можете использовать break 4 для выхода из 4 уровней цикла, но лучшим способом было бы переместить циклы в функцию и использовать return $try; для возврата найденного значения.Возврат из функции завершает все циклы.

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