bruteforce mit meheren threads



  • Servus!

    Ich habe mir eine kleine Klasse bruteforce geschrieben. Diese generiert alle möglichen Zeichenkombinationen. Das funktioniert soweit super. Dieser String bzw. array<char,1> kann ich von meinem Hauptprogramm auslesen und dann daraus einen md-5 Hash berechnen.
    Jetzt habe ich in meinem Hauptprogramm also eine Thread erstellt der diese Aufgabe übernimmt. Allerdings bekomme ich nur eine CPU-Auslastung von ~50% hin, da nicht alle Kerne den selben Thread ausführen können. Um jetzt mein Programm ein wenig zu beschleunigen, würde ich gerne das so viele Threads wie Kerne im System diese Aufgabe übernehmen.
    Meine Überlegung ist, dass meine bruteforce Klasse in einem eigenen thread (meinet wegen thread_brute) läuft. Dieser hat nur die Aufgabe einen Wert zu generieren und ihn für die anderen Worker-Threads bereit zustellen. Wenn jetzt eine Worker-Thread sich den String abgeholt hat, um den hash zu berechnen, soll der thread_brute die nächste Kombination erstellen und wieder für die Workerthreads bereit halten. Quasi bei einem 4-kern-system: 1 Brutforcethread für die Kombination und 4 Workerthreads die den Hash generieren und mit dem ausgangshash vergleichen.

    Leider weiß ich nicht genau wie ich sowas realiesieren soll. Also z.b. das der thread_brute so lange wartet bis irgendein workerthread den String sich geschnappt hat und erst dann wieder einen neuen generiert. Oder auch wie ich diese Variable gegenüber den anderen threads locken muss damit nicht 2 Workerthreads die selbe Kombination testen. In c# gibt es ja richtig eine lock funktion, aber bei cli doch nicht, oder?

    Wäre über jeden Tip dankbar!

    EDIT: Meine Rechtschreibung ist heute mal wieder unter aller Sau 😃

    EDIT2: Das ganze dient im übrigen einem Projekt hier an der Uni zum Thema Netzsicherheit. Hab dazu auch ne tolle Software bzw. Konsolenprogramm endeckt. Wen's interessiert: http://3.14.by/en/md5 ! Das Prog schafft auf meinem doch schon etwas in die Jahre gekommenen AMD X2 Turion Laptop sage und schreibe 25 Millionen Hashes pro Sekunde. Mein Prog schafft derzeit (allerdings auch nur mit einem Kern) 45 000 hashes pro Sekunde. Allerdings ist das Ding auch garantiert in Assambler programmiert und nicht in CLI 😉



  • Allerdings ist das Ding auch garantiert in Assambler programmiert und nicht in CLI

    Was genau gar nichts über die Performance aussagt.



  • Hallo,

    falls du evtl. schon .NET 4.0 benutzt, könntest du die "Task Parallel Library" (TPL) dafür benutzen. Diese verteilt die Threads dann automatisch auf die zur Verfügung stehenden Prozessoren (bzw. Kerne).
    Die Einstiegsklassen wären "Parallel" (mit den Methoden For() und ForEach()) sowie "Task".
    Es gibt auch dort die "BlockingCollection", mit welcher man relativ einfach Werte zwischen Threads austauschen kann, d.h. ein (oder mehrere) Threads schreibt Werte hinein und ein (oder mehrere) Thread holt sich dann die berechneten Werte der Reihe nach ab (GetConsumingEnumerable), s. z.B. http://blogs.msdn.com/b/csharpfaq/archive/2010/08/12/blocking-collection-and-the-producer-consumer-problem.aspx
    (ich hoffe, dies entspricht genau deinen Anforderungen 😉

    Und hier noch der Link zur TPL: http://msdn.microsoft.com/de-de/library/dd460717.aspx
    (wobei ich selber die TPL bisher nur in C# benutzt habe)



  • Was genau gar nichts über die Performance aussagt.

    1. Hab gerade gesehen der Typ gibt seit neustem das als open source frei und es ist c++ und
    2. Sagt das ne menge über die Geschwindigkeit aus, wenn sich der Typ mit Assambler auskennt. Du bist einfach eine Ebene tiefer und hardwarenäher als mit C und co. Und was dein compiler dann letztendlich wie in Assambler umrechnet und dies dann wieder eine Etage tiefer umrechnet kannst du nicht bei C und co bestimmen. Wenn du allerdings schon in der Assambler-Etage bist kannst du schon mal eine Ebene die doof kompiliert wegnehmen.
    3. Hab gerade gesehen, dass das bei weitem noch nicht der schnellste md5-cracker ist. Wen's interressiert einfach mal http://blog.zorinaq.com/?e=42 klicken. Das tool nennt sich WhitePixel. Und schafft unglaubliche 32 Billionen Hashes/sekunde ^^ (mit 4 dual-GPU AMD Radeon HD 5970)



  • Th69 schrieb:

    Hallo,

    falls du evtl. schon .NET 4.0 benutzt, könntest du die "Task Parallel Library" (TPL) dafür benutzen. Diese verteilt die Threads dann automatisch auf die zur Verfügung stehenden Prozessoren (bzw. Kerne).
    Die Einstiegsklassen wären "Parallel" (mit den Methoden For() und ForEach()) sowie "Task".
    Es gibt auch dort die "BlockingCollection", mit welcher man relativ einfach Werte zwischen Threads austauschen kann, d.h. ein (oder mehrere) Threads schreibt Werte hinein und ein (oder mehrere) Thread holt sich dann die berechneten Werte der Reihe nach ab (GetConsumingEnumerable), s. z.B. http://blogs.msdn.com/b/csharpfaq/archive/2010/08/12/blocking-collection-and-the-producer-consumer-problem.aspx
    (ich hoffe, dies entspricht genau deinen Anforderungen 😉

    Und hier noch der Link zur TPL: http://msdn.microsoft.com/de-de/library/dd460717.aspx
    (wobei ich selber die TPL bisher nur in C# benutzt habe)

    Danke für den Tip! Aber leider arbeitete ich noch mit VS 2008 bzw. mit Framework 3.5 - Wenn nicht muss ich halt mal die VS 2010 installieren und mich damit einarbeiten


Anmelden zum Antworten