3

I'm trying to make a password cracker in Python as practice, and I've noticed that it takes on average 586,634 iterations to crack the password "hey". I'm thinking it's so high because it can freely generate a random string that may have already been checked. For example, it could generate the following and use extra time doing so, when it's already found that it doesn't work.

a!?, h[j, jpc, o$w, 01g, a5b, a!?, 01g

So how do I stop Python from generating the same string over and over?

Here's my code (the length that it generates is determined by the input's length):

while crack!=password:
        i+=1
        crack=''.join(random.choice(string.ascii_letters + string.digits + string.punctuation) for _ in range(length))
1
  • 7
    Instead of using random, you should try generating all possible permutations.
    – Selcuk
    Commented Mar 10, 2016 at 1:52

1 Answer 1

1

Try this out. It generates all possible 3 letter combinations. You can replace 2 with whatever length you want. Also note that I turned the iterator that results from product into a list. If you just need to loop over it once, it is better to not convert it to a list first, since that eats up more memory. Just get rid of the list() function call.

import itertools
import string

letters = string.lowercase + string.uppercase + string.punctuation + string.digits
all_possible =  list(itertools.product(letters, repeat=3))
test_pws = ['hey', 'h9!', '!!!']
for i,possible_pw in enumerate(all_possible):
    pw = "".join(possible_pw)
    if pw  in test_pws:
        print 'Found ', pw, ' at iteration ', i

print all_possible[:5]
print len(all_possible)
print len(set(all_possible))
print all_possible[-5:]

Output

Found  hey  at iteration  62252
Found  h9!  at iteration  70646
Found  !!!  at iteration  464412

[('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'a', 'c'), ('a', 'a', 'd'), ('a', 'a', 'e')]
830584
830584
[('9', '9', '5'), ('9', '9', '6'), ('9', '9', '7'), ('9', '9', '8'), ('9', '9', '9')]
0

Not the answer you're looking for? Browse other questions tagged or ask your own question.