ich versuche zur Übung ein kleines Bruteforce-Programm zu schreiben, welches Passwörter, die mit MD5 gehasht sind, knacken soll.
Um das ganze zu beschleunigen, habe ich an Parallelisierung gedacht.
Ich muss ehrlich zugeben, dass ich mich bisher noch nicht zu sehr mit Parallelisierung auseinandergesetzt habe. Jedenfalls habe ich mich nach etwas Recherche im Internet für openmp entschieden.
Das Programm funktioniert soweit auch ganz gut. Doch bei der Erzeugung der Hashes die zum Vergleich genutzt werden sollen, wird das Ganze dann doch zu sehr ausgebremst.
Habe das Programm praktisch in zwei Variationen geschrieben.
Bei der ersten Variante werden die erzeugten Wörter direkt mit dem gesuchten Wort verglichen.
Das funktioniert wirklich sehr gut und auch sehr schnell.
Bei der zweiten Variante werden die erzeugten Wörter gehasht (MD5) und mit dem Hash des gesuchten Wortes verglichen. Funktioniert auch gut, aber dauert sehr viel länger.
Mir ist schon klar das die zweite Variante nicht so schnell sein kann wie die erste, weil die erzeugten Passwörter gehasht werden müssen.
Hier ist die Funktion, welche die Hashes erzeugt und vergleicht:
Code: Alles auswählen
static void md5_hash( const char *str )
{
    unsigned char     digest[16];
    char     	      buf[32];
    static const char hash[] 	  = "098f6bcd4621d373cade4e832627b4f6"; /* Wort: 'test' */
    static const int  hash_laenge = sizeof( hash ) - 1;
    unsigned int      i;
    MD5_CTX 	      md5;
    MD5_Init( &md5 );
    MD5_Update( &md5, ( const char * ) str, strlen( str ) );
    MD5_Final( digest, &md5 );
    for( i = 0; i < 16; i++ )
	snprintf( &buf[i*2], sizeof( buf ), "%02x", digest[i] );
    if( strncmp( buf, hash, hash_laenge ) == 0 )
    {
	printf( "!!! Passwort gefunden: '%s' !!!\n", str );
	time( &zeit2 );
        printf( "Elapsed time: %ld minutes %ld seconds.\n\n", ( zeit2 - zeit1 ) / 60, ( zeit2 - zeit1 ) % 60 );
	exit( EXIT_SUCCESS ); /* GEFUNDEN !!! */
    }
}


 Was dein Programm allerdings etwas ausbremsen könnte ist die Verwendung von snprintf und der anschließende Stringvergleich. Schneller dürfte es sein wenn du den gesuchten Hash in einen 16 Byte Buffer schreibst (Hexadezimal anstatt ASCII) und dann den berechneten Hash direkt berechnest. Eventuell könnte es auch noch schneller sein einen Hash in ein Array aus 2 64-bit oder 4 32-bit Integer zu speichern und dann nur noch 2 bzw. 4 Zahlen vergleichen. Nachdem zwei Hashwert sich sowieso sehr stark unterscheiden dürfte die Einsparung der Vergleichsoperationen nicht allzu viel ausmachen, da meist eh gleich der erste Vergleich fehlschlägt, snprintf dürfte aber potentiell doch etwas mehr Zeit brauchen.
 Was dein Programm allerdings etwas ausbremsen könnte ist die Verwendung von snprintf und der anschließende Stringvergleich. Schneller dürfte es sein wenn du den gesuchten Hash in einen 16 Byte Buffer schreibst (Hexadezimal anstatt ASCII) und dann den berechneten Hash direkt berechnest. Eventuell könnte es auch noch schneller sein einen Hash in ein Array aus 2 64-bit oder 4 32-bit Integer zu speichern und dann nur noch 2 bzw. 4 Zahlen vergleichen. Nachdem zwei Hashwert sich sowieso sehr stark unterscheiden dürfte die Einsparung der Vergleichsoperationen nicht allzu viel ausmachen, da meist eh gleich der erste Vergleich fehlschlägt, snprintf dürfte aber potentiell doch etwas mehr Zeit brauchen.