Indifferent Potato
Indifferent Potato

Reputation: 85

Creating an iterator to brute force

Hi so I am trying to write a function hack() that takes no arguments and returns an iterator over all possible passwords.

Basically, I have to user an iterator to brute force a password. All I know from the question is that:

My method of thinking is this:

  1. Find all the possible combinations of POSSIBLE_WORDS by using permutations(). (Find all segment 1 possibilities)
  2. For each combination in the new list, add "Donkey20" to the end. (For example: helloBEGONEDonkey20)

  3. Find all possible combinations between the elements in THAT list and POSSIBLE_NUMBERS.

  4. Create an iterator that iterates over all these possible passwords, and return it

My current code only is able to do step 2, but instead of Donkey20 being at the end of each combination it's at the start. (e.g. Donkey20helloBEGONE instead of 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)]

Any way to fix this issue? How do I finish the remainder of the steps? Is there a different approach I could use to code this program?

Any help would be very much appreciated!

Upvotes: 0

Views: 652

Answers (1)

John Coleman
John Coleman

Reputation: 52008

First of all, there is no reason to build up POSSIBLE_NUMBERS like that. Just use range(39) or list(range(39)) instead.

Your intention in

first_words.append(MIDDLE)

was almost certainly not to tack the single word "Donkey20" onto the end of the list of all possible first parts but was instead to tack it onto the end of each first word. I think that your intention in that part of the code can be better expressed by getting rid of that line as well as the following line and just use the single line

first_half = [word + MIDDLE for word in first_words]

When you are putting together the final possible passwords, you are going to need to turn the numbers into strings. Doubtless you already know about str() but that function has the drawback that str(1) is '1' whereas you probably want '01'. In this context, you might want to use format() since format(1,'02') returns '01'.

This should be enough of a hint to get you going. Since this seems to be homework I don't want to say any more.

Upvotes: 2

Related Questions