3

私はpython 2.7を使用しており、単純なマルチヘッドのmd5 dictブルートを持っています:

# -*- coding: utf-8 -*-

import md5
import Queue
import threading
import traceback

md5_queue = Queue.Queue()


def Worker(queue):
    while True:
        try:
            item = md5_queue.get_nowait()
        except Queue.Empty:
            break
        try:
            work(item)
        except Exception:
            traceback.print_exc()

        queue.task_done()


def work(param):
    with open('pwds', 'r') as f:
        pwds = [x.strip() for x in f.readlines()]

    for pwd in pwds:
        if md5.new(pwd).hexdigest() == param:
            print '%s:%s' % (pwd, md5.new(pwd).hexdigest())


def main():
    global md5_queue
    md5_lst = []
    threads = 5

    with open('md5', "r") as f:
        md5_lst = [x.strip() for x in f.readlines()]

    for m in md5_lst:
        md5_queue.put(m)    # add md5 hash to queue

    for i in xrange(threads):
        t = threading.Thread(target=Worker, args=(md5_queue,))
        t.start()

    md5_queue.join()


if __name__ == '__main__':
    main()

5 つのスレッドで動作します。各スレッドはキューから 1 つのハッシュを読み取り、パスワードのリストでそれをチェックします。非常に単純です。「for」ループで 1 スレッド 1 チェックインします。

パスワードをチェックするための 1 つのスレッドといくつかのスレッド。したがって、work() はキューからハッシュを読み取り、新しい数のスレッドを開始してパスワードをチェックする必要があります (1 スレッド ハッシュ、10 スレッドでパスワードをチェックします)。例: ハッシュを持つ 20 のスレッドと、各スレッドでハッシュをブルートするための 20 のスレッド。そんな感じ。

これどうやってするの?

PS私の説明で申し訳ありません。私が何を望んでいるのか理解できなかったかどうか尋ねてください。

PPS それは md5 をブルーティングすることではなく、マルチスレッドについてです。

ありがとう。

4

2 に答える 2

4

Python のデフォルトの実装 (CPython と呼ばれる) は、グローバル インタープリター ロック(GIL) を使用して、一度に 1 つのスレッドしか実行できないようにします。I/O バウンドのマルチスレッド アプリケーションの場合、これは通常問題にはなりませんが、あなたのような CPU バウンドのアプリケーションの場合、マルチコアのスピードアップがあまり見られないことを意味します。

Jython などの GIL を持たない別の Python 実装を使用するか、GIL を持たない別の言語を使用するようにコードを書き直すことをお勧めします。ネイティブ コンパイル コードで記述するのは良い考えですが、MD5 関数を備えたほとんどのスクリプト言語は通常、ネイティブ コードでそれを実装しているため、正直なところ、ネイティブ コンパイル言語とスクリプト言語の間の高速化はあまり期待できません。

于 2012-08-02T18:40:38.480 に答える
1

次のコードは、サンプル コードよりもかなり効率的なプログラムになると思います。

from __future__ import with_statement

try:
    import md5
    digest = lambda text: md5.new(text).hexdigest()
except ImportError:
    import hashlib
    digest = lambda text: hashlib.md5(text.encode()).hexdigest()

def main():
    passwords = load_passwords('pwds')
    check_hashes('md5', passwords)

def load_passwords(filename):
    passwords = {}
    with open(filename) as file:
        for word in (line.strip() for line in file):
            passwords.setdefault(digest(word), []).append(word)
    return passwords

def check_hashes(filename, passwords):
    with open(filename) as file:
        for code in (line.strip() for line in file):
            for word in passwords.get(code, ()):
                print (word + ':' + code)

if __name__ == '__main__':
    main()

Python 2.x と 3.x の両方で書かれており、どちらの言語でも実行できるはずです。

于 2012-08-02T20:57:01.713 に答える