Forum: Compiler & IDEs MD5 Verschlüsselung in C


von Micha (Gast)


Lesenswert?

Hallo,

ich möchte einen eingelesenen String in MD5 verschlüsseln, doch leider 
verstehe ich nicht ganz die Abläufe die abgearbeitet werden.

Hat jemand ein funktionierendes Beispiel das einfach in ein bestehendes 
Programm eingebunden werden kann ?

Über eine schnelle Antwort wäre ich dankbar!

Gruß Micha

: Gesperrt durch User
von c♯-Hasser (Gast)


Lesenswert?

MD5 ist keine Verschlüsselung, sondern ein Hash.
Also sowas wie eine Prüfsumme.
Immer noch was du brauchst?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Opensource-Implementierungen davon findest du mit minimaler Suche
genügend (openssl, BSD libc, GNU libc).  Was genau fehlt dir denn?

von Micha (Gast)


Lesenswert?

Ok, sorry für die Verwechslung... ich meine natürlich "Hash".

Ich lese einen 16Byte Hex-Code ein. Darauf soll der Hash berechnet 
werden aber ich komme mit der implementierung nicht zurecht.

Ich habe mir mal die files runtergeladen 
(http://sourceforge.net/projects/libmd5-rfc/files/) aber ich verstehe 
den Quellcode nicht ganz. Liegt wahrscheinlich auch daran.

Ich will einfach die 16Bytes aus einem Array der "md5_finish" Funktion 
übergeben und den fertig gerechneten Hash in ein weiteres 16Byte Array 
speichern.
Eigentlich ganz simpel aber wie gesagt.... ich verstehe den Code nicht 
ganz!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Micha schrieb:

> Ich lese einen 16Byte Hex-Code ein. Darauf soll der Hash berechnet
> werden

Das ist nahezu widersinnig. ;-)  MD5 selbst ergibt 128 Bit, also
16 Bytes.  Du könntest also gleich deine 16 Bytes selbst als
Unterscheidungskriterium benutzen ...

> Ich habe mir mal die files runtergeladen
> (http://sourceforge.net/projects/libmd5-rfc/files/) aber ich verstehe
> den Quellcode nicht ganz.

Muss man das?

Normalerweise sollte man die Dokumentation verstehen.  Tja, sowas
ist aber für die Leute dieses Projekts offenbar ein Fremdwort.

Hier mal ein Auszug aus der FreeBSD-Manpage für md5(3):
1
     #include <sys/types.h>
2
     #include <md5.h>
3
4
     void
5
     MD5Init(MD5_CTX *context);
6
7
     void
8
     MD5Update(MD5_CTX *context, const void *data, unsigned int len);
9
10
     void
11
     MD5Pad(MD5_CTX *context);
12
13
     void
14
     MD5Final(unsigned char digest[16], MD5_CTX *context);
15
...
16
     The MD5Init(), MD5Update(), and MD5Final() functions are the core func-
17
     tions.  Allocate an MD5_CTX, initialize it with MD5Init(), run over the
18
     data with MD5Update(), and finally extract the result using MD5Final().

Vielleicht kannst du ja an Hand dieser Erklärung deinen Weg durch
die Benutzung der Funktionen deiner Bibliothek finden.

Wenn es dir nur auf die Benutzung des MD5-Algorithmusses ankommt,
würde ich an deiner Stelle nicht unbedingt versuchen, die
Implementierung selbst zu verstehen.

von Micha (Gast)


Lesenswert?

Gibt es dazu auf die passende *.c und *.h File... habe mir grad das 
Packet von http://www.openssl.org/source/ runtergeladen aber die 
genannten Funktionen befinden sich nicht in den MD5-Files !

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

So?
1
% cat /usr/src/crypto/openssl/crypto/md5/md5.h
2
/* crypto/md5/md5.h */
3
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
4
 * All rights reserved.
5
 *
6
 * This package is an SSL implementation written
7
 * by Eric Young (eay@cryptsoft.com).
8
 * The implementation was written so as to conform with Netscapes SSL.
9
...
10
 */
11
12
...
13
int MD5_Init(MD5_CTX *c);
14
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
15
int MD5_Final(unsigned char *md, MD5_CTX *c);
16
...

von Micha (Gast)


Lesenswert?

Sorry wenn ich gerade auf dem Schlauch stehe aber wo sind die 
Funktionsdeklarationen für "MD5_Init", "MD5_Update", .... ?

md5.c
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <openssl/md5.h>
4
5
#define BUFSIZE  1024*16
6
7
void do_fp(FILE *f);
8
void pt(unsigned char *md);
9
#if !defined(_OSD_POSIX) && !defined(__DJGPP__)
10
int read(int, void *, unsigned int);
11
#endif
12
13
int main(int argc, char **argv)
14
  {
15
  int i,err=0;
16
  FILE *IN;
17
18
  if (argc == 1)
19
    {
20
    do_fp(stdin);
21
    }
22
  else
23
    {
24
    for (i=1; i<argc; i++)
25
      {
26
      IN=fopen(argv[i],"r");
27
      if (IN == NULL)
28
        {
29
        perror(argv[i]);
30
        err++;
31
        continue;
32
        }
33
      printf("MD5(%s)= ",argv[i]);
34
      do_fp(IN);
35
      fclose(IN);
36
      }
37
    }
38
  exit(err);
39
  }
40
41
void do_fp(FILE *f)
42
  {
43
  MD5_CTX c;
44
  unsigned char md[MD5_DIGEST_LENGTH];
45
  int fd;
46
  int i;
47
  static unsigned char buf[BUFSIZE];
48
49
  fd=fileno(f);
50
  MD5_Init(&c);
51
  for (;;)
52
    {
53
    i=read(fd,buf,BUFSIZE);
54
    if (i <= 0) break;
55
    MD5_Update(&c,buf,(unsigned long)i);
56
    }
57
  MD5_Final(&(md[0]),&c);
58
  pt(md);
59
  }
60
61
void pt(unsigned char *md)
62
  {
63
  int i;
64
65
  for (i=0; i<MD5_DIGEST_LENGTH; i++)
66
    printf("%02x",md[i]);
67
  printf("\n");
68
  }


md5.h
1
#ifndef HEADER_MD5_H
2
#define HEADER_MD5_H
3
4
#include <openssl/e_os2.h>
5
#include <stddef.h>
6
7
#ifdef  __cplusplus
8
extern "C" {
9
#endif
10
11
#ifdef OPENSSL_NO_MD5
12
#error MD5 is disabled.
13
#endif
14
15
/*
16
 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
17
 * ! MD5_LONG has to be at least 32 bits wide. If it's wider, then !
18
 * ! MD5_LONG_LOG2 has to be defined along.         !
19
 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
20
 */
21
22
#if defined(__LP32__)
23
#define MD5_LONG unsigned long
24
#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)
25
#define MD5_LONG unsigned long
26
#define MD5_LONG_LOG2 3
27
/*
28
 * _CRAY note. I could declare short, but I have no idea what impact
29
 * does it have on performance on none-T3E machines. I could declare
30
 * int, but at least on C90 sizeof(int) can be chosen at compile time.
31
 * So I've chosen long...
32
 *          <appro@fy.chalmers.se>
33
 */
34
#else
35
#define MD5_LONG unsigned int
36
#endif
37
38
#define MD5_CBLOCK  64
39
#define MD5_LBLOCK  (MD5_CBLOCK/4)
40
#define MD5_DIGEST_LENGTH 16
41
42
typedef struct MD5state_st
43
  {
44
  MD5_LONG A,B,C,D;
45
  MD5_LONG Nl,Nh;
46
  MD5_LONG data[MD5_LBLOCK];
47
  unsigned int num;
48
  } MD5_CTX;
49
50
int MD5_Init(MD5_CTX *c);
51
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
52
int MD5_Final(unsigned char *md, MD5_CTX *c);
53
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
54
void MD5_Transform(MD5_CTX *c, const unsigned char *b);
55
#ifdef  __cplusplus
56
}
57
#endif
58
59
#endif

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Micha schrieb:
> Sorry wenn ich gerade auf dem Schlauch stehe aber wo sind die
> Funktionsdeklarationen für "MD5_Init", "MD5_Update", .... ?

Die Deklarationen habe ich dir doch gezeigt ...

Du meinst vermutlich die Definitionen.  Hmm, hast du denn keinen
grep?
1
% grep MD5_Init /usr/src/crypto/openssl/crypto/md5/*.c
2
/usr/src/crypto/openssl/crypto/md5/md5.c:       MD5_Init(&c);
3
/usr/src/crypto/openssl/crypto/md5/md5_dgst.c:int MD5_Init(MD5_CTX *c)
4
/usr/src/crypto/openssl/crypto/md5/md5_one.c:   if (!MD5_Init(&c))

Ist also offenbar in md5_dgst.c.

von Micha (Gast)


Lesenswert?

Ich bekomme es einfach nicht hin... :-(

Kann mir jemand mal an einem Bsp. zeigen wie das funktionieren soll ?
Also Fkt. Aufruf und Übergabe der umzuwandelnden Daten!

Ich sitze schon den ganzen Tag davor um bin kein Meter weiter gekommen 
:-)

Gruß Micha

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ich versteh' ehrlich nicht, was denn daran nun so schwer ist ...
1
#include <sys/types.h>
2
#include <openssl/md5.h>
3
#include <stdio.h>
4
#include <string.h>
5
6
#define STRING "The quick brown fox jumps over the lazy dog.\n"
7
8
int
9
main(void)
10
{
11
  MD5_CTX ctx;
12
  unsigned char digest[16];
13
  int i;
14
15
  MD5_Init(&ctx);
16
  MD5_Update(&ctx, STRING, strlen(STRING));
17
  MD5_Final(digest, &ctx);
18
19
  for (i = 0; i < 16; i++)
20
    printf("%02x", digest[i]);
21
  putchar('\n');
22
23
  return 0;
24
}

(Das bezieht sich auf die OpenSSL-Implementierung, nicht auf die
von mir weiter oben zitierte FreeBSD-Implementierung.  Letztlich
unterscheiden sich die Namen jedoch nur um einen Unterstrich, die
Benutzung ist ansonsten gleich.)
1
% cc -O -g -o mymd5 mymd5.c -lcrypto
2
% ./mymd5
3
0d7006cd055e94cf614587e1d2ae0c8e

Zum Vergleich:
1
% echo The quick brown fox jumps over the lazy dog. > /tmp/foo
2
% md5sum /tmp/foo
3
0d7006cd055e94cf614587e1d2ae0c8e  /tmp/foo

Passt.

von Micha (Gast)


Lesenswert?

Danke Jörg !!!!

Soweit bin ich jetzt mal das ich es initialisieren kann, jetzt habe ich 
aber ein anderes Problem.

Ich habe ja 16 HEX Werte die ich umwandel möchte. Wie bekomme ich die am 
elegantesten zu einer Zeichenkette umgewandelt damit ich daraus einen 
Hash Code erzeugen kann.

Im Anschluss muss dieser Hash wieder in ein HEX-Wert umgewandelt werden, 
den ich dann zum abgleich versende.

Ich habe es jetzt mal so ausprobiert, es kommt aber hierbei ein falscher 
Hash-Code raus!
1
sprintf(hex_to_str, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", sg_data[0], 
2
sg_data[1], sg_data[2], sg_data[3], sg_data[4], sg_data[5], 
3
sg_data[6], sg_data[7], sg_data[8], sg_data[9], sg_data[10], 
4
sg_data[11], sg_data[12], sg_data[13], sg_data[14], sg_data[15]);
5
  
6
md5_init(&ctx);
7
md5_append(&ctx, hex_to_str, strlen(hex_to_str));
8
md5_finish(digest, &ctx);
9
10
sprintf(str_to_hex, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", 
11
digest[0], digest[1], digest[2], digest[3], digest[4], digest[5], digest[6], digest[7], 
12
digest[8], digest[9], digest[10], digest[11], digest[12], digest[13], digest[14], digest[15]);

von Rolf Magnus (Gast)


Lesenswert?

Micha schrieb:
> Soweit bin ich jetzt mal das ich es initialisieren kann, jetzt habe ich
> aber ein anderes Problem.
>
> Ich habe ja 16 HEX Werte die ich umwandel möchte. Wie bekomme ich die
> am elegantesten zu einer Zeichenkette umgewandelt damit ich daraus
> einen Hash Code erzeugen kann.

Was verstehst du denn unter "HEX Werte"? Hexadezimal ist erstmal nur ein 
Darstellungsformat. Meinst du damit evtl. einfach nur Bytes?

> Ich habe es jetzt mal so ausprobiert, es kommt aber hierbei ein
> falscher Hash-Code raus!
>
> sprintf(hex_to_str, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", sg_data[0],
> sg_data[1], sg_data[2], sg_data[3], sg_data[4], sg_data[5],
> sg_data[6], sg_data[7], sg_data[8], sg_data[9], sg_data[10],
> sg_data[11], sg_data[12], sg_data[13], sg_data[14], sg_data[15]);

Sind sg_data[0 bis 15] tatsächlich Zeiger auf char? Was du mit dieser 
Zeile machst, ist 16 Strings zu einem langen Gesamtstring verketten.

> md5_init(&ctx);
> md5_append(&ctx, hex_to_str, strlen(hex_to_str));

Ich könnte mir vorstellen, du suchst ganz einfach:
1
md5_append(&ctx, sg_data, 16);

> md5_finish(digest, &ctx);
> sprintf(str_to_hex, 
"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
> digest[0], digest[1], digest[2], digest[3], digest[4], digest[5], digest[6], 
digest[7],
> digest[8], digest[9], digest[10], digest[11], digest[12], digest[13], 
digest[14], digest[15]);

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Micha schrieb:
> Im Anschluss muss dieser Hash wieder in ein HEX-Wert umgewandelt werden,
> den ich dann zum abgleich versende.

Das habe ich ja oben bereits demonstriert, wie man das macht.

von Micha (Gast)


Lesenswert?

Vielleicht drücke ich mich etwas unvollständig aus, daher nochmal 
ausführlich:
Ich habe 16 HEX Werte in einem Array (z.b 0x12) die an die Funktion 
hash() übergeben werden und aus diesen soll ein HEX-Hash-Code erstellt 
werden.

Meine Funktion hierzu sieht wie folgt aus, wobei hier aber noch kein 
korrekter Hash erzeugt wird und ich den Fehler einfach nicht finde.

Muss ich denn überhaupt aus dem HEX-Array ein String machen oder geht 
das auch einfacher ?
Was muss verändert werden, damit ich endlich mal was sinnvolles als 
Ergebnis raus bekomme ?
Danke & Gruß Micha
1
void hash(uint8_t *sg_data)
2
{
3
  md5_state_t ctx;
4
  unsigned char digest[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
5
  unsigned char hex_to_str[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};    // HEX -> STR
6
7
  // **** Formatiere HEX Array in einen String ****  ??? notwendig ???
8
  sprintf(hex_to_str, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", sg_data[0], 
9
  sg_data[1], sg_data[2], sg_data[3], sg_data[4], sg_data[5], 
10
  sg_data[6], sg_data[7], sg_data[8], sg_data[9], sg_data[10], 
11
  sg_data[11], sg_data[12], sg_data[13], sg_data[14], sg_data[15]);
12
  
13
  md5_init(&ctx);
14
  md5_append(&ctx, hex_to_str, strlen(hex_to_str));
15
  md5_finish(digest, &ctx);
16
17
   
18
  // **** Sende MD5 Hash ****
19
  send_msg(digest);
20
21
  return 0;
22
}

von Rolf Magnus (Gast)


Lesenswert?

Micha schrieb:
> Vielleicht drücke ich mich etwas unvollständig aus, daher nochmal
> ausführlich:
> Ich habe 16 HEX Werte

Also nochmal: Was verstehst du unter "HEX Werte"?

> Muss ich denn überhaupt aus dem HEX-Array ein String machen oder geht
> das auch einfacher ?

Wieso solltest du einen String machen müssen? md5_append erwartet 
offensichtlich ein Array der Bytes, von denen du den Hash bilden willst, 
und du hast ein Array aus Bytes, von denen du den Hash bilden willst. 
Wozu also irgendwelche String-Hantierereien?

> Was muss verändert werden, damit ich endlich mal was sinnvolles als
> Ergebnis raus bekomme ?
> Danke & Gruß Micha
>
> void hash(uint8_t *sg_data)
> {
>   md5_state_t ctx;
>   unsigned char digest[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
>   unsigned char hex_to_str[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};    // HEX -> 
STR
>
>   // **** Formatiere HEX Array in einen String ****  ???

Wie ich schon vermutet habe, ist dein Array nicht "HEX", sondern einfach 
nur ein Array aus Bytes. "Hex" ist eine Form der Darstellung. Wenn du 
von "HEX" schreibst, gehe ich erstmal von einem String aus, in dem eine 
hexadezimale Darstellung eines Wertes steht, z.B. "0x2F". Das hast du 
hier aber gar nicht.

>   sprintf(hex_to_str, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", sg_data[0],
>   sg_data[1], sg_data[2], sg_data[3], sg_data[4], sg_data[5],
>   sg_data[6], sg_data[7], sg_data[8], sg_data[9], sg_data[10],
>   sg_data[11], sg_data[12], sg_data[13], sg_data[14], sg_data[15]);

Eigentlich würde ich erwarten, daß GCC hier 16 Warnungen ausgibt, weil 
die Typen völlig falsch sind. Du interpreterst hier jedes Element (also 
jedes Byte) von sg_data als einen Zeiger auf einen String. Und diese 16 
Strings versuchst du mit dem Code zu einem langen Gesamtstring zu 
verketten. Dabei kommt natürlich kompletter Unsinn raus.

>   md5_init(&ctx);
>   md5_append(&ctx, hex_to_str, strlen(hex_to_str));

Mein Vorschlag hat nicht funktioniert?

>   md5_finish(digest, &ctx);
>
>
>   // **** Sende MD5 Hash ****
>   send_msg(digest);
>
>   return 0;
> }

von Micha (Gast)


Lesenswert?

Hallo Rolf,

leider hat dein Vorschlag nicht die erhofften Lösung gebracht.
Ich habe jetzt nochmal drüber geschaut und paar Fehler gefunden.
Also "md5_append" verlangt ein Array (siehe unten) das habe ich jetzt 
auch verstanden :-) Ich habe jetzt auch alle Datentypen angepasst (hatte 
1-2 anstatt "md5_byte_t = unsigned char" als uint8_t definiert.

Leider funktioniert die Umwandlung noch immer nicht korrekt.
Die verbesserte Hash-Funktion steht ganz unten.
1
/* Initialize the algorithm. */
2
void md5_init(md5_state_t *pms);
3
4
/* Append a string to the message. */
5
void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
6
7
/* Finish the message and return the digest. */
8
void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);

1
void hash(md5_byte_t *sg_data)
2
{
3
  md5_state_t ctx;
4
  md5_byte_t digest[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
5
  
6
  md5_init(&ctx);
7
  md5_append(&ctx, sg_data, 16);
8
  md5_finish(&ctx, digest);
9
10
  set_hash_msg(digest);  // Fertigen Hash in Botschaftsrahmen übertragen
11
  
12
  // **** Sende MD5 Hash ****
13
  send(digest);
14
15
  return 0;
16
}

von Micha (Gast)


Lesenswert?

Ich habe gerade bemerkt das bei dem Funktionsaufruf "md5_append(&ctx, 
sg_data, 16);" an Stelle sg_data der Datentyp "md5_byte_t" übergeben 
wird und nicht der erwartete "const md5_byte_t".
Kann das ein Problem sein ?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Micha schrieb:

> /* Initialize the algorithm. */
> void md5_init(md5_state_t *pms);
>
> /* Append a string to the message. */
> void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
>
> /* Finish the message and return the digest. */
> void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);

Warum deklarierst du diese selbst?  Dafür gab's doch bei OpenSSL schon
ein Headerfile.

>   md5_byte_t digest[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

Die Initialisierung ist flüssiger als Wasser.  (Ganz davon
abgesehen, "md5_byte_t digest[16] = {0};" hätte den gleichen
Effekt.)

Was an diesem Code noch falsch sein soll, kann dir so allerdings
niemand sagen.  Vielleicht gibst du uns ja mal die 16 Bytes und den
dafür von dir erwarteten Hashwert?

Micha schrieb:
> Ich habe gerade bemerkt das bei dem Funktionsaufruf "md5_append(&ctx,
> sg_data, 16);" an Stelle sg_data der Datentyp "md5_byte_t" übergeben
> wird und nicht der erwartete "const md5_byte_t".
> Kann das ein Problem sein ?

Nein, natürlich nicht.  Das "const" da besagt nur, dass die aufgerufene
Funktion am Inhalt, auf den der Zeiger zeigt, nichts zu ändert gedenkt.

von Micha (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Warum deklarierst du diese selbst?  Dafür gab's doch bei OpenSSL schon
> ein Headerfile.

Mach ich doch garnicht... habe dafür eine fertige *.h udn *.c File 
genommen.
Download: 
http://sourceforge.net/projects/libmd5-rfc/files/libmd5-rfc/2002-04-13/md5.tar.gz/download

> Was an diesem Code noch falsch sein soll, kann dir so allerdings
> niemand sagen.  Vielleicht gibst du uns ja mal die 16 Bytes und den
> dafür von dir erwarteten Hashwert?

Die zu übergebenen Bytes ändern sich ständig und somit auch der zu 
erwartende Hash. Daher kann ich auch kein Beispiel aufzeigen.

Werde noch etwas rumprobieren und den Erfolg/Misserfolg dann posten !

Thx, Micha

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Micha schrieb:

> Die zu übergebenen Bytes ändern sich ständig und somit auch der zu
> erwartende Hash. Daher kann ich auch kein Beispiel aufzeigen.

Irgendwoher musst du doch aber wissen, dass deine bisherigen Rechnung
nicht stimmt.  Wie willst du das denn ermitteln, wenn nicht mit einem
Beispiel?

von michael (Gast)


Lesenswert?

Ist zwar schon uralt der Thread, aber ich habe auch gerade versucht die 
anfangs erwähnte libmd5-rfc (http://sourceforge.net/projects/libmd5-rfc) 
von L. Peter Deutsch zu verwenden. Und bin dabei auf diese Seite 
gelangt. ;-)

Ich habe es hinbekommen und vielleicht hilft es ja noch dem ein oder 
anderen hier. Oder jemandem der, wie ich, durch suchen auf diese Seite 
kommt.
1
#include "md5.h"
2
#include <math.h>
3
#include <stdio.h>
4
#include <string.h>
5
6
int main(void)
7
{
8
        int i;
9
        char text[] = "hallo";
10
        md5_state_t state;
11
        md5_byte_t digest[16];
12
13
        md5_init(&state);
14
        md5_append(&state, (const md5_byte_t *)text, strlen(text));
15
        md5_finish(&state, digest);
16
17
        printf("md5 hash of string %s = ", text);
18
        for(i=0; i < 16; i++)
19
        {
20
            printf("%02x", digest[i]);
21
        }
22
        printf("\n");
23
24
        return 0;
25
}

von Joe F. (easylife)


Lesenswert?

Gratulation.
Du hast mich jetzt gerade dazu gebracht 10 Minuten lang einen 4 Jahre 
alten Deppen-Thread zu lesen, nur um am Ende zu erfahren, dass du deinen 
großartigen Programmier-Erfolg kundtun wolltest.

Danke dafür.

von r_u_d_i (Gast)


Lesenswert?

und ich wollte von 2011 micha grad fragen was in
sg_data[x] steht , der hex oder das char also 0x31 oder '1'
;-)

man man man die kellerleichen immer
aber gut , es gibt dann also eine lösung

prima! gut gemacht michael,
bist du der micha aus 2011 und es hat jetzt 4 jahre gedauert?

;-)

lg rudi ;-)

von Bitflüsterer (Gast)


Lesenswert?

DER Wahnsinn, Mann!

Nach vier Jahren hast Du also geschafft, einen Code anzuwenden. Respekt.
Wir haben auch nur ca. 50.000 Jahre gebraucht, um, nach Deinen 
Vorfahren, ein Genie wie Dich zu gebären, aufzuziehen und am Leben zu 
erhalten. Aber das Ergebnis rechtfertigt die ganzez Mühen. Ach! Ich 
hätte da noch ein Gurkenglas, das ich nicht aufkriege. Könntest Du bitte 
mal ... Das wäre nett.

von R. W. (Gast)


Lesenswert?

;-)
> hätte da noch ein Gurkenglas, das ich nicht aufkriege.
> Könntest Du bitte mal

mit einem löffel an der seite anheben dann geht auch hier die luft raus 
wie im thread ;-)
...
moin moin

von Mark B. (markbrandis)


Lesenswert?

Bitflüsterer schrieb:
> Nach vier Jahren hast Du also geschafft, einen Code anzuwenden.

Das steht so nirgends. Wer lesen kann, ist klar im Vorteil.

von Karl H. (kbuchegg)


Lesenswert?

Ich mach dann mal dicht.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.