|
|
|
| Ответ 007 на задачу N 4.
С условиями задачи можно ознакомится по ссылке.
<?php
// Задача номер 4
//передаем функции в качестве параметров хэш и максимальное количество знаков в пароле
function decode_hash($hash, $level, $pass="")
{
global $final_pass; //определяем глобальную переменную по которой выходим из рекурсии
$level--; //вычитаем один уровень вложенности
$chars="abcdefghijklmnopqrstuvwxyz"; //массив используемых букв
for ($i=0; $i<strlen($chars); $i++)
{
if (md5($pass.$chars[$i])==$hash) $final_pass=$pass.$chars[$i]; //если хэш сходится, то запоминаем пароль
if ($level) //если глубина поиска позволяет
{
$pass.=decode_hash($hash, $level, $pass.$chars[$i]); //то рекурсивно вызываем функция для поиска следующего знака
}
if ($final_pass) return $final_pass; //если пароль найден, то выходим из всех функций
}
}
echo decode_hash("ee11cbb19052e40b07aac0ca060c23ee", 4)."<br>";
unset($final_pass);
echo decode_hash("dd97813dd40be87559aaefed642c3fbb", 4)."<br>";
unset($final_pass);
echo decode_hash("8dbc672497bdc46f88e864bb1121232c", 4)."<br>";
unset($final_pass);
echo decode_hash("3e10f8c809242d3a0f94c18e7addb866", 4)."<br>";
?>
|
За понятность можете сразу ноль ставить:) Алгоритм тоже не самый удачный. Но это работает и подбирает пароли любой длины!
http://www.softtime.ru/info/task.php?id_article=74 | |
|
|
|
|
|
|
|
для: SoftTime
(06.02.2006 в 22:10)
| | Очень компактно и читабельно, нет вложенных циклов, вместо этого реализован оригинальный механизм рекурсии, перебираемые символы содержаться в строке $char и легко могут быть расширены. К недостатку следует отнести тот факт, что пароли перебираются отдельно, а не все скопом, хотя при такой реализации это может быть и не выгодно. | |
|
|
|
|
|
|
|
для: SoftTime
(06.02.2006 в 22:10)
| | Очень компактно. Данны поясняюшие комментарии, но все же есть пара замечаний.
>> strlen($chars);
Вынести из цикла в отдельную переменную, это ускорило бы поиск.
Скрипт работает снизу вверх (от 4 до 1 уровня) а не наоборот, когда заранее не извесно число символов. Это легко исправляется и я бы предложил сделать именно так ($levels++) | |
|
|
|
|
|
|
|
для: Artem S.
(09.02.2006 в 00:03)
| | >Вынести из цикла в отдельную переменную, это ускорило бы поиск.
При этом ее пришлось бы объявлять глобальной или передавать при вызове. Но, возможно, вы правы.
>Это легко исправляется и я бы предложил
А вот тут вы ошибаетесь: скрипт ищет пароли "в массе". Именно за счет этого и достигается высокая производительность. А если внести предлагаемые вами изменения, то они ни на что не повлияют (если, конечно, исправить условие рекурсивоного вызова, в противном случае, скрипт вобще перестанет работать). | |
|
|
|
|
|
|
|
для: Loki
(09.02.2006 в 09:33)
| | >А вот тут вы ошибаетесь: скрипт ищет пароли "в массе".
А чего-то не очень понятно, если скрипт ищет в массе, почему функция decode_hash() вызывается четыре раза? | |
|
|
|
|
|
|
|
для: cheops
(09.02.2006 в 13:36)
| | Потому что мы задаем глубину поиска 4. Можно задать и 5, тогда он одинаково долго будет искать и пароли из 4 и пароли из 5 символов. | |
|
|
|
|
|
|
|
для: Loki
(09.02.2006 в 14:36)
| | Хм... а я так понял, что глубина задаётся во втором параметре... а для каждого пароля функция вызывается каждый раз по новой... | |
|
|
|
|
|
|
|
для: cheops
(09.02.2006 в 14:54)
| | Так и есть. Просто поиск происходит не по возрастающей (1, 2, 3 символьный подбор), а сплошным потоком где встречаются пароли разной длины. Да вы и сами можете посмотреть, если вывести на экран строку без хеширования. | |
|
|
|
|
|
|
|
для: Loki
(09.02.2006 в 15:33)
| | Извените не доглядел, исправлюсь =) | |
|
|
|