1

私は主に次の数行を中心に回転するいくつかのコードを持っています:

#! /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

プログラムは基本的にブルートフォース攻撃であり、出力には時間がかかる可能性があるため、プログラムがまだ実行中かクラッシュしたかを知る必要があるため、試行された文字の組み合わせの数と、おそらく最後に試した文字列は何でしたが、それを行う方法がわかりません。

よろしくお願いします

4

3 に答える 3

9

enumerate候補者を数えるために使用します。

for i, candidate in enumerate(chain, 1):
    if i % 100 == 0:
        print("%d'th candidate: %s" % (i, candidate))
    # perform actual work
于 2012-11-27T13:49:56.390 に答える
1
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)
于 2012-11-27T13:49:22.783 に答える
0

OK、最初に他の例を見てみましょう:

import time
import sys

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

それを実行すると、iの実行時の値が出力されます。

'\r'での注意

したがって、コードで次のようなことを行うことができます。

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)

出力値が増加している場合は、プログラムが実行中であることを意味します。そして、あなたでさえあなたの所有者コードを追加して残り時間を決定することができます。

于 2012-11-27T14:01:13.933 に答える