ФорумПрограммированиеPHP для идиотов → распределенная система подбора пароля

распределенная система подбора пароля

  • speedleader

    Сообщения: 28 Репутация: N Группа: Кто попало

    Spritz 10 октября 2007 г. 4:36, спустя 10 минут 36 секунд

    1) ;)
    2) как вариант. но несколько "неудобочитаемо" при отладке ))
    3) какие конкретно моменты не представляешь? ) Как проверить тайм-аут ответа? ) Как отделить "быстрые" машинки от медленных? Как замерить время, за которое машина выполняет задание? ) Система распределения очень проста, для этого не нужно особых знаний ПХП, буквально:
    1) при появлении свободной машины отдаем ей весь диапазон перебора.
    2) при появлении еще одной свободной машины отдаем САМОЙ НАГРУЖЕННОЙ машине (с самым большим обрабатываемым диапазоном) команду - "а ну-ка поделись половиной несделанного с машиной N2!!!". Самая нагруженная бьет ОСТАВШИЙСЯ диапазон пополам, и отправляет команду новоприбывшему. В итоге получаем почти равномерную загрузку. Разумеется, следует учитывать уровни дискретности (блок в 1000 паролей легче перебрать самому, нежели делить пополам и пересылать другому).

  • Patrick

    Сообщения: 506 Репутация: N Группа: Кто попало

    Spritz 10 октября 2007 г. 4:48, спустя 12 минут 6 секунд

    какие конкретно моменты не представляешь?

    да практически все….
    Я как представлю скока мути, волосы дыбом становятся, реально задача на Диплом….
  • speedleader

    Сообщения: 28 Репутация: N Группа: Кто попало

    Spritz 10 октября 2007 г. 4:56, спустя 8 минут 9 секунд


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


    А кто говорил, что будет легко? ) *постучал 3 раза по дереву, чтобы его не приперло вот так вот с учебой )))*
    Мне интереснее, где такие задания дают ))) Где такому учат…если, конечно, это не личная инициатива студента.
  • Unique

    Сообщения: 3 Репутация: N Группа: Кто попало

    Spritz 10 октября 2007 г. 19:16, спустя 14 часов 19 минут 46 секунд


    <?php

    /* вывод формы для выбора метода перебора */
    echo '
    <form action=md5.php method=POST>
    <table border=1 align=center width=60%>
    <tr bgcolor=#ED9F4C align=center>
    <td><h3><input type=radio name=method checked=1 value=brute> Прямой перебор</h3></td>
    <td><h3><input type=radio name=method value=dict> Перебор по словарю</h3></td>
    </tr>';

    echo '
    <tr bgcolor=#FBFBD1>
    <td valign=top>
    Количество символов: от <input type=text value='.(!empty($_POST['min'])?$_POST['min']:'1').' name=min size=2 maxlength=2> до <input type=text value='.(!empty($_POST['max'])?$_POST['max']:'3').' name=max size=2 maxlength=2><br>
    Использовать символы:<br>
    <input type=checkbox checked=true name=big_AZ> A - Z<br>
    <input type=checkbox checked=true name=small_az> a - z<br>
    <input type=checkbox checked=true name=digits> 0 - 9<br>
    <input type=checkbox checked=true name=spec> <input type=text value="[email protected]#$%^&*()_-" name=spec_str><br>

    </td>
    <td valign=top>Адрес словаря: <input type=text value="http://" name=path2dic></td>
    </tr>
    </table>';
    echo '
    <p align=center>
    MD5-хэш: <input type=text name=hash size=40 maxlength=32 value='.(!empty($_POST['hash'])?$_POST['hash']:'').'>
    <br><br>
    <input type=submit value="Начать перебор">
    </p>
    </form>';
    /* проверка, выбран ли метод перебора */
    if (!empty($_POST['method']))
    {
    /* проверка, указан ли хэш */
    if (!empty($_POST['hash']))
    $hash = $_POST['hash'];
    else
    {
    echo 'Ошибка: не введен хэш!';
    exit;
    }
    /* задаем начальные значение для пароля и количества комбинаций*/
    $pass = 'не найден';
    $combs = 0;
    /* проверка, выбран ли метод перебора */
    if (!empty($_POST['method']))
    {
    /* проверка, указан ли хэш */
    if (!empty($_POST['hash']))
    $hash = $_POST['hash'];
    else
    {
    echo 'Ошибка: не введен хэш!';
    exit;
    }
    /* задаем начальные значение для пароля и количества комбинаций*/
    $pass = 'не найден';
    $combs = 0;
    if ($_POST['method'] == 'brute')
    {
    //строка символов, которые допустимы в пароле
    $str = '';

    //подключение символов от A до Z
    if (!empty($_POST['big_AZ']) && $_POST['big_AZ'])
    for($i=65;$i<91;$i++)
    $str .= chr($i);

    //подключение символов от a до z
    if (!empty($_POST['small_az']) && $_POST['small_az'])
    for($i=97;$i<123;$i++)
    $str .= chr($i);

    //подключение цифр от 0 до 9
    if (!empty($_POST['digits']) && $_POST['digits'])
    $str .= '0123456789';

    //подключение символов, которые ввел пользователь
    if (!empty($_POST['spec']) && $_POST['spec'] && !empty($_POST['spec_str']))
    $str .= $_POST['spec_str'];

    //проверка на пустую строку
    if ($str == '')
    {
    echo 'Ошибка: не выбраны символы для перебора!';
    exit; //выход
    }

    //проверка, заданы ли значение длины пароля
    if (empty($_POST['min']) || empty($_POST['max']))
    {
    echo 'Ошибка: не задана одна из величин!';
    exit;
    }

    $min = $_POST['min'];
    $max = $_POST['max'];

    //проверка на размеры минимального и максимального значений
    if ($min>$max)
    {
    echo 'Ошибка: неверно заданы величины!';
    exit;
    }

    //подсчет количества возможных сочетаний
    for($i=$min;$i<=$max;$i++)
    $combs += pow(strlen($str),$i);

    $l = strlen($str);
    $a[100][2] = '';
    $c[100] = 0;
    $y = 0;

    /* перебор всех возможных сочетаний символов */

    for($m=$min;$m<=$max;$m++)
    {
    $inc = $m;
    for($f=0;$f<100;$f++)
    $c[$f] = 0;

    for($j=0;$j<$l;$j++)
    {
    $a[$j][1] = $str[$j];
    $a[$j][2] = $j;
    }

    do
    {
    $cur = '';
    for ($j=0;$j<$inc;$j++){
    for ($k=0;$k<$l;$k++){
    if ($c[$j]==$a[$k][2])
    {
    $cur.=$a[$k][1];
    $k=$l+1;
    }
    }
    }
    //если хэш текущей строки равен указанному хэшу
    if ($_POST['hash'] == md5($cur))
    {
    $pass = $cur; //запоминаем текущую строку как пароль
    break; //прерываем выполнение цикла перебора
    }

    $c[$inc-1]+=1;
    for ($j=$inc-1;$j>0;$j–){
    if ($c[$j]>$l-1){
    $c[$j]=$c[$j]-$l;
    $c[$j-1]=$c[$j-1]+1;
    }
    }
    }
    while ($c[0]<$l);
    //если пароль найден
    if ($pass != 'не найден')
    break; //прерываем выполнение цикла
    }

    }
    if ($_POST['method'] == 'dict')
    {
    //проверка, указан ли путь к словарю
    if (!empty($_POST['path2dic']))
    {
    $path2dic = $_POST['path2dic'];
    //заносим все слова из файла в массив
    $words = @file($path2dic) or die('Ошибка: словарь не найден!');
    //подсчет количества слов
    $combs = count($words);

    $pass = '';
    //перебор массива
    for($i=0;$i<$combs;$i++)
    {
    //если идентичный хэш найден
    if (md5(trim($words[$i])) == $hash)
    {
    //запоминаем пароль
    $pass = trim($words[$i]);
    //заканчиваем перебор
    break;
    }
    }
    }
    }
    echo '<table border=1><tr><td>';
    echo 'Кол-во комбинаций: <font color=green>'.$combs;
    echo '</font></td></tr><tr><td>Пароль: <font color=red>'.$pass;
    echo '</font></td></tr></table>';
    }
    ?>

    А вот насчет того, чтобы сделать ее еще и распределенной - вообще не догоняю
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 10 октября 2007 г. 20:57, спустя 1 час 40 минут 48 секунд

    Очень многа неотформатированных букаф…

    Запускаете сценарий по перебору script.php?char=a, он смотрит параметр и начинает перебирать все варианты, начинающиеся на "a", запускаете параллельно script.php?char=b, script.php?char=c, вот и распределенная в простейшем случае :)

    Или делаете сайт, раскручиваете его до тех пор, пока на него не будут ходить миллион человек в день и на каждой странице подсовываете пользователем javascript-скриптик, который перебирает небольшую часть возможных вариантов. Распределили вычисления на машины пользователей :)
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 12 октября 2007 г. 0:34, спустя 1 день 3 часа 37 минут


    Очень многа неотформатированных букаф…

    Запускаете сценарий по перебору script.php?char=a, он смотрит параметр и начинает перебирать все варианты, начинающиеся на "a", запускаете параллельно script.php?char=b, script.php?char=c, вот и распределенная в простейшем случае :)

    Или делаете сайт, раскручиваете его до тех пор, пока на него не будут ходить миллион человек в день и на каждой странице подсовываете пользователем javascript-скриптик, который перебирает небольшую часть возможных вариантов. Распределили вычисления на машины пользователей :)


    надо гугли посоветовать, это в их масштабе)) сервис взлом-забытых-паролей от гугл))
    https://smappi.org/ - платформа по созданию API на все случаи жизни

Пожалуйста, авторизуйтесь, чтобы написать комментарий!