MD4 Referenzimplementierung in RFC 1320
-
Hallo,
ich habe mir aus Interesse den MD4-Algorithmus in RFC1320 angeschaut. In der beigefügten Referenzimplementierung verstehe ich den Beginn der MD4Update-Funktion nicht, d.h. was mit den Schiebeoperationen gemacht wird.
Folgendes interpretiere ich da mal rein:
Zeile 16: 3 Stellen nach Rechts schieben bedeutet Division durch 8. Aber was für eine Bedeutung hat der index-Wert?
Zeile 18: Wann ist der linke Teil bei dem Vergleich kleiner als der rechte Teil? Kann context->count[0] kleiner als 0 sein?
Zeile 21: Warum wird hier 29 Stellen nacht rechts geschoben?
Ich bin etwas verwirrt. Kann mir das bitte jemand erklären?
/* MD4 context. */ typedef struct { UINT4 state[4]; /* state (ABCD) */ UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */ unsigned char buffer[64]; /* input buffer */ } MD4_CTX; void MD4Update (context, input, inputLen) MD4_CTX *context; /* context */ unsigned char *input; /* input block */ unsigned int inputLen; /* length of input block */ { unsigned int i, index, partLen; /* Compute number of bytes mod 64 */ index = (unsigned int)((context->count[0] >> 3) & 0x3F); /* Update number of bits */ if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) context->count[1]++; context->count[1] += ((UINT4)inputLen >> 29); partLen = 64 - index;
-
Der Code scheint halt schon ziemlich alt zu sein (MD4 ist ja auch mittlerweile unsicher!). Offenbar gab es damals keinen 64 Bit Integertyp bei den gängigen Compilern. Daher werden zwei 32 Bit (4Byte) große Typen für den Zähler genommen. count[0] sind die unteren 4 Byte (-3Bit?) und count[1] die oberen.
In Zeile 18 wird einfach geprüft, ob es einen Überlauf bei der Addition gibt und wenn dem so ist, werden die oberen 4Byte um 1 erhöht (Carry). Aus irgend einem Grund werden die unteren 3 Bit in count[0] wohl frei gehalten. Daher muss das was von length übrig bleibt (die oberen 3Bit, Shift mit 29) zu count[1] addiert werden.
Da das ganze nicht Linux spezifisch ist, schiebe ich dich mal ins C Forum.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Linux/Unix in das Forum C (C89 und C99) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.