Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Задача на подбор пароля
 
 автор: вит   (18.02.2007 в 19:58)   письмо автору
 
 

В одной из ваших книг есть следуящая задача, необходимо подобрать пароль(по условию задачи есть файл с хешами, длина пароля не превышает 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 букв, немогли бы вы объяснить алгоритм работы
скрипта поподробнее

   
 
 автор: AlMag   (19.02.2007 в 13:55)   письмо автору
 
   для: вит   (18.02.2007 в 19:58)
 

Ну как же...
Написано "Рекурсивно вызываем функцию..."
Тоесть, на каждом этапе, к строке $answer мы прибавляем по букве и
вызываем эту же функцию, которая, в свою очередь, будет добавлять все возможные буквы,
пока не найдет результат.
Это можно было заменить 4 вложеными цыклами, но в этом прелесть рекурсии.

   
 
 автор: Disable   (03.03.2007 в 21:05)   письмо автору
 
   для: вит   (18.02.2007 в 19:58)
 

Есть более изящное решение, перебирает все английские буквы (большие и маленькие)

$string = "aaaa";
 while(strlen($string) == 4)
     {
          echo $string .'<br>';
          $string++;
          }

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования