[C/C#/C++] MD5Sum

Dieses Thema im Forum "Projekte / Codes" wurde erstellt von terraNova, 16. April 2007 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 16. April 2007
    MD5Sum

    Moin,

    hab euch mal ein MD5 Summen Generator geschrieben, der euch die
    MD5 Summen der angegebenen Dateien ausgibt.

    Code:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "md5.h"
    
    void print_usage( char* );
    
    int main( int argc, char* argv[] )
    {
     int Counter = 0 ; 
     size_t SizeofMD5 = 0 ;
     unsigned char MD5Hash[33] ;
     unsigned char MD5Raw [16] ;
     
     if( argc < 2 )
     {
     print_usage( *argv );
     return 1;
     }
     
     while( *( ++argv ) ) // argv[1], ..
     {
     
     SizeofMD5 = sizeof( MD5Raw ) ;
     
     if( SizeofMD5 > 0 )
     {
     memset( MD5Raw, 0, 16 );
     memset( MD5Hash, 0, 33 );
     }
    
     md5_file( *argv, MD5Raw ); 
    
     printf( "%s: ", *argv );
     
     for(Counter = 0;Counter < 16; Counter++)
     {
     snprintf ( MD5Hash, 33, "%s%02x", MD5Hash, *MD5Raw+Counter ) ;
     }
     
     MD5Hash[32] = '\0';
     
     printf("%s\n", MD5Hash);
     }
     
     
     return 0;
    }
    
    void print_usage( char* Program )
    {
     printf( "usage: %s <file>,..\n", Program );
    }
    Zuerst wird er kompiliert, unter MinGW findet
    man den MinGW-Compiler.
    Diesen installiert ihr.

    Um den obrigen Quelltext aber zu übersetzen brauchen wir 2 Dateien, nämlich den Quelltext
    von dem MD5-Alogrithmus, md5.c und md5.h.
    Diese gibts auf xyssl.org.

    So. Nun packt ihr alle dateien in einen Ordner, den obrigen auch, aber seperat in eine andere, z.B. wie bei mir: md5sum.c.

    Nun, da ihr den Compiler installiert habt, können wir den Quelltext übersetzen.

    Start->Ausführen->cmd
    und dann auf "OK".

    Dann geht ihr in den Ordner in denen sich die Quelltexte befinden und gebt folgendes ein:

    C:\MinGW\bin\gcc.exe -o md5sum.exe md5sum.c md5.c

    Wobei der Pfad zur gcc.exe ganz davon abhängt, wo ihr den Compiler installiert habt.
    Danach findet ihr eine md5sum.exe in eurem Ordner, diese benutzt ihr wie folgt:
    md5sum.exe <datei>,..

    also, zum Beispiel wollen wir einmal die MD5 Summe von den Dateien: md5sum.exe, md5.c und der
    md5.h.

    Dazu geben wir dann folgendes ein:
    md5sum.exe md5sum.exe md5.c

    Ich hoffe ihr könnts gebrauchen .

    Edit: Hups, ich bin ja garnicht in der Showcase Abteilung, habs mal gemeldet.
    Der Beitrag wird - hoffentlich - verschoben.

    //edit by Knusperkeks: Willkommen im Showcase!
     
  2. 16. April 2007
    AW: MD5Sum

    Code:
    unsigned char MD5Hash[32];
    [...]
    MD5Hash[32] = '\0';
    [...]
    1 Byte invalid write.
    MD5HASH[32] schreibt ueber den Speicher der Variable / des Arrays hinaus.

    Siehe:
    Code:
    char a[4];
    Es gibt: a[0], a[1], ... , a[3], aber NICHT a[4].

    Mfg,

    Kolazomai
     
  3. 16. April 2007
    AW: MD5Sum

    Das Letzte ist doch für das Terminierungs-Zeichen, nicht?
     
  4. 16. April 2007
    AW: MD5Sum

    Du hast ein Array von 32 unsigned chars. Das heisst, Index 0-31 aber nicht 32. Also musst du ein Array mit 33 unsigned chars machen und dann an Index 32 terminieren.
     
  5. 16. April 2007
    AW: MD5Sum

    Ja.
    Das letzte Zeichen in char x[5]; ist aber x[4], und nicht x[5]
    Also muss/ist x[4] '\0' (sein), und nicht x[5].

    Wenn du das ueberpruefen willst:
    Code:
    #include <stdlib.h>
    int main (void)
    {
     char *x = malloc (5);
     x[5] = '\0';
     free (x);
     return 0;
    }
    Code:
    kolazomai@inSan3 [~/tmp] 
    > gcc bla.c -o bla -g3 -Wall -W -Werror 
    kolazomai@inSan3 [~/tmp] 
    > valgrind --leak-check=full --tool=memcheck ./bla
    [...]
    ==4871== Invalid write of size 1
    ==4871== at 0x400556: main (bla.c:5)
    ==4871== Address 0x4D5F035 is 0 bytes after a block of size 5 alloc'd
    ==4871== at 0x4A20B4B: malloc (in /usr/lib64/valgrind/amd64-linux/vgpreload_memcheck.so)
    ==4871== by 0x400549: main (bla.c:4)
    Mfg,

    Kolazomai
     
  6. 16. April 2007
    AW: MD5Sum

    Ok, es stimmt.

    Edit: Sry, aber reichts net wenn es mir einer sagt, anstelle von tausend Anderen.
    Muss ja net jeder den gleichen Senf in einer anderen Weise posten.
     
  7. 16. April 2007
    AW: MD5Sum

    Ja, stimmt ja auch

    x = { 'T', 'e', 's', 't', '\0' };

    x[0] = 'T';
    x[4] = '\0';

    Zaehlen wir ... 5 Chars.
    Also:
    Code:
    char x[5];
    Mfg,

    Kolazomai
     
  8. 16. April 2007
    AW: MD5Sum

    Code:
    unsigned char MD5Hash[33];
    [...]
    memset( MD5Hash, 0, 33 );
    [...]
    for(Counter = 0;Counter < 16; Counter++)
    [...]
    MD5Hash[32] = '\0';
    [...]
    Hmm, wenn ihr grad dabei seid darüber zu sprechen;
    das Terminierungszeichen ist eigentlich ganz unnötig, weil
    durch memset der Speicher von 33 Bytes [0-32] auf 0 (jedes einzelne Byte = 0) gesetzt wird
    und durch die Schleife werden Maximal 16*2 (32,0-31) Bytes angehängt,
    sodass der/das 32te Byte gar nicht Beschrieben wird und somit
    durch memset immer noch den Wert 0 hat und somit das Terminierungszeichen.

    Koriegiert mich, wenn ich das falsch sehe.

    Mfg

    Rushh0ur
     
  9. 16. April 2007
    AW: MD5Sum

    Ja ist richtig. Die Terminierung ist ueberfluessig.
     
  10. 26. April 2007
    AW: MD5Sum

    [X] Keine 1-Minuten-Programme / Copy & Paste aus dem Beispielcode.

    ~closed~

    Mfg,

    Kolazomai
     
  11. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.