Robert Bamler: "1" Bit, "0" Bit...

Beitrag lesen

Hallo Alex,

ich habe zufällig vor nicht allzu langer Zeit als Übung einen C++-Wrapper für den MD5-Algorithmus geschrieben und kenne daher das RFC noch.

In der Spezifikation wird der Algorithmus so allgemein beschrieben, dass keine Annahmen über die ursprüngliche Nachricht gemacht werden. Die Beschreibung geht daher nicht einmal davon aus, dass die Länge der Ursprungsnachricht in Bits durch 8 teilbar ist, d.h. die Nachricht restlos in Bytes aufgeteilt werden kann. Daher muss es beispielsweise auch möglich sein, eine standardkonforme MD5-Checksumme aus einer 123 Bits langen Nachricht zu bilden. Eine solche Nachricht ließe sich aber nicht in Bytes aufteilen, weil das letzte Byte dann "nicht voll" wird (es "fehlen" dann noch 5 Bits). Wenn die Spezifikation also solchen Unfug erlauben will, darf sie nicht von dem Anhängen von Bytes reden, weil gar nicht sicher gestellt ist, dass sich die Nachricht überhaupt restlos in Bytes aufteilen lässt. Die Spezifikation beschreibt daher das Anhängen von Bits: Zuerst ein 1er-Bit und dann so viele 0er-Bits, dass das Ergebnis in ein vorgegebenes Raster passt.

Die C-Implementierung des Algorithmus, die noch Teil des RFC ist, kann allerdings auf Grund der Einschränkungen von C nicht so allgemein gehalten werden. Die kleinste Einheit eines standardkonformen C-Compilers ist immer mindestens 8 Bit groß, da kleinere Einheiten auf den meisten Rechnerarchitekturen ohnehin keinen Sinn machen. In der Implementierung wird also eine stillschweigende Annahme über die Ursprungsnachricht gemacht: Es wird angenommen, dass die Bitlänge der Nachricht ein Vielfaches von 8 ist, die Nachricht also restlos in Bytes aufgeteilt werden kann. Und wenn man das einmal als gegeben hinnimmt, kann man statt Bits anzuhängen auch gleich Bytes anhängen. Allerdings werden die Bytes so angehängt, dass man keinen Unterschied zwischen dieser normativen Implementierung und einer Implementierung, die auf irgend eine Weise mit Bits rechnet, feststellen kann. Allerdings kann diese normative Implementierung nur Checksummen aus Nachrichten bilden, deren Länge in Bits durch 8 teilbar ist.

Das "at least one bit" bezieht sich also nur auf Nachrichten, die gerade ein Bit kürzer sind, als dass sie genau in das vorgeschriebene Raster passen würden. Solche Nachrichten hätten aber sozusagen "nur 7 Bits im letzten Byte" und werden daher von der C-Implementierung nicht berücksichtigt.

Ich hoffe, ich habe dich jetzt nicht noch mehr verwirrt,
Robert