2016-04-21 5 views
0

Привет, поэтому я пытаюсь написать функцию hack(), которая не принимает аргументов и возвращает итератор по всем возможным паролям.Создание итератора для грубой силы

В принципе, я должен использовать итератор для перебора пароля. Все, что я знаю из вопроса, что:

  • Пароль состоит из трех сегментов.
  • Первый сегмент пароля представляет собой объединение двух слов в следующем списке слов: [ «привет», «Прочь», «собака», «MrCool»]
  • Средний сегмент «Donkey20»
  • и последний сегмент состоит из двух цифр, которые вместе (т.е. 1 и 7 = 17), не являются не больше, чем 38. (и по крайней мере 0)

Мой метод мышления заключается в следующем:

  1. Найти все возможные комбинации POSSIBLE_WORDS с помощью перестановок Дополнения(). (Найти все возможности сегмента 1)
  2. Для каждой комбинации в новом списке добавьте «Donkey20» до конца. (Например: helloBEGONEDonkey20)

  3. Найти все возможные комбинации между элементами в списке THAT и POSSIBLE_NUMBERS.

  4. Создание итератора, который перебирает все эти возможные пароли, и вернуть его

Моего текущий код только в состоянии сделать шаг 2, но вместо того, чтобы Donkey20 быть в конце каждой комбинации это на начало. (Например, Donkey20helloBEGONE вместо helloBEGONEDonkey20)

POSSIBLE_WORDS = ["hello", "BEGONE", "dog", "MrCool"] 
MIDDLE = "Donkey20" 
possible_numbers1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 
possible_numbers2 = [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28] 
possible_numbers3 = [29, 30, 31, 32, 33, 34, 35, 36, 37, 38] 
POSSIBLE_NUMBERS = possible_numbers1 + possible_numbers2 + possible_numbers3 

from itertools import permutations, combinations 

def hack(): 
    first_words = [''.join(word) for word in permutations(POSSIBLE_WORDS, 2)] 
    first_words.append(MIDDLE) 
    first_half = [''.join(word) for word in permutations(first_words, 2)] 

В любом случае, чтобы устранить эту проблему? Как закончить оставшуюся часть шагов? Есть ли другой подход, который я мог бы использовать для кодирования этой программы?

Любая помощь будет очень признательна!

ответ

2

Прежде всего, нет причин строить POSSIBLE_NUMBERS вот так. Просто используйте вместо этого range(39) или list(range(39)).

Ваше намерение в

first_words.append(MIDDLE) 

почти наверняка не лавировать одно слово «Donkey20» на конец списка всех возможных первых частей, но был вместо того, чтобы лавировать его в конец от каждая первое слово. Я думаю, что ваши намерения в той части кода может быть более выражен, избавившись от этой линии, а также в следующей строке и использовать только одну строку

first_half = [word + MIDDLE for word in first_words] 

Когда вы воедино окончательные возможные пароли, вам нужно будет превратить числа в строки.Несомненно, вы уже знаете о str(), но эта функция имеет тот недостаток, что str(1) является '1', тогда как вы, вероятно, хотите '01'. В этом контексте вы можете использовать format(), так как format(1,'02') возвращает '01'.

Этого должно быть достаточно намека на то, чтобы вы пошли. Поскольку это, похоже, домашнее задание, я не хочу больше говорить.

+0

Благодарим вас за эти намеки, я действительно смог завершить остаток самостоятельно! –

Смежные вопросы