Bit-Padding
-
hallo,
ich versuche gerade, eine md5-implementierung zu schreiben.
dazu hab ich mir den pseudocode auf wikipedia angesehen:
http://de.wikipedia.org/wiki/Md5#Pseudocodees geht darum, "message" um ein bit "1" zu erweitern.
(im pseudocode ist die betreffende zeile kurz nach der initialisierung der variablen h0,h1,h2 und h3)ich weiß allerdings nicht, wie ich das machen soll. habt ihr eine idee?
-
Nimm das nicht zu wörtlich. Rechne dir aus, wie die Nachricht wohl hinterher aussieht, wenn du tatsächlich bitweise vorgegangen wärst und erweitere die Nachricht dann entsprechend.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
SeppJ schrieb:
Nimm das nicht zu wörtlich. Rechne dir aus, wie die Nachricht wohl hinterher aussieht, wenn du tatsächlich bitweise vorgegangen wärst und erweitere die Nachricht dann entsprechend.
und wie mach ich das am besten?
-
könnte mir bitte jemand erklären, wie ich da bitweise vorgehen soll?
-
Das heißt, du solltest dir auf einem Blatt Papier überlegen, wie die Bytes der Nachricht sich ändern, wenn du ein Bit anhängst.
-
Das ist genau der Pseudocode von Wikipedia in C++ umgesetzt:
http://www.c-plusplus.net/forum/224897?highlight=md5#1704830
-
vielen dank für die umsetzung in c++.
Christoph schrieb:
Das heißt, du solltest dir auf einem Blatt Papier überlegen, wie die Bytes der Nachricht sich ändern, wenn du ein Bit anhängst.
ja, aber ich will die md5-summe eines strings berechnen, und dieser string ist variabel.
so wie ich das jetzt verstanden habe:
string: "test" (4 buchstaben + '\0')
das sind dann also 5 bytes (oder 40 bits)
füge ich ein bit hinzu, dann sind es 5 bytes und 1 bit (oder 41 bits)ich verstehe jetzt allerdings nicht, inwiefern mir das helfen soll.
-
gast-nutzer schrieb:
ich verstehe jetzt allerdings nicht, inwiefern mir das helfen soll.
Der Algorithmus ist ja nicht, dass du am Ende nur 1 Bit zufügst, sondern dass du zuerst eine 1 und dann solange 0 anfügen sollst, bis du 448 Bits hast. Das heißt, du sollst effektiv ein Byte mit Wert 10000000b = 128 und (448/8) - 5 -1 = 50 Bytes mit Wert 0 anhängen. Und das ist dann doch sehr einfach zu programmieren. (Falls du eine Nachricht hast, die nicht aus ganzen Bytes besteht, musst du dir den Startwert natürlich entsprechend anpassen.)
Das meinte ich mit meiner ersten Antwort und Christoph vermutlich ebenfalls.
-
ok, jetzt wirds verständlicher. und wie hänge ich die 50 bytes an?
-
gast-nutzer schrieb:
ok, jetzt wirds verständlicher. und wie hänge ich die 50 bytes an?
Wenn dir dazu nichts einfällt, dann solltest du dir ganz dringend erst einmal ein gutes Grundlagenbuch zu C reinziehen (z.B. K&R), bevor du dich an komplizierteren Programmen wie diesem versuchst. Das würde ja auch nichts bringen, dir diesen Schritt als Code zu zeigen, dann stehst du beim nächsten Schritt ja schon wieder hier und weißt nicht weiter. Und das ist ja gerade mal der erste Schritt von MD5 über den wir hier reden!
-
bist du dir sicher, dass das da drinnen steht?
-
edit:
mit K&R ist "The C Programming Language" gemeint, oder? (dieses buch: http://www.amazon.de/Programming-Language-Prentice-Hall-Software/dp/0131103628/ref=sr_1_1?ie=UTF8&qid=1337018819&sr=8-1)
-
Ja. Da steht natürlich nicht md5 drinnen, aber hinterher kannst du selbststandig Programme schreiben und (sicherlich genau so wichtig) auch Ratschläge von anderen Programmierern verstehen. War ja eine ziemlich schwere Geburt in diesem Thread.
-
ok, dann vielen dank!
-
hallo, ich, der threadstarter, wollte mich hier nochmal zu wort melden.
tut mir leid, aber ich muss diesen thread nochmal aus der versenkung holen.
ich hab mir jetzt mehrere bücher über c angeschaft und durchgearbeitet. daran liegt es also nicht.
meine frage ist nach wie vor: wie genau soll ich die bytes anhängen?
1. soll ich das ganze bitweise machen? also muss ich irgendwie das array shiften?2. oder reicht es, wenn ich einfach ein großes array mache und dann eben die bestimmte anzahl an bytes auf 0 setze?
-
weiß denn keiner die antwort?
-
antwort nr. 2 war im prinzip richtig.
der andere weg wäre ein wenig zu umständlich...was verstehst du unter einem großen array?
so groß kann das gar nicht werden, denn
die ganze nachricht mit der erweiterung wird quasi schaufelweise in 64 bytes portionen an den algorithmus übergeben.
also wird die anzahl deiner genullten bytes maximal 63 bytes werden.
das ist nicht sooo groß.