# MD5 Verschlüsselung



## chefkochx (16. Februar 2005)

Hallo
ich will ein kleines programm schreiben, mit dem man einfach ein Wort (z.B. "test") in MD5 verschlüsseln kann
Leider musste ich feststellen das mir da die Befehle fehlen und ich über google nix brauchbares gefunden hab...
Ich denke ich brauch da auch noch ne Lib. oder?
Vielleicht kann mir ja jemand mal einen kleinen Beispielcode geben
Wär echt goil

Gruß
Chefkoch


----------



## BadMourning (16. Februar 2005)

Guckst du hier:

Source MD5 

Viel Erfolg
BadMourning


----------



## chefkochx (16. Februar 2005)

hey cool
und wie bind ich das in mein prog ein
ich mein... wie ruf ich das auf?


----------



## Kachelator (16. Februar 2005)

Am besten besogst du dir erst einmal eine vernünftige Einführung in C bzw. C++. Links zu entsprechenden E-Books findest du hier im Forum.    Mit ein bisschen mehr C-Erfahrung sollte es für dich nicht allzu schwer sein, die entsprechenden Funktionen zu verwenden.


----------



## chefkochx (16. Februar 2005)

ey ich denke ich hab genug einführung in dem Thema im letzten semester gehabt
aber ich bin trotzdem no net der prof
es kann ja nur ne kleine zeile sein oder?
ich will ja net das fette prog schreiben sondern nur ein kleines wort umwandeln


----------



## hulmel (17. Februar 2005)

chefkochx hat gesagt.:
			
		

> ey ich denke ich hab genug einführung in dem Thema im letzten semester gehabt


Nein.
md5 != Verschluesselung!
md5 bildet einen Hash-Wert.


			
				chefkochx hat gesagt.:
			
		

> aber ich bin trotzdem no net der prof
> es kann ja nur ne kleine zeile sein oder?
> ich will ja net das fette prog schreiben sondern nur ein kleines wort umwandeln


Du moechtest dich an die Netiquette halten.


----------



## chefkochx (17. Februar 2005)

ja ich weiß das das ein Hash wert ist
ich wollte ja nur damit sagen das ich den jeweiligen befehl nicht kenne
könnt ihr ihn mir nicht sagen?
ich habe gehört das es nicht viel code ist, ich komm einfach nicht drauf


----------



## BadMourning (17. Februar 2005)

Die Verschlüsselung funktioniert immer gleich, egal ob du nur ein Wort oder ein
ganzes Buch durchrennen lassen willst. Ein JPEG-Bild wird auch immer mit dem 
gleichen Algorithmus komprimiert, egal ob es 10x10 oder 1000x1000 Pixel groß ist.

Von daher mußt du schon den kompletten Code von der Seite verwenden.
Am besten du schreibst dir ne Klasse, die diesen Code kapselt, die Klasse
selber hat dann wirklich nur noch die von dir gewünschte einfache Funktion,
nämlich die von dir selbst geschriebene. 

Wenn das jetzt für dich Bahnhof ist, dann schließe ich mich Kachelator an, dann
mußt du noch ein bißchen C/C++ büffeln.

Nix für ungut
BadMourning


----------



## Tobias K. (17. Februar 2005)

moin


Anscheinend reicht ein Semseter doch nicht aus, und ja es ist nur ein Befehl!

Guck dir das mal an dann wirst es verstehen: http://www.64-bit.de/dokumentationen/progr-software/a/003/funktionen.html#Punkt 7


mfg
umbrasaxum


----------



## chefkochx (17. Februar 2005)

ich weiß schon was ne klasse ist
aber ich weiß nicht was ich alles davon hernehmen soll
ich kann ja bestimmte wörter nicht irgendwie umwandeln lassen sondern das geht ja sicher nach einem bestimmten system...
ich mein in anderern Programmiersprachen ist das wirklich nur eine Zeile
das muss doch einfacher gehen...


----------



## Tobias K. (17. Februar 2005)

moin


Ich dem Tutorial geht es zwar auch um Klassen, aber was viel wichtiger ist, es geht darum wie man "fremde" include Dateien einbindet.
Das ist nämlich genau das was du brauchst!

Erst richtig lesen dann meckern!


mfg
umbrasaxum


----------



## Sinac (17. Februar 2005)

chefkochx hat gesagt.:
			
		

> ich mein in anderern Programmiersprachen ist das wirklich nur eine Zeile
> das muss doch einfacher gehen...



In anderen Programmiersprachen rufst du auch eine Funktion oder eine Methode auf, welche dann aus deinem übergebenen Parameter den MD5-Hash erzeugt und zurückgibt. Und das ist hier genau das gleiche wenn du den Code von dem Link verünftig in dein Programm einbindest.
Ich meine wenn du das nicht kannst und vorallem auch nicht lernen willst  hast du 1. bestimmt noch nicht genug C/C++ gelernt (das sind quasi Grundlagen) und 2. meiner Meinung nach nichts an einer Uni verloren. Es gibt nämlich schon genug Leute, die z.B. Informatik studieren nur im später mal dicke Kohle zu machen und damit den Leuten, die sich echt dafür interessieren und meistens auch mehr drauf haben, die Studienplätze wegnehmen.

So long...
Sinac


----------



## Tobias K. (17. Februar 2005)

moin


Ändere nicht einfach dein vorherigen Beitrag nur weil ich mal gemeckert hab.
Und tja dann hast halt die falsche Sprache bzw. das falsche Gebiet gewählt.
Und nein es geht nicht einfacher, wobei das eigentlich verdammt einfach ist!

Also:
- Von dienem Link die .h und die .d Datei ziehen.
- die Hauptfunktion main aus der .c löschen

Jetzt hast du alles was du zur MD5 codierung brauchst.

- Nun die .h in dein Projekt includieren, und du kannst wie du willst du MD5 Funktionen nutzen.

Also nur 3 Schritte um alles von der Seite benutzen zu können.

Was genau ist jetzt das Problem?
Wie du Dateien includierst steh in dem von mir geposteten Link.
Weisst du nicht wie du die MD5 Funktionen nutzt?
Oder kennst du den richtigen Ablauf nciht?

Edit:
Da gibt es so ne "Shift-Taste" die kann Bichstaben groß machen.
Und Punkt und Komma sind auch feine Sachen.


mfg
umbrasaxum


----------



## chefkochx (17. Februar 2005)

wie md5 die funktionen nutzt
das ist mein Problem.


@Sinac:
1. Gibt es immer Anfänger
2. Entscheidet jeder selber ob er auf ne Uni/FH gehen will
3. Hat dir vielleicht einer einen Platz weggeschnappt? ^^


----------



## Sinac (17. Februar 2005)

1. Ist nicht das Problem das du es nicht weißt, sondern das du zu faul bist es zu lernen und wir dir hier den fertigen Code servieren sollen
2. Sollte man sich aber vor dieser Entscheidung drüber im Klaren sein das man dort ein wenig mehr arbeiten muss als in der Grundschule wo man alles nu von der Tafel abschreibt
3. Nein, ich wollt erst ein halbes Jahr nach Spanien bevor ich anfange zu studieren


----------



## chefkochx (17. Februar 2005)

tja dann fahr mal ruhig in den urlaub  

@umbrasaxum: ich komme einfach nicht drauf, wie ich das verwenden soll, ich kann es zwar lesen aber ich henge bei der Ausführung


----------



## MFC openGL (20. Februar 2005)

@chefkochx

 Also zunächst mal möchte ich dich freundlichst daran erinnern, dich an die Nettiquette zu halten.... Solltest du das weiterhin nicht machen werde ich mich an einen Moderator wenden der dann deinen Account sperrt !

 Des weiteren, wenn du hier nicht weiterkommst, weil du evtl ein Problem hast was du nicht lösen kannst, wieso postest du nicht mal deinen Versuch hier rein und sagst wo dein Fehler ist ?  Wenn man sehen kann das sich jemand bemüht dann sind hier wesendlich mehr Leute bereit dir ein paar Minuten zu opfern und dein Problem mal zu durchdenken und es zu beheben !

 Aber wenn man so stur ist und einfach hier solange die Leute anpflaumt, bis hier der fertige Code steht, dann hast du schlechte Karten. Zudem solltest du als Student lernen selbstständig Dinge zu erarbeiten, vorkauen lassen ist was für die Grundschule...

 Also poste mal deine Versuche und dann wird dir hier sicherlich geholfen.


----------



## Tasm-Devil (19. März 2005)

Leute ich muss chefkochx in schutz nehmen (wie alt is der Thread eigendlich ? ....  egal)

 also ich prog schun seit über 2 Jahren und bin scheinbar auch zu blöde um diesen Code in mein Prog eizubinden.

 Währe es zu viel verlangt wenn jemand des so umwurschtelt das ich einfach wie in php HashWert = md5(MeinString); machen kann?


 Büddddde


----------



## Flegmon (19. März 2005)

Tasm-Devil hat gesagt.:
			
		

> wie alt is der Thread eigendlich ?


c.a. 1 Monat


----------



## Tasm-Devil (21. März 2005)

hat es schon einer von euch geschaft ein Programm zu schreiben das in etwa so aussieht:

 #include "iostream.h"
 #include "conio.h"

 int main()
 {
 AnsiString a,b;
 cout << "String eingeben";
 cin >> a;
 b = md5(a);
 cout << endl << "der Hashwert ist: " << b << endl;
 }

 HAT DAS SCHON EINER GEMACHT

 ich schaffe es nicht. so viel ich im Netz auch suche.


----------



## Beichtpfarrer (21. März 2005)

Ich glaub, es gibt sogar eine C++-Klasse im Standard, die Hash-Werte erstellt... aber MD5... ? hm..


----------



## jccTeq (9. Mai 2005)

Mich würde das auch mal interessieren. Es fehlt da eine klare Abgrenzung, eine klare Funktion, wie einer meiner Vorredner das schon so schön dargestellt hat.

char* md5(void* datablock, size_t size);

sowas in der Art.


----------



## Tobias K. (9. Mai 2005)

moin


Ich habs mal so gemacht:

.h

```
#ifndef _MD5_H
#define _MD5_H

#ifndef uint8
#define uint8  unsigned char
#endif

#ifndef uint32
#define uint32 unsigned long int
#endif

typedef struct
{
    uint32 total[2];
    uint32 state[4];
    uint8 buffer[64];
}
md5_context;

void md5(char *text, unsigned char *hash);

void md5_starts( md5_context *ctx );
void md5_update( md5_context *ctx, uint8 *input, uint32 length );
void md5_finish( md5_context *ctx, uint8 digest[16] );

static char *msg[] = 
{
    "",
    "a",
    "abc",
    "message digest",
    "abcdefghijklmnopqrstuvwxyz",
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
    "12345678901234567890123456789012345678901234567890123456789012" \
        "345678901234567890"
};

static char *val[] =
{
    "d41d8cd98f00b204e9800998ecf8427e",
    "0cc175b9c0f1b6a831c399e269772661",
    "900150983cd24fb0d6963f7d28e17f72",
    "f96b697d7cb7938d525a2f31aaf161d0",
    "c3fcd3d76192e4007dfb496cca67e13b",
    "d174ab98d277d9f5a5611c2c9f419d9f",
    "57edf4a22be3c955ac49da2e2107b67a"
};

#endif /* md5.h */
```

.cpp

```
/*
*  RFC 1321 compliant MD5 implementation
*
*  Copyright (C) 2001-2003  Christophe Devine
*
*  This program is free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program; if not, write to the Free Software
*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#include <string.h>

#include "md5.h"

#define GET_UINT32(n,b,i)                       \
{                                               \
	(n) = ( (uint32) (b)[(i)    ]       )       \
	| ( (uint32) (b)[(i) + 1] <<  8 )       \
	| ( (uint32) (b)[(i) + 2] << 16 )       \
	| ( (uint32) (b)[(i) + 3] << 24 );      \
}

#define PUT_UINT32(n,b,i)                       \
{                                               \
	(b)[(i)    ] = (uint8) ( (n)       );       \
	(b)[(i) + 1] = (uint8) ( (n) >>  8 );       \
	(b)[(i) + 2] = (uint8) ( (n) >> 16 );       \
	(b)[(i) + 3] = (uint8) ( (n) >> 24 );       \
}

void md5_starts( md5_context *ctx )
{
	ctx->total[0] = 0;
	ctx->total[1] = 0;

	ctx->state[0] = 0x67452301;
	ctx->state[1] = 0xEFCDAB89;
	ctx->state[2] = 0x98BADCFE;
	ctx->state[3] = 0x10325476;
}

void md5_process( md5_context *ctx, uint8 data[64] )
{
	uint32 X[16], A, B, C, D;

	GET_UINT32( X[0],  data,  0 );
	GET_UINT32( X[1],  data,  4 );
	GET_UINT32( X[2],  data,  8 );
	GET_UINT32( X[3],  data, 12 );
	GET_UINT32( X[4],  data, 16 );
	GET_UINT32( X[5],  data, 20 );
	GET_UINT32( X[6],  data, 24 );
	GET_UINT32( X[7],  data, 28 );
	GET_UINT32( X[8],  data, 32 );
	GET_UINT32( X[9],  data, 36 );
	GET_UINT32( X[10], data, 40 );
	GET_UINT32( X[11], data, 44 );
	GET_UINT32( X[12], data, 48 );
	GET_UINT32( X[13], data, 52 );
	GET_UINT32( X[14], data, 56 );
	GET_UINT32( X[15], data, 60 );

#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))

#define P(a,b,c,d,k,s,t)                                \
	{                                                       \
	a += F(b,c,d) + X[k] + t; a = S(a,s) + b;           \
	}

	A = ctx->state[0];
	B = ctx->state[1];
	C = ctx->state[2];
	D = ctx->state[3];

#define F(x,y,z) (z ^ (x & (y ^ z)))

	P( A, B, C, D,  0,  7, 0xD76AA478 );
	P( D, A, B, C,  1, 12, 0xE8C7B756 );
	P( C, D, A, B,  2, 17, 0x242070DB );
	P( B, C, D, A,  3, 22, 0xC1BDCEEE );
	P( A, B, C, D,  4,  7, 0xF57C0FAF );
	P( D, A, B, C,  5, 12, 0x4787C62A );
	P( C, D, A, B,  6, 17, 0xA8304613 );
	P( B, C, D, A,  7, 22, 0xFD469501 );
	P( A, B, C, D,  8,  7, 0x698098D8 );
	P( D, A, B, C,  9, 12, 0x8B44F7AF );
	P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
	P( B, C, D, A, 11, 22, 0x895CD7BE );
	P( A, B, C, D, 12,  7, 0x6B901122 );
	P( D, A, B, C, 13, 12, 0xFD987193 );
	P( C, D, A, B, 14, 17, 0xA679438E );
	P( B, C, D, A, 15, 22, 0x49B40821 );

#undef F

#define F(x,y,z) (y ^ (z & (x ^ y)))

	P( A, B, C, D,  1,  5, 0xF61E2562 );
	P( D, A, B, C,  6,  9, 0xC040B340 );
	P( C, D, A, B, 11, 14, 0x265E5A51 );
	P( B, C, D, A,  0, 20, 0xE9B6C7AA );
	P( A, B, C, D,  5,  5, 0xD62F105D );
	P( D, A, B, C, 10,  9, 0x02441453 );
	P( C, D, A, B, 15, 14, 0xD8A1E681 );
	P( B, C, D, A,  4, 20, 0xE7D3FBC8 );
	P( A, B, C, D,  9,  5, 0x21E1CDE6 );
	P( D, A, B, C, 14,  9, 0xC33707D6 );
	P( C, D, A, B,  3, 14, 0xF4D50D87 );
	P( B, C, D, A,  8, 20, 0x455A14ED );
	P( A, B, C, D, 13,  5, 0xA9E3E905 );
	P( D, A, B, C,  2,  9, 0xFCEFA3F8 );
	P( C, D, A, B,  7, 14, 0x676F02D9 );
	P( B, C, D, A, 12, 20, 0x8D2A4C8A );

#undef F

#define F(x,y,z) (x ^ y ^ z)

	P( A, B, C, D,  5,  4, 0xFFFA3942 );
	P( D, A, B, C,  8, 11, 0x8771F681 );
	P( C, D, A, B, 11, 16, 0x6D9D6122 );
	P( B, C, D, A, 14, 23, 0xFDE5380C );
	P( A, B, C, D,  1,  4, 0xA4BEEA44 );
	P( D, A, B, C,  4, 11, 0x4BDECFA9 );
	P( C, D, A, B,  7, 16, 0xF6BB4B60 );
	P( B, C, D, A, 10, 23, 0xBEBFBC70 );
	P( A, B, C, D, 13,  4, 0x289B7EC6 );
	P( D, A, B, C,  0, 11, 0xEAA127FA );
	P( C, D, A, B,  3, 16, 0xD4EF3085 );
	P( B, C, D, A,  6, 23, 0x04881D05 );
	P( A, B, C, D,  9,  4, 0xD9D4D039 );
	P( D, A, B, C, 12, 11, 0xE6DB99E5 );
	P( C, D, A, B, 15, 16, 0x1FA27CF8 );
	P( B, C, D, A,  2, 23, 0xC4AC5665 );

#undef F

#define F(x,y,z) (y ^ (x | ~z))

	P( A, B, C, D,  0,  6, 0xF4292244 );
	P( D, A, B, C,  7, 10, 0x432AFF97 );
	P( C, D, A, B, 14, 15, 0xAB9423A7 );
	P( B, C, D, A,  5, 21, 0xFC93A039 );
	P( A, B, C, D, 12,  6, 0x655B59C3 );
	P( D, A, B, C,  3, 10, 0x8F0CCC92 );
	P( C, D, A, B, 10, 15, 0xFFEFF47D );
	P( B, C, D, A,  1, 21, 0x85845DD1 );
	P( A, B, C, D,  8,  6, 0x6FA87E4F );
	P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
	P( C, D, A, B,  6, 15, 0xA3014314 );
	P( B, C, D, A, 13, 21, 0x4E0811A1 );
	P( A, B, C, D,  4,  6, 0xF7537E82 );
	P( D, A, B, C, 11, 10, 0xBD3AF235 );
	P( C, D, A, B,  2, 15, 0x2AD7D2BB );
	P( B, C, D, A,  9, 21, 0xEB86D391 );

#undef F

	ctx->state[0] += A;
	ctx->state[1] += B;
	ctx->state[2] += C;
	ctx->state[3] += D;
}

void md5_update( md5_context *ctx, uint8 *input, uint32 length )
{
	uint32 left, fill;

	if( ! length ) return;

	left = ctx->total[0] & 0x3F;
	fill = 64 - left;

	ctx->total[0] += length;
	ctx->total[0] &= 0xFFFFFFFF;

	if( ctx->total[0] < length )
		ctx->total[1]++;

	if( left && length >= fill )
	{
		memcpy( (void *) (ctx->buffer + left),
			(void *) input, fill );
		md5_process( ctx, ctx->buffer );
		length -= fill;
		input  += fill;
		left = 0;
	}

	while( length >= 64 )
	{
		md5_process( ctx, input );
		length -= 64;
		input  += 64;
	}

	if( length )
	{
		memcpy( (void *) (ctx->buffer + left),
			(void *) input, length );
	}
}

static uint8 md5_padding[64] =
{
	0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

void md5_finish( md5_context *ctx, uint8 digest[16] )
{
	uint32 last, padn;
	uint32 high, low;
	uint8 msglen[8];

	high = ( ctx->total[0] >> 29 )
		| ( ctx->total[1] <<  3 );
	low  = ( ctx->total[0] <<  3 );

	PUT_UINT32( low,  msglen, 0 );
	PUT_UINT32( high, msglen, 4 );

	last = ctx->total[0] & 0x3F;
	padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );

	md5_update( ctx, md5_padding, padn );
	md5_update( ctx, msglen, 8 );

	PUT_UINT32( ctx->state[0], digest,  0 );
	PUT_UINT32( ctx->state[1], digest,  4 );
	PUT_UINT32( ctx->state[2], digest,  8 );
	PUT_UINT32( ctx->state[3], digest, 12 );
}

/*
* those are the standard RFC 1321 test vectors
*/

void md5(char *text, unsigned char *hash)
{
	md5_context ctx;
	md5_starts( &ctx );
	md5_update( &ctx, (uint8 *) text, (size_t)strlen(text));
	md5_finish( &ctx, hash );
}
```

Beispiel main Datei:

```
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include "md5.h"

int main( int argc, char *argv[] )
{
	
	unsigned char hashwert1[16];

	for(int i=0; i<32; i++)
		hashwert1[i] = '\0';

	char text1[30] = {"Hallo"};
	
	md5(text1, hashwert1);

	getch();
	return( 0 );
}
```


mfg
umbrasaxum


----------



## rockbaer (9. Mai 2005)

jccTeq hat gesagt.:
			
		

> Mich würde das auch mal interessieren. Es fehlt da eine klare Abgrenzung, eine klare Funktion, wie einer meiner Vorredner das schon so schön dargestellt hat.
> 
> char* md5(void* datablock, size_t size);
> 
> sowas in der Art.



Schau dir mal die openssl lib an, da gibt es eine Funktion wie du sie suchst :

```
unsigned char *MD5(const unsigned char *d, unsigned long n, unsigned char *md);
```


----------



## harvi (20. Juli 2007)

Hmm, wenn ich versuche eine DLL mit der MD5-Funktion zu kompilieren, erhalte ich folgende Fehler:

Main Code.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void __cdecl md5(char *,unsigned char *)" (?md5@@YAXPADPAE@Z)".
fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

Leider reicht mein Wissen zur Zeit nicht uas, um dieses Problem alleine zu beheben :/

MFG David


----------

