Ich habe es deswegen so geschrieben, weil ich mir dachte, dass das Programm einfach mit exit( EXIT_SUCCESS ) beendet werden soll, sobald das gesuchte Wort gefunden wurde.dani93 hat geschrieben: Wenn du schon einen Integer zurückgibst, sollte der Rückgabetyp auch int sein. Oder am besten du sparst dir das EXIT_SUCCESS und lässt es bei void ^^
Stimmt, dann bleibts im Speicher. Habe ich geändert.dani93 hat geschrieben:Warum machst du "hash" eigentlich nicht static?
Habe ich auf memcmp umgeändert. Mehr dazu weiter unten.dani93 hat geschrieben:Weiters könntest du noch versuchen memcmp() (http://www.proggen.org/doku.php?id=c:lib:string:memcmp) anstatt strncmp() zu verwenden. memcmp() nimmt keine Rücksicht auf \0, was dir einige Vergleiche ersparen sollte. Aber das ist nur eine Vermutung, müsstest du testen.

Könntest du mir anhand eines kurzen Code-Beispiels zeigen, wie du das genau meinst?dani93 hat geschrieben:Sind diese Aufrufe wirklich immer notwendig?Ich weiß nicht was der Code genau macht, aber reicht es vielleicht sogar MD5_Init() ein einziges mal auf eine static-Variable aufzurufen und danach nur mehr mit MD5_Upate() und MD5_Final() zu arbeiten?Code: Alles auswählen
MD5_CTX md5; MD5_Init( &md5 ); MD5_Update( &md5, str, strlen( str ) ); MD5_Final( digest, &md5 );
Habe mal die Funktion folgendermaßen umgeschrieben. Verglichen zu vorher etwas schneller. Braucht für 'd3xt3r' 16 min. 23 sek., also 22 Sekunden weniger wie davor.:
Code: Alles auswählen
static void md5_hash( const char *str )
{
unsigned char digest[16];
/* "fc106bacc6a3d86ba0c44b8506cde35a" -> Wort: 'd3xt3r' */
static unsigned char hash[] = { 0xfc, 0x10, 0x6b, 0xac,
0xc6, 0xa3, 0xd8, 0x6b,
0xa0, 0xc4, 0x4b, 0x85,
0x06, 0xcd, 0xe3, 0x5a
};
MD5_CTX md5;
MD5_Init( &md5 );
MD5_Update( &md5, str, strlen( str ) );
MD5_Final( digest, &md5 );
if( memcmp( ( const char * )hash, ( const char * )digest, 16 ) == 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 !!! */
}
}

Hier mal die Funktion, welche die Strings erzeugt und auch die o.g. Funktion aufruft.dani93 hat geschrieben:Wie erzeugst du überhaupt "str"? Vielleicht kannst du ja damit was anfangen: http://www.proggen.org/forum/viewtopic. ... 906#p10102
An dem Code kann man noch einiges optimieren. Ist nur ein Hinweis, du hast leider nicht erwähnt woher die Strings kommen.
Code: Alles auswählen
/* Global */
time_t zeit1, zeit2;
typedef void( *func_t )( const char * );
const char zeichen[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
const int nbzeichen = sizeof( zeichen ) - 1;
/* Prototypes */
static void brute_force( const int * restrict, const int * restrict, int, func_t );
static void md5_hash( const char * );
static void brute_force( const int * restrict erster_eingang,
const int * restrict letzter_eingang, int laenge, func_t md5_hash )
{
char passwd[laenge];
int eingang[laenge];
int i, j;
for( i = 0; i < laenge; ++i )
eingang[i] = erster_eingang[i];
i = 0;
while( i < laenge )
{
/* Generiere das nächste Passwort für den Vergleichstest */
for( i = 0; i < laenge; ++i )
passwd[i] = zeichen[eingang[i]];
md5_hash( passwd ); /* generiertes Passwort hashen und testen */ <-- hier Aufruf der Funktion
/* eingang inkrementieren */
for( i = 0; i < laenge && ++eingang[laenge-i-1] == nbzeichen; i++ )
eingang[laenge-i-1] = 0;
/* return wenn eingang == letzter_eingang */
for( j = 0; j < laenge; ++j )
if( eingang[j] != letzter_eingang[j] )
break;
if( j == laenge ) /* eingang == letzter_eingang */
return;
}
}
Ja schon. Dann hatte ich dich wohl missverstanden. Du hattest geschrieben, dass sich die Hashes eigentlich so sehr unterscheiden, dass man nicht unbedingt alle Bytes miteinander vergleichen braucht. Zumindest hatte ich das so verstanden. Aber habe es jetzt folgendermaßen geändert:Kerli hat geschrieben:Sollten hier nicht eigentlich mehr Zeichen verglichen werden?3VAD_YNCAL hat geschrieben:
Code: Alles auswählen
if( strncmp( ( const char * )hash, ( const char * )digest, 5 ) == 0 )
Code: Alles auswählen
if( memcmp( ( const char * )hash, ( const char * )digest, 16 ) == 0 )
