user1816467
user1816467

Reputation:

Python: How do I print a statement when a for loop completes a number of times?

I have some code which mainly revoles around the following couple of lines:

#! /usr/bin/env python

from crypt import crypt
import itertools
from string import ascii_letters, digits

def decrypt(all_hashes, salt, charset=ascii_letters + digits + '-' + '/'):
    products = (itertools.product(charset, repeat=r) for r in range(10))
    chain = itertools.chain.from_iterable(products)
    for i, candidate in enumerate(chain, 1):
        if i % 100 == 0:
            print ('%d th candidate: %s' % (i, candidate))
        hash = crypt(''.join(candidate), salt)
        if hash in all_hashes:

            yield candidate, hash
            all_hashes.remove(hash)

        if not all_hashes:
            return

all_hashes = ('aaRrt6qwqR7xk', 'aaacT.VSMxhms' , 'aaWIa93yJI9kU',
'aakf8kFpfzD5E', 'aaMOPiDnXYTPE', 'aaz71s8a0SSbU', 'aa6SXFxZJrI7E',
'aa9hi/efJu5P.', 'aaBWpr07X4LDE', 'aaqwyFUsGMNrQ', 'aa.lUgfbPGANY',
'aaHgyDUxJGPl6', 'aaTuBoxlxtjeg', 'aaluQSsvEIrDs', 'aajuaeRAx9C9g',
'aat0FraNnWA4g', 'aaya6nAGIGcYo', 'aaya6nAGIGcYo', 'aawmOHEectP/g',
'aazpGZ/jXGDhw', 'aadc1hd1Uxlz.', 'aabx55R4tiWwQ', 'aaOhLry1KgN3.',
'aaGO0MNkEn0JA', 'aaGxcBxfr5rgM', 'aa2voaxqfsKQA', 'aahdDVXRTugPc',
'aaaLf47tEydKM', 'aawZuilJMRO.w', 'aayxG5tSZJJHc', 'aaPXxZDcwBKgo',
'aaZroUk7y0Nao', 'aaZo046pM1vmY', 'aa5Be/kKhzh.o', 'aa0lJMaclo592',
'aaY5SpAiLEJj6', 'aa..CW12pQtCE', 'aamVYXdd9MlOI', 'aajCM.48K40M.',
'aa1iXl.B1Zjb2', 'aapG.//419wZU')

all_hashes = set(all_hashes)
salt = 'aa'
for candidate, hash in decrypt(all_hashes, salt):
    print 'Found', hash, '! The original string was', candidate

The program is basically a Brute Force attack and because the output can take a while I need to know if the program is still running or has crashed so I was thinking of having an output statement that says how many combinations of characters have been tried and maybe what the last tried string was but have no idea how to do it.

Thanks in advance for assistance

Upvotes: 1

Views: 122

Answers (3)

Yueyoum
Yueyoum

Reputation: 3073

OK, Let's take an other example first:

import time
import sys

for i in range(30):
    sys.stdout.write('\r%d'%i)
    sys.stdout.flush()
    time.sleep(0.1)

run it, it will print the runtime values of i.

Attention at '\r'

So, you can do something like this in your code:

chain = itertools.chain.from_iterable(products)
i = 0
for candidate in chain:
    sys.stdout.write('\r%d'%i)
    sys.stdout.flush()
    i += 1
    hash = crypt(''.join(candidate), salt)

If the output value is increasing, means that your program are running. And even your can add your owner code to determine the remaining time.

Upvotes: 0

Fred Foo
Fred Foo

Reputation: 363787

Use enumerate to count the candidates.

for i, candidate in enumerate(chain, 1):
    if i % 100 == 0:
        print("%d'th candidate: %s" % (i, candidate))
    # perform actual work

Upvotes: 9

Itay Karo
Itay Karo

Reputation: 18296

PRINT_COUNT = 10
chain = itertools.chain.from_iterable(products)
count = 0
for candidate in chain:
  hash = crypt(''.join(candidate), salt)
  count = count + 1
  if count % PRINT_COUNT == 0:
    print "count = " + str(count)

Upvotes: 1

Related Questions