md5 hashen
-
Hmm aber wenn ich sie in einer main funktion benutzen will:
error C2084: Funktion 'int __cdecl main()' hat bereits einen Funktionsrumpfhab die main ganz unten unter
static void MDPrint (digest) unsigned char digest[16]; { unsigned int i; for (i = 0; i < 16; i++) printf ("%02x", digest[i]); getchar(); }eingefügt...
Wie beheb ich das?
mfg,
Sol
-
Solstice schrieb:
Wie beheb ich das?
Zeile 77-98 entfernen??? Compiler geben selten so hilfreiche Fewhlermeldungen aus wie in Deinem Fall

-
Hmm... ok... die fehlermeldung ist weg....
wenn da nicht dieses aber wäre...ich geb nen string ein und er sagt mir
md5cracks.exe hat ein Problem festgestellt und muss beendet werden
Na super...
geb mal nochmal den code:
/* MDDRIVER.C - test driver for MD2, MD4 and MD5 */ /* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All rights reserved. RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this documentation and/or software. */ /* The following makes MD default to MD5 if it has not already been defined with C compiler flags. */ #ifndef MD #define MD 5 #endif #include <stdio.h> #include <time.h> #include <string.h> #include "global.h" #if MD == 2 #include "md2.h" #endif #if MD == 4 #include "md4.h" #endif #if MD == 5 #include "md5.h" #endif /* Length of test block, number of test blocks. */ #define TEST_BLOCK_LEN 1000 #define TEST_BLOCK_COUNT 1000 static void MDString PROTO_LIST ((char *)); static void MDTimeTrial PROTO_LIST ((void)); static void MDTestSuite PROTO_LIST ((void)); static void MDFile PROTO_LIST ((char *)); static void MDFilter PROTO_LIST ((void)); static void MDPrint PROTO_LIST ((unsigned char [16])); #if MD == 2 #define MD5_CTX MD2_CTX #define MDInit MD2Init #define MDUpdate MD2Update #define MDFinal MD2Final #endif #if MD == 4 #define MD5_CTX MD4_CTX #define MDInit MD4Init #define MDUpdate MD4Update #define MDFinal MD4Final #endif #if MD == 5 #define MD5_CTX MD5_CTX #define MDInit MD5Init #define MDUpdate MD5Update #define MDFinal MD5Final #endif /* Main driver. Arguments (may be any combination): -sstring - digests string -t - runs time trial -x - runs test script filename - digests file (none) - digests standard input */ /* int main (argc, argv) int argc; char *argv[]; { int i; if (argc > 1) for (i = 1; i < argc; i++) if (argv[i][0] == '-' && argv[i][1] == 's') MDString (argv[i] + 2); else if (strcmp (argv[i], "-t") == 0) MDTimeTrial (); else if (strcmp (argv[i], "-x") == 0) MDTestSuite (); else MDFile (argv[i]); else MDFilter (); return (0); } */ /* Digests a string and prints the result. */ static void MDString2 (string) char *string; { MD5_CTX context; unsigned char digest[16]; unsigned int len = strlen (string); MDInit (&context); MDUpdate (&context, string, len); MDFinal (digest, &context); printf ("MD%d (\"%s\") = ", MD, string); MDPrint (digest); printf ("\n"); } static void MDString (string, digest) char *string; char *digest; { MD5_CTX context; unsigned int len = strlen (string); MDInit (&context); MDUpdate (&context, string, len); MDFinal (digest, &context); } /* Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte blocks. */ static void MDTimeTrial () { MD5_CTX context; time_t endTime, startTime; unsigned char block[TEST_BLOCK_LEN], digest[16]; unsigned int i; printf ("MD%d time trial. Digesting %d %d-byte blocks ...", MD, TEST_BLOCK_LEN, TEST_BLOCK_COUNT); /* Initialize block */ for (i = 0; i < TEST_BLOCK_LEN; i++) block[i] = (unsigned char)(i & 0xff); /* Start timer */ time (&startTime); /* Digest blocks */ MDInit (&context); for (i = 0; i < TEST_BLOCK_COUNT; i++) MDUpdate (&context, block, TEST_BLOCK_LEN); MDFinal (digest, &context); /* Stop timer */ time (&endTime); printf (" done\n"); printf ("Digest = "); MDPrint (digest); printf ("\nTime = %ld seconds\n", (long)(endTime-startTime)); printf ("Speed = %ld bytes/second\n", (long)TEST_BLOCK_LEN * (long)TEST_BLOCK_COUNT/(endTime-startTime)); } /* Digests a reference suite of strings and prints the results. */ static void MDTestSuite () { printf ("MD%d test suite:\n", MD); MDString (""); MDString ("a"); MDString ("abc"); MDString ("message digest"); MDString ("abcdefghijklmnopqrstuvwxyz"); MDString ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); MDString ("1234567890123456789012345678901234567890\ 1234567890123456789012345678901234567890"); } /* Digests a file and prints the result. */ static void MDFile (filename) char *filename; { FILE *file; MD5_CTX context; int len; unsigned char buffer[1024], digest[16]; if ((file = fopen (filename, "rb")) == NULL) printf ("%s can't be opened\n", filename); else { MDInit (&context); while (len = fread (buffer, 1, 1024, file)) MDUpdate (&context, buffer, len); MDFinal (digest, &context); fclose (file); printf ("MD%d (%s) = ", MD, filename); MDPrint (digest); printf ("\n"); } } /* Digests the standard input and prints the result. */ static void MDFilter () { MD5_CTX context; int len; unsigned char buffer[16], digest[16]; MDInit (&context); while (len = fread (buffer, 1, 16, stdin)) MDUpdate (&context, buffer, len); MDFinal (digest, &context); MDPrint (digest); printf ("\n"); } /* Prints a message digest in hexadecimal. */ static void MDPrint (digest) unsigned char digest[16]; { unsigned int i; for (i = 0; i < 16; i++) printf ("%02x", digest[i]); getchar(); } main(){ char *str; scanf("%s",&str); MDString(str); printf ("/s",str); }mfg,
Sol
-
Du hast keinen Speicher für str reserviert...
Entwederchar str[100]; // für 100 Zeichenoder
char str* = malloc(100); // für 100 Zeichen ... free(str); // am Ende den mit malloc angefordertern Speicher freigeben
-
Solstice schrieb:
Ich hab grad mal die nötigsten grundkenntnisse.
"Mach" am besten ein oder zwei Tutorials und kleine Sachen, bevor du an sowas rangehst. Ansonsten wirst du mehr Frust als Lust haben.
Strings, Speicher, Zeiger etc. sollten dir ein Begriff sein.
-
gut ok... soweit...
Mit speicherverwaltung kenn ich mich leider noch ned aus...Soweit funzt es jetzt, aber die funktion... wie ruf ich die jetzt auf...
ich hab bereits:MDString(str);und
str = MDString(str);und auch mit dem Zweiten Parameter experimentiert.
irgendwie scheind die funktion anders zu funktionieren wie ich sonst so kenne.hab ich das gefühl...
im momantanen:
main(){ char str[100]; scanf("%s",&str); MDString(str); printf ("%s",str); }liefert er mir nur das zurück was ich eingegeben habe....
Ich hoff ich hab euch dann genug gelöchert...
Edit:
Sie sind mir grob ein begriff.
ich hatte vorher noch nie mit der deklaration von nem string *string gearbeitet.
Zeiger ham wir erst kürzlich gehabt.aber halt net so tiefgreifend wie ihr ^^
Speicherverwaltung kommt noch...mfg,
Sol
-
ihoernchen schrieb:
Solstice schrieb:
Ich hab grad mal die nötigsten grundkenntnisse.
"Mach" am besten ein oder zwei Tutorials und kleine Sachen, bevor du an sowas rangehst. Ansonsten wirst du mehr Frust als Lust haben.
Strings, Speicher, Zeiger etc. sollten dir ein Begriff sein.FullAck! Denn seine Selbsteinschätzung würde ich vorsichtig mal als "dezent übertrieben" einstufen

-
Solstice schrieb:
main(){ char str[100]; scanf("%s",&str); MDString(str); printf ("%s",str); }liefert er mir nur das zurück was ich eingegeben habe....
Ja, denn genau das hast Du codiert. Der Hash steckt in der Varaiblen 'digest' von MDString()!
main(){ char str[100]; char digest[16]; scanf("%s",&str); MDString2(&str, &digest); printf ("%.16s",&digest); }Kann sein, dass da ein paar '&' zuviel drin sind, meine Pure-C Zeiten liegen mittlerweile schon Jahre zurück...
-
Wie du meinst ^^
Es is halt so, dass ich es halt nebenher in der schule lern und ich mich so interressier.
Jetzt wollt ich halt mal was größeres machen, als nur durchschnittsrechner oder spielereien, sondern was, was ich auch gebrauchen kann.Nebenbei mach ich noch php, da bin ich besser drin, aber das is mit C irgendwann nicht mehr zu vergleichen.
Am anfang isses ja noch relativ gleich, aber auf der komplexen ebene von C Häng ich dann...Im Prinzip ist das was ich machen will, ein php-script in ein c-programm umschreiben.
in php ist die md5 halt schon von vornherein da, daher is das kein Thema.
Die PHP is bei mir schon fertig und funzt.Für das C Programm fehlt mir nur noch der md5 Umwandler.
Dann fertig.mfg,
SolEdit.:
Wieder zu langsam...
Gut.. die adressen haste schon richtig eingegeben.
Ich hab mal wieder vergessen was wir erst letzte woche gehabt haben... mit den Speicherplätzen, dass man da die adressen nehmen soll "&string".So ich hoff die restlichen Probleme kann ich selber beheben.. will euch ja nicht alles machen lassen. Vielen dank für die Hilfe.
mfg,
Sol
-
Na, dann viel Erfolg!!
-
Doch noch ein problem... sry...
Ich müsste nun einen eingegebenen Hash Wert mit dem erstellten Hash Wert vergleichen. Da digest aber 16 stellen hat, und mein anderer string 32 Stellen (im Array belegt) hab ich mir Folgendes einfallen lassen:
main(){ char str[100]; char test[16]; char test2[16]; scanf("%s",&str); MDString2(&str, &digest); for (i = 0; i < 16; i++) { printf ("%.02x", digest[i]); } printf ("\n\n"); for (i = 0; i < 32; i++) { test[i] = getchar(); } // ein Arrayelement mit 2 Zusammengehörigen HEX belegen for (i = 0; i < 32; i++) if (1%2==1) { int var = (i+1)/2; test2[var] = test[i-1].test[i]; } for (i = 0; i < 16; i++) printf("%x",test2[i]); printf ("\n\n"); getchar(); //Verzögerung getchar(); return 0; }Allerdings funktioniert das nicht so wie ich mir das so wunderbar vorstelle...
error C2224: Der linke Teil von '.test' muss eine Struktur/Union seinMist

Weiß einer rat?
später will ich beide vergleichen, und wenn das geht, kann ich mein und das md5 Programm miteinander verbinden. Die eingabe oben von dem 32 Stellen test ist dem wie es im anderen teil des programms ist, nachempfunden, auch damit ihr wisst, wie die belegungen sind.Vll. önnt ihr mir nochmal helfen... ich hab mich echt angestrengt und gegoogels was das zeug hält...
mfg,
Sol
-
Nimm sprintf, dann hast Du das direkt wie Du es brauchst in dem bei sprintf angegebenen Buffer liegen.
---
If you are forced to reinvent the wheel at least try to invent a better one!
-
Ok... sprintf kenn ich noch überhaupt nicht...
könntest du mir das freundlicherweise näher erklären?danke.
mfg,
SolHmm...
Also ich habs schon soweit, dass es mir beides identisch ausgibt, aber er hat es nicht identisch in den arrays drinstehn.
Ich fummel da immer noch...
gibts nicht sowas wie ne implode oder explode funktion wie bei PHP?
das würd mir n schritt weiterhelfen.mfg,
Sol
-
So... im moment habe ich:
Ausgabe von digest per %x ist der Ausgabe von dem Eingabestring mit %c gleich.
ich müsste das aber ja so haben, dass beide dieselbe Ausgabe mit %c oder %x haben,
So ist es im Moment:
Array 1(Hexadezimal Formatiert):
a[0] = 8f; a[1] = a1; a[2] = 4c; a[3] = dd; a[4] = 75; a[5] = 4f; a[6] = 91; a[7] = cc; a[8] = 65; a[9] = 54; a[10] = c9; a[11] = e7; a[12] = 19; a[13] = 29; a[14] = ce; a[15] = e7;Array 2(Zeichenformatiert (ASCII)):
a[0] = 8; a[1] = f; a[2] = a; a[3] = 1; a[4] = 4; a[5] = c; a[6] = d; a[7] = d; a[8] = 7; a[9] = 5; a[10] = 4; a[11] = f; a[12] = 9; a[13] = 1; a[14] = c; a[15] = c; a[16] = 6; a[17] = 5; a[18] = 5; a[19] = 4; a[20] = c; a[21] = 9; a[22] = e; a[23] = 7; a[24] = 1; a[25] = 9; a[26] = 2; a[27] = 9; a[28] = c; a[29] = e; a[30] = e; a[31] = 7;Vll seht ihr schon das Problem.
Sie haben Zwar in allem den Gleichen inhalt, aber im prinzip doch nicht, weil Array 2 ist ja in ASCII und hat 32 Einzelzeichen und Array 1 hat 15 Einzelzeichen, die in HEX formatiert sind...
wie jetzt also diese Vergleichen?
-
Lösung doch gefunden:
for (i = 0; i < 16; i++) { sprintf(hex, "%x", digest[i]); for (j = 0; j <2 ; j++) { var = i*2+j+1; printf ("%c//%c\n",hex[j],test[var]); if (hex[j] != test[var]) ishash = 'n'; } } if (ishash == n) printf("F*CK!!"); else printf("YEEHAAA");Also einfach wars net

Nochmal Thx für die Hilfe...
mfg,
Sol