Das Verschicken von Nachrichten per E-Mail ist eine angenehme und schnelle Möglichkeit mit anderen Personen zu kommunizieren. Man kann eine Nachricht schreiben und per Tastendruck zum Empfänger schicken. Die elektronische Post eröffnet dem Benutzer auch ganz neue Möglichkeiten. Er kann seinem Brief zum Beispiel Bilder, Töne und Videos beifügen oder ganze Programme verschicken. Das Versandsystem wurde jedoch nicht den neuen Erfordernissen angepasst. Im Moment werden die Daten so verändert, dass sie mit dem alten System verschickt werden können. Hier kommen verschiedene Verfahren der Übertragungskodierung zum Einsatz.
Manchmal, wenn auch unerwünscht, kann man die Übertragungskodierung sogar sehen. Dann nämlich, wenn das eigene Postprogramm nicht automatisch erkennt, dass es sich um eine kodierte Nachricht handelt. Eine Zeile wie :
Herzlichen Gl=FEckwunsch ...
haben die Meisten schon einmal gesehen. Oder aber auch eine mysteriöse Nachricht der Art
begin 644 Beispiel.gif
M`<0N```````````````````!+BX````````````````"0RYP<F5F97)E;F-E
M<P```D0N8W-H<F,```````````7O+GAS97-S:6]N;&]G```%82YM<V=R8P``
M````````%<XN96QM`````````````'3F36%I;``````````````(HBYN971S
M8V%P90``````=01N<VUA:6P``````````'EF;6%I;&)O`````````!MOTQOA
M97-U;F=E;@``````0C!F='`M<VMR:7!T`````&9C1$5!1$I/10````````!*
M\G=I;F9B,38U84QS04UA2O,N<FAO<W1S`````````"8T:6YD97@N:'1M;```
M```X)'5U96YC;V1E+F=I9@``0OAB:6XN='AT``````````=49F]C:V5N+FAT
M;6P````W&W5U,#`P,#(N:'1M````2<TN<W-H``````````````H*+G!U=&1I
M=@`````````*#BYI;F1EA```````````21R<VDQ+F%D9BYGBYB:7DE=74QEX
M+G1X=`````````!Y)F=I9C%?92YT'0`````=74N6&%U=&AO0```%=VA="+DE
M:6YF;P`````````````W22YN97=S<F,`````````7,A?,30V.#%?9FEG=7)E
M-GDG9VEF,E]E+G1X=`````!EO"YA8W)O<F,`````````.'<N;6,N:&]T````
M`````#NN+FUC+FEN:0`````````(HRYA8W)O<W)C:```````-QQ?,30V.#%?
M9FEG=7)E-GDH9VEF,U]E+G1X=`````!Y*6=I9C1?92YT'0`````W1A2YMA*=
M;6TS,BYH=&T``````'DT;6UM,S$N:'1M``````!Y-SDV+FAT;0``````````
M=65"96ES<&EE;"YG:68``'5T;7!A8VLQ-60NFEP``!UF)S<"YT'0`````E(B
3````6M]B<W```````````````'!A
end
Im ersten Beispiel wurden die Umlaute kodiert, im zweiten Beispiel ist ein Bild kodiert worden (hier im Beispiel mit Uuencode).
Diese Erscheinungen werden jedoch in naher Zukunft selten werden, da mit MIME (Multipurpose Internet Mail Extension) ein Standard definiert wurde, durch den man leichter erkennen kann welche Kodierung in welchem Teil der Nachricht verwendet wurde. Haben sich MIME konforme Postprogramme erst einmal verbreitet, sieht der Anwender das Bild sofort auf dem Bildschirm oder wird nur gefragt, in welches Verzeichnis das angehängte Programm geschrieben werden soll.
Bevor auf die einzelnen Verfahren eingegangen wird, muss zunächst geklärt werden, welche Probleme bei der Übertragung der Daten auftauchen.
SMTP ist ein Internetprotokoll, das im Jahr 1982 definiert wurde (RFC 821 (Request for Comments )). Obwohl es eigentlich vom unterliegenden Netzprotokoll unabhängig ist wird meistens TCP (Tranmission Control Protocol) benutzt. Die nachstehende Zeichnung soll den Ablauf beim Versand verdeutlichen.

Der Sender baut eine bidirektionale Verbindung mit dem Empfänger auf. Danach schickt der Sender verschiedene Anfragekommandos an den Empfänger. Mit Hilfe der Antworten kann der Sender überprüfen ob der Empfänger der Richtige ist. Danach kann die Übertragung der Nachricht beginnen. Ist der Empfänger das Ziel ist der Versand abgeschlossen, anderenfalls gibt er die Nachricht entsprechend weiter.
Leider hat SMTP gewisse Einschränkungen die beim Versand von Binärdateien Probleme bereiten.
Man unterscheidet zwischen druckbaren und nicht druckbaren Zeichen, da im Zeichensatz auch Steuerzeichen enthalten sind.
Hier kann man schon erkennen, was alle Kodierungsverfahren gemeinsam haben. Sie müssen die Daten in druckbare Zeichen umwandeln und eine bestimmte Zeilenlänge einhalten.
Dieses Kodierungsverfahren wird hauptsächlich für die Kodierung von ASCII-Texten benutzt. Dabei bleibt der kodierte Text weitgehend lesbar und es ist unwahrscheinlich, dass er beim Verschicken verändert wird. Übergänge zu EBCDIC (Extended Binary Coded Decimal Interchange Code, ein Zeichensatz) Systemen können jedoch zu Schwierigkeiten führen. Bei diesem Verfahren wird ein bestimmter Zeichensatz verwendet, den man dem Empfänger unbedingt mitteilen muss.
From: Felix Holderied <felix@ira.uka.de>
Reply-To: felix@ira.uka.de
Organization: IRF
X-Mailer: Mozilla 4.03 [de] (Macintosh; I; PPC)
MIME-Version: 1.0
To: ue81@rz.uni-karlsruhe.de
Subject: Proseminar Redundanz
(*) Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Kopf einer Rechnerpost
In der gekennzeichneten Zeile wird der verwendete Zeichensatz mitgeteilt.

Latin-1 nach ISO-8859-1
Latin-1 ist ein erweiterter 8-Bit Zeichensatz. Der Bereich von 0x00 bis 0x7F ist mit dem US-ASCII Zeichensatz identisch.
Regel 1:
Alle Bytes, außer denen die einen Zeilenumbruch anzeigen, werden durch ein "=" und durch die 2-stellige Darstellung des Wertes im Hexadezimalsystem dargestellt.
Beispiel: "ü" wird als "=FC" dargestellt
Falls keine der folgenden Regeln angewendet werden kann, gilt immer diese Regel.
Regel 2:
Bytes mit einem Hexadezimalwert im Bereich 0x21-0x3C (! bis <) oder im Bereich 0x3E-0x7E (> bis ~) können durch das zugehörige ASCII- Zeichen dargestellt werden.
Regel 3:
Bytes mit Werten 0x09 und 0x20 können als ASCII TAB und Leerzeichen dargestellt werden, jedoch nur wenn sie nicht am Ende einer kodierten Zeile stehen. Jedem TAB oder Leerzeichen muss also ein druckbares Zeichen folgen.
Ein "=" am Ende einer kodierten Zeile (zeigt einen weichen Zeilenumbruch an , siehe Regel 5)kann einem oder mehreren TAB oder Leerzeichen folgen. Daraus folgt, dass Bytes mit Werten 0x09 und 0x20 die am Ende einer kodierten Zeile stehen gemäss Regel 1 dargestellt werden.
Diese Regel ist nötig, da beim Verschicken der Post manchmal Leerzeichen angehängt oder gelöscht werden. Diese angehängten Leerzeichen müssen dann beim Dekodieren gelöscht werden.
Regel 4:
Ein Zeilenumbruch in einem Text muss durch einen Zeilenumbruch gemäß RFC 822 dargestellt werden. (dies ist eine Carriage Return Line Forward (CRLF) Sequenz)
Regel 5:
Kodierte Zeilen dürfen nicht länger als 76 Zeichen sein. Sollen längere Zeilen kodiert werden, müssen weiche Zeilenumbrüche benutzt werden. Ein "="-Zeichen an letzter Stelle einer Zeile zeigt dies an.
Dieses Kodierungsverfahren wird hauptsächlich bei der Kodierung von Binärdaten benutzt. Da man in diesem Fall nicht mehr darauf achten muss, dass der kodierte Text lesbar ist, kann man hier effizienter arbeiten. Die kodierte Datei ist ca. 30 % größer als das Original.
Base64 benutzt eine 65 Zeichen umfassende Untermenge des US-ASCII-Zeichensatzes. Diese Zeichen wurden so ausgewählt, dass sie in allen ISO 646 Zeichensätzen aber auch in allen EBCDIC-Zeichensätzen identisch dargestellt werden. Dies ist wichtig, da es sonst bei einem Übergang zwischen zwei Systemen mit verschiedenen Zeichensätzen zu Fehlern kommen kann.
Beim Kodieren werden 24-Bit-Stücke der Datei durch 4 Zeichen dargestellt. Um dies zu erreichen zerlegt man die 24-Bit in 4 6-Bit Blöcke. Der Dezimalwert eines 6-Bit Blockes liegt im Bereich von 0-63 und durch diesen Wert wird ein entsprechendes Zeichen festgelegt. (siehe Tabelle)

Das Base64 Alphabet
Hinzu kommt das '=' Zeichen um eventuell aufzufüllen.
Beispiel :
Binär: 01001001 10101110 11000110
010010 011010 111011 000110
Dezimal: 18 26 59 6
Ausgabe: S a 7 G
Sind am Schluss weniger als 24-Bits vorhanden, füllt man mit Null-Bits auf, bis man eine ganzzahlige Anzahl von 6-Bit Gruppen erhält, die dann durch die entsprechenden Zeichen dargestellt werden. Sind dies weniger als 4 Zeichen füllt man mit "="-Zeichen auf, bis man einen vollständigen Block aus 4 Zeichen erhält.
Beispiel :
Binär 01001001
010010010000
010010 010000
Dezimal: 18 16
Ausgabe: S Q = =
Die Zeilen in der Ausgabe dürfen nicht mehr als 76 Zeichen lang sein. Zeichen die nicht in der Tabelle enthalten oder ungleich '=' sind, müssen beim Dekodieren unbeachtet bleiben und weisen auf einen Übertragungsfehler hin.
Beim Kodieren einer Datei mit Uuencode wird folgendermaßen vorgegangen
1.) Die Datei wird in Blöcke aufgeteilt. Alle diese Blöcke, außer dem letzten, müssen 45-Byte groß sein.
2.) In den einzelnen Blöcken werden jeweils 3 Byte in 4 6-Bit Gruppen aufgeteilt. Der entsprechende Dezimalwert liegt im Bereich 0-63.Da Werte unter 32 nicht erlaubt sind wird jeweils 32 addiert. Ein 45 Byte-Block wird dann durch 60 Zeichen dargestellt. Hat der letzte Block eine Größe in Byte die nicht durch 3 teilbar ist, wird entsprechend aufgefüllt.
3.) Das Ergebnis wird Zeilenweise ausgegeben. Jede Zeile beginnt mit einem Zähler-Zeichen dessen Dezimalwert sich folgendermaßen berechnet :
Größe des ursprünglichen Blockes in Byte + 32
(Beispiel : Die meisten Zeilen beginnen mit einem M.M hat den Dezimalwert 77. 77-32 ist 45 also die Größe, die die meisten Blöcke haben)
Danach kommen die Zeichen die den ursprünglichen Block kodieren. Jede Zeile endet mit einem Zeilenumbruch (ASCII 0x0D und ASCII 0x0A).
4.) Am Anfang wird noch ein Kopf eingefügt der folgendermaßen formatiert ist:
begin Rechte Name
Rechte ist eine 3-stellige Oktalzahl, die die Zugriffsrechte bestimmt. Dieser Eintrag ist nur für Unix-Systeme relevant.
Name ist der Name der Datei
Am Ende der Datei wird noch eine Leerzeile und eine Zeile mit dem Schlüsselwort end eingefügt.
Im Gegensatz zu Base64 gibt es bei Uuencode oftmals Probleme beim Übergang zwischen Rechnern (besonders EBCDIC-Rechnern). Deshalb sollte man Base64 vorziehen.
Jürgen Schäck 6. Januar 1999