[C] MD5 hash komt niet overeen met md5sum

Pagina: 1
Acties:
  • 104 views sinds 30-01-2008
  • Reageer

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 12-04 14:05
Beste Tweakerts,

Ik ben op dit moment wat aan het bijleren met iemand die veel van C af weet (onder Linux). We zitten nu alleen met een klein probleempje: We willen de MD5 hash hebben van een tekenreeks. Echter, op internet gevonden md5.h en md5.c (verschillende) geven allemaal een andere hash als output dan de MD5() functie van PHP en de systemexecutable md5sum().

We zijn er al een aantal uren mee bezig, maar we komen er helaas niet uit, ook op GoT en google geen informatie. Weet iemand hoe de C functie kan worden gebruikt zodat de hash overeenkomst met die van PHP óf waar ik een goede officiele versie kan vinden van de md5.h en md5.c files?

Thx!

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik heb wel eens gehad dat het verschil in Unicode strings en ANSI strings problemen verschillen opleverden met MD5 hashes.

Verder ben je erg karig in je topicstart. We hebben geen glazen bol waarmee we kunnen zien wat je probleem is. Post eens wat (relevante!) code? Test-resultaten? Voorbeeldhashes? Enz. Laat zien wat je al geprobeerd hebt en wat er niet werkt enzovoorts.

Verder zou je eens kunnen kijken naar de Crypto API van windows als je voor een Win-only oplossing bezig bent (ook CAPICom kan daarbij van pas komen, als je met COM-objecten kunt werken). Daar zitten namelijk al reeds bestaande (en werkende implementaties van) MD5 functies in.

:w questa :P :> O+

[ Voor 43% gewijzigd door RobIII op 14-12-2005 18:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 16-04 11:36

pjvandesande

GC.Collect(head);

Vergelijk je het als strings of zoals het hoort gewoon een byte array?

Zijn het uberhoud wel deze types die je vergelijkt en wat zijn de return waardes van de verschillende methods?

Het kan zijn dat de codering van de strings anders is, als het om strings gaat dan natuurlijk. Heb je voor ons niet een voorbeeld van de output van de verschillende methods, dat maakt het iets makkelijker ;)

* pjvandesande tikt te sloom, damn rob!

[ Voor 6% gewijzigd door pjvandesande op 14-12-2005 18:10 ]


Verwijderd

ik denk dat het probleem zit in het verschil tussen een string en een file. Oftewel, zitten er niet spaties/enters/EOF's aan het eind van je bestand, die je bij de ene wel en de ander niet meeneemt in je hash?

  • pierre-oord
  • Registratie: April 2002
  • Laatst online: 12-04 14:05
Ik kom zo met wat meer info ik moet zeggen wat ik nog redelijk newbie ben op het gebied van C!

We proberen gewoon van de string 'abc' een output te maken, maar die matched dus niet met de system md5sum. Daar hebben we ook al wat source van geprobeerd.

Ik vond ook sourceforge nog wat, dat gaan we zo testen. Daarna zal ik m'n vriend me helpen bij het maken van een wat betere post met wat meer info, hij is iets meer into-C ! :)

Bedankt in ieder geval!

Ondernemer in tech (oud LOQED.com, nu UpToMore.com)


Verwijderd

Hmm, dat werkt hier anders prima?

Je zult wel al weten dat RFC 1321 het MD5 hashing algoritme beschrijft. Ik heb even die reference implementatie genomen als C code om mee te testen. Ik heb een testdirectory aangemaakt, even die reference code afgehaald en gecompileerd (md5 is het resulterende programma) en dan heb ik wat data door zowel md5 als door md5sum laten processen. Dat geeft dus gelijke resultaten hier:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
piranha@archon:piranha$ mkdir md5test && cd md5test

piranha@archon:md5test$ wget -q http://www.freesoft.org/CIE/RFC/1321/mddriver.c http://www.freesoft.org/CIE/RFC/1321/global.h http://www.freesoft.org/CIE/RFC/1321/md5.h http://www.freesoft.org/CIE/RFC/1321/md5c.c
piranha@archon:md5test$ gcc -o md5 *.c

piranha@archon:md5test$ ./md5 -s    
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
piranha@archon:md5test$ echo -n | md5sum
d41d8cd98f00b204e9800998ecf8427e  -

piranha@archon:md5test$ ./md5 -stest
MD5 ("test") = 098f6bcd4621d373cade4e832627b4f6
piranha@archon:md5test$ echo -n test | md5sum 
098f6bcd4621d373cade4e832627b4f6  -

Merk op dat md5 -s<data> de MD5 hash geeft voor <data>. Dus zowel voor 'geen data' (md5 -s) als voor de string 'test' (4 karakters dus) krijg ik dezelfde output.

Maar ik vermoed dat jullie md5sum niet de juiste data voeren. Die '-n' in mijn echo commando is hier wel belangrijk; anders gaat echo namelijk een trailing newline toevoegen aan je data en dus als het ware achter je rug je data aanpassen:
code:
1
2
3
4
5
6
7
8
piranha@archon:md5test$ echo test > data1
piranha@archon:md5test$ hexdump data1
0000000 6574 7473 000a                         
0000005
piranha@archon:md5test$ echo -n test > data2
piranha@archon:md5test$ hexdump data2
0000000 6574 7473                              
0000004

en dan voer je dus niet de data aan md5sum die jij in gedachten had!! Dus wel even uitkijken wie je wat voor data geeft als je gaat testen :)

[edit]
Dus om ook concreet op je vraag te antwoorden ook: de C source file "mddriver.c" uit de MD5 reference implementatie toont ook aan hoe je de C code kunt gebruiken...

[ Voor 7% gewijzigd door Verwijderd op 15-12-2005 02:02 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 21-04 12:01

curry684

left part of the evil twins

pierre-oord schreef op woensdag 14 december 2005 @ 18:17:
We proberen gewoon van de string 'abc' een output te maken, maar die matched dus niet met de system md5sum. Daar hebben we ook al wat source van geprobeerd.
Let erop dat je niet de trailing zero ook meerekent in je MD5-sum.

Professionele website nodig?


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21-04 13:55
Verder natuurlijk ook een kwestie van debuggen:
• controleer of de waarde die je genereert voor de lege string klopt (d41d8cd98f00b204e9800998ecf8427e);
• controleer of de waarde voor 'a' klopt (0cc175b9c0f1b6a831c399e269772661);
• controleer of de waarde voor 'abc' klopt (900150983cd24fb0d6963f7d28e17f72);
• controleer de waarde voor een klein bestand;
• controleer de waarde voor een groot bestand.
Als het bij eerste punt al mis gaat, dan gebruik je de MD5 library verkeerd (of je hebt een verkeerde implementatie gevonden, maar dat lijkt me sterk). Als het bij één van de volgende punten misgaat dan geef je de data waarschijnlijk op een verkeerde manier door (zoals al gezegd werd, misschien iets met conversie van line terminators of terminating zero bytes).
Pagina: 1