Помогите с алгоритмом разпараллеливания

Тема в разделе "WASM.ZEN", создана пользователем hawk, 8 июн 2008.

  1. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Здравствуйте.
    Подскажите пожалуйста как можно рапараллелить процесс перебора паролей.
    Постоновка задачи.
    Имеется массив символов SIM[N],в котором записанны символы которые будут перебераться в качестве пароля.
    Имеется массив PASSWORD[Z]-в этот массив будет записываться пробные пароли(перебираемые).Z-максимальная длинна пароля.
    Пароль перебирается стандартно.
    Example:
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    SIM[]="abc";
    // 1-й подбираемый пароль
    PASSWORD="a";
    // 2-й подбираемый пароль
    PASSWORD="ab";
    // 3-й подбираемый пароль
    PASSWORD="abc";
    // 4-й подбираемый пароль
    PASSWORD="acb";
    // 5-й подбираемый пароль
    PASSWORD="b";
    // 6-й подбираемый пароль
    PASSWORD="ba";
    // 7-й подбираемый пароль
    PASSWORD="bc";
    // 8-й подбираемый пароль
    PASSWORD="bac";
    // 9-й подбираемый пароль
    PASSWORD="bca";
    // 10-й подбираемый пароль
    PASSWORD="c";
    // 11-й подбираемый пароль
    PASSWORD="ca";
    // 12-й подбираемый пароль
    PASSWORD="cb";
    // 13-й подбираемый пароль
    PASSWORD="cab";
    // 14-й подбираемый пароль
    PASSWORD="cba";
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    Так вот, чтобы мне разпараллелить такой алгоритм мне нужно знать какой вид будет иметь PASSWORD после i-ой итерации.
    Если я не на правильном пути то исправьте, если на правильном то подскажите пожалуйста.
    С уважением hawk.
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    создать несколько тредов, и пусть каждый из низ обрабатывает диапазон паролей фиксированной длины L, (1 тред: 0...L-1; 2 тред: L...2L-1; ... и т.д) если проц многоядерный, то винда сама позаботится о распределении нагрузки, но и оптимизация кода не помешает
     
  3. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    А вы думаете , что такой подход будет быстрее чем по итерациям?
    Ведь когда речь идет о 10-и-20-и значных паролях создавать пароль на подюору такого пароля на мой взгляд не эффективно.А вот если такой пароль разбить на большое количество процессов каждому из которых дать в качестве начального пароля состояние исходного пароля после соответствующего номера итерации, тогда еще можно и побороться.В общем на мой взгляд такой метод наиболее ефективен из всех , что я знаю.Тема продолжается.Помогите справиться с поставленной задачей.
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Чтобы узнать длину пароля, исходя из номера итерации, тебе поможет теория вероятности - посмотри формулу сочетаний/перестановок/перемещений (там все элементарно, но я просто забыл уже, как оно считается). Вобщем, зная, сколько вариантов пароля может быть при его конкретной данной длине, ты легко сможешь вычислить длину пароля по номеру итерации.

    Что же касается самого пароля... Допустим у тебя i итераций, как превратить это в 4-х символьный пароль? Тут все еще проще. Возьми I и раздели на 26 (ну или сколько там букв в твоем алфавите). Результат деления - это номер первого символа. Раздели еще на 10, но уже остаток от предыдущего деления - получишь номер след. символа в алфавите (точнее наверное индекс символа). Когда после деления получишь 0 (т.е. последний символ был), то для выбора символа из алфавита используй остаток от деления, а не частное.

    Вот в принципе и все. Чего ж тут сложного? :)
     
  5. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Кстати, в своем первом посте ты неправильно написал варианты пароля - ты не учел, что символы будут повторяться: aaa, aab, aac, aba, abc...
     
  6. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Допустим у тебя i итераций, как превратить это в 4-х символьный пароль? Тут все еще проще. Возьми I и раздели на 26 (ну или сколько там букв в твоем алфавите). Результат деления - это номер первого символа

    Непонял.А если у меня просто 10-й значный пароль и мне его надо распаралелить на N потоков.
    Непонял.Можно проиллюстрировать в виде схемы алгоритма.
     
  7. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    И вообще какой именно алгоритм перестановок посоветуйте?
     
  8. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Сначала ты должен узнать, сколько итераций займет перебор всех вариантов пароля. Это нужно, чтобы дать каждому треду равное количество итераций. Для определения количества итераций тебе надо знать формулу размещений для каждой длины пароля. Предположим, ты планируешь перебирать пароли от 1 до n символов. Вычисляешь по формуле размещений (теория вероятности) количество вариантов 1-символьного пароля, 2-х символьного... n-символьного. Потом все складываешь и делишь на количество тредов/процессов/ботов/ну или что там у тебя будет делать перебор.

    Дальше, как превратить номер итерации в готовый пароль (кстати, в предыдущем посте я несколько неправильно написал). Есть у тебя итерация например 123456. Какому паролю она соответвтует. Предположим, количество символов в алфавите 26. Итак, делишь 123456 на 26. Получаем целое число 4748 и остаток 8. Значит, берешь из алфавита 8-й символ - это и будет первый символ пароля. Потом, снова делишь целое число на 26. 4748/26 = 182 целое и остаток 16. Значит, второй символ пароля будет равен 16-му символу в алфавите. Потом делим 182 на 26... И т.д.

    фух, по-моему так. Если че, думай дальше сам :)
     
  9. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Спосибо!!!!!!
    Единственное что осталось не понятным, это то что если у меня в алфавите допустим 2 символа,а итерация десятая, то как тогда?Для примера:алфавит-"ab",а 10-й итерации будет соответствовать "aaaaaaaaaa".Тогда получается , что этот алгоритм требует ввода параметрической зависимости?Т.е. функция должна состоять из нескольких условий?
     
  10. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    это как???
    10/2 = 5 целое и 0 в остатке. Первый символ пароля - а
    5/2 = 2 целое и 1 в остатке. Второй символ пароля - в
    2/2 = 1 целое и 0 в остатке. Третий символ пароля - а
    1/2 = 0 целове и 1 в остатке. Четверый символ пароля - в.

    Где ты 10 символов в пароле при 10 итерациях насчитал???
     
  11. hawk

    hawk New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    155
    Благодарствую за разьеснение.Респект.