|
|
|
| В одной из ваших книг есть следуящая задача, необходимо подобрать пароль(по условию задачи есть файл с хешами, длина пароля не превышает 4 символов и пароль содержит только латинские символы) вот код
<?php
// Устанавливаем не ограниченное время выполнения скрипта
set_time_limit(0);
//Читаем пароли из файла password
$pass = file("password");
foreach($pass as $password)
{
// Замеряем время, затраченное на подбор пароля
$begin = time();
echo decrypt_md5(trim($password),"");
$end = time();
echo " (на подбор затрачено ".($end - $begin)." секунд) <br>";
}
// Функция посимвольного перебора пароля
// $pass - расшифровываемый пароль
// $answer - текущий ответ, при первом вызове - пустая строка
function decrypt_md5($pass, $answer)
{
$arr = array('a','b','c','d','e','f',
'g','h','i','j','k','l',
'm','n','o','p','r','s',
't','u','v','x','y','z');
// Будем считать, что пароль не превышает
// 4 символов
$max_number = 3;
if(strlen($answer) > $max_number) return;
for($j = 0; $j < count($arr); $j++)
{
$temp = $answer.$arr[$j];
if(md5($temp) == $pass) return $temp;
// Рекурсивно вызываем фукнцию для увеличения
// длины подбираемого пароля
$result = decrypt_md5($pass, $temp);
// Если функция возвращает не пустую строку
// следовательно найден ответ и дальше искать
// не следует
if(strlen($result) > 0) return $result;
}
}
?>
|
но хоть убей не могу понять, как получается так что в результате мы пробегаем все возможные варианты слов состоящих из 4 букв, немогли бы вы объяснить алгоритм работы
скрипта поподробнее | |
|
|
|
|
|
|
|
для: вит
(18.02.2007 в 19:58)
| | Ну как же...
Написано "Рекурсивно вызываем функцию..."
Тоесть, на каждом этапе, к строке $answer мы прибавляем по букве и
вызываем эту же функцию, которая, в свою очередь, будет добавлять все возможные буквы,
пока не найдет результат.
Это можно было заменить 4 вложеными цыклами, но в этом прелесть рекурсии. | |
|
|
|
|
|
|
|
для: вит
(18.02.2007 в 19:58)
| | Есть более изящное решение, перебирает все английские буквы (большие и маленькие)
$string = "aaaa";
while(strlen($string) == 4)
{
echo $string .'<br>';
$string++;
}
|
| |
|
|
|