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 !!! */
}
}