md5 hashen



  • Ich weiß schon, aber irgendwie will er meinen code nicht annehmen.
    Vll hast du einen Vorschlag wie ich eine eingabe eines strings realisieren kann der dann in den Hash gewandelt wird...

    mfg,
    Sol



  • Eher 102-116. Mit ein paar Änderungen (Rückgabe des Wertes 'digest' statt dessen Ausgabe über MDPrint) genau das Gesuchte.



  • Kannst du mal den Code posten?

    Zu dem 1. Beispiel:

    MD5_CTX context;
      int len;
      unsigned char buffer[1024], digest[16];
    
      ...
    
     MDInit (&context);
     while (len = fread (buffer, 1, 1024, file))
       MDUpdate (&context, buffer, len);
     MDFinal (digest, &context);
    
     ...
    

    Buffer ist doch einfach eine Byte-Folge. Sehe nicht, was da jetzt so schwer sein soll eine Zeichenkette zu übergeben.



  • Solstice schrieb:

    Vll hast du einen Vorschlag wie ich eine eingabe eines strings realisieren kann der dann in den Hash gewandelt wird...

    siehe MDTestSuite()



  • ihoernchen hat wohl heute die Sonnenbrille auf.......

    Noch einmal! Nimm diese Funktion hier:

    static void MDString (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");
    }
    

    und baue sie so um, dass 'digest' nicht per MDPrint() ausgegeben wird sondern als Rückgabewert der Funktion benutzt wird. Dann hast Du es doch, z.B. so:

    static void MDString2 (string, digest)
    char *string;
    char *digest;
    {
      MD5_CTX context;
      unsigned int len = strlen (string);
    
      MDInit (&context);
      MDUpdate (&context, string, len);
      MDFinal (digest, &context);
    }
    


  • Also in Fortgechrittenem Programmieren bin ich leider nicht wirklich klasse.

    Das was ich da versuche zu Proggen ist so ne art projekt aus interresse.
    Ich hab grad mal die nötigsten grundkenntnisse.

    welche variable soll ich mit dem string belegen?...

    buffer?
    digest?

    Ich weiß es einfach net....

    mfg,
    Sol

    Edit...
    hoppla... warst schneller.. ich probier das erstmal...



  • string (oder in dem anderen Code-Schnipsel buffer) ist die Eingabe.
    digest die Ausgabe (der Hash).

    jencas schrieb:

    ihoernchen hat wohl heute die Sonnenbrille auf.......

    Wir haben den Beitrag etwa zeitgleich angefangen zu schreiben. Ich hab etwas länger gebraucht.

    Um die Verwirrung gering zu halten:
    Die beiden geposteten Code-Schnipsel machen das selbe.
    MDString ist bereits die fertige Funktion die du suchst.



  • Hmm aber wenn ich sie in einer main funktion benutzen will:

    error C2084: Funktion 'int __cdecl main()' hat bereits einen Funktionsrumpf
    

    hab 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...
    Entweder

    char str[100]; // für 100 Zeichen
    

    oder

    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,
    Sol

    Edit.:
    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 sein
    

    Mist 🙄

    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,
    Sol

    Hmm...
    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


Anmelden zum Antworten