Wenn das Internet die Datenautobahn ist, ist der Pfad für E-Mails eine enge Schlucht. Nur sehr kleine Karren können passieren.
Das E-Mail-Transportsystem ist nur für reinen ASCII-Text ausgelegt. Der Versuch, Text in anderen Sprachen oder beliebigen Dateien zu senden, ist wie ein Lastwagen durch die Schlucht zu fahren.
Wie geht der Big Truck durch die Schlucht?
Wie schickt man dann einen großen Lastwagen durch eine kleine Schlucht? Sie müssen es am einen Ende in Stücke zerlegen, die Stücke durch die Schlucht transportieren und den Lastwagen aus den Teilen am anderen Ende umbauen.
Dasselbe passiert, wenn Sie einen Dateianhang per E-Mail senden. In einem als Codierung bekannten Prozess werden die binären Daten in ASCII-Text umgewandelt, der problemlos in E-Mails transportiert werden kann. Auf der Empfängerseite werden die Daten decodiert und die Originaldatei wird neu erstellt.
Eine Methode zum Codieren beliebiger Daten als ASCII-Text ist Base64. Es ist eine der Techniken, die der MIME-Standard verwendet, um andere Daten als Nur-Text zu senden.
Base64 zur Rettung
Die Base64-Kodierung benötigt drei Bytes, die jeweils aus acht Bits bestehen, und stellt sie im ASCII-Standard als vier druckbare Zeichen dar. Dies geschieht im Wesentlichen in zwei Schritten.
Der erste Schritt besteht darin, drei Bytes in vier Zahlen von sechs Bits umzuwandeln. Jedes Zeichen im ASCII-Standard besteht aus sieben Bits. Base64 verwendet nur 6 Bits (entsprechend 2 ^ 6 = 64 Zeichen), um sicherzustellen, dass verschlüsselte Daten druckbar und für Menschen lesbar sind. Keines der in ASCII verfügbaren Sonderzeichen wird verwendet.
Die 64 Zeichen (daher der Name Base64) bestehen aus 10 Ziffern, 26 Kleinbuchstaben, 26 Großbuchstaben sowie '+' und '/'.
Wenn die drei Bytes beispielsweise 155, 162 und 233 sind, ist der entsprechende (und erschreckende) Bitstrom 100110111010001011101001, was wiederum den 6-Bit-Werten 38, 58, 11 und 41 entspricht.
Diese Zahlen werden im zweiten Schritt unter Verwendung der Base64-Codierungstabelle in ASCII-Zeichen umgewandelt. Die 6-Bit-Werte unseres Beispiels werden in die ASCII-Sequenz "m6Lp" übersetzt.
- 155 -> 10011011
- 162 -> 10100010
- 233 -> 11101001
- 100110 -> 38
- 111010 -> 58
- 001011 -> 11
- 101001 -> 41
- 38 -> m
- 58 -> 6
- 11 -> L
- 41 -> p
Dieser zweistufige Prozess wird auf die gesamte codierte Bytefolge angewendet. Um sicherzustellen, dass die verschlüsselten Daten ordnungsgemäß gedruckt werden können und die Zeilenlänge der Mail-Server nicht überschreiten, werden Zeilenumbrüche eingefügt, um die Zeilenlänge unter 76 Zeichen zu halten. Die Zeilenvorschubzeichen werden wie alle anderen Daten codiert.
Endgame lösen
Am Ende des Kodierungsprozesses könnten wir auf ein Problem stoßen. Wenn die Größe der Originaldaten in Byte ein Vielfaches von drei ist, funktioniert alles einwandfrei. Wenn dies nicht der Fall ist, erhalten wir möglicherweise ein oder zwei 8-Bit-Bytes. Für eine korrekte Kodierung benötigen wir jedoch genau drei Bytes.
Die Lösung besteht darin, genügend Bytes mit dem Wert '0' anzufügen, um eine 3-Byte-Gruppe zu erstellen. Zwei solcher Werte werden angehängt, wenn wir ein zusätzliches Datenbyte haben, einer wird für zwei zusätzliche Bytes angehängt.
Natürlich können diese künstlichen nachfolgenden Nullen nicht mit der folgenden Codierungstabelle codiert werden. Sie müssen durch ein 65. Zeichen dargestellt werden.
Das Base64-Füllzeichen ist '='. Natürlich kann es immer nur am Ende von verschlüsselten Daten erscheinen.
Base64-Codierungstabelle
Wert | Verkohlen | Wert | Verkohlen | Wert | Verkohlen | Wert | Verkohlen | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | EIN | 16 | Q | 32 | G | 48 | w | |||
1 | B | 17 | R | 33 | h | 49 | x | |||
2 | C | 18 | S | 34 | ich | 50 | y | |||
3 | D | 19 | T | 35 | j | 51 | z | |||
4 | E | 20 | U | 36 | k | 52 | 0 | |||
5 | F | 21 | V | 37 | l | 53 | 1 | |||
6 | G | 22 | W | 38 | m | 54 | 2 | |||
7 | H | 23 | X | 39 | n | 55 | 3 | |||
8 | ich | 24 | Y | 40 | O | 56 | 4 | |||
9 | J | 25 | Z | 41 | p | 57 | 5 | |||
10 | K | 26 | ein | 42 | q | 58 | 6 | |||
11 | L | 27 | b | 43 | r | 59 | 7 | |||
12 | M | 28 | c | 44 | s | 60 | 8 | |||
13 | N | 29 | d | 45 | t | 61 | 9 | |||
14 | O | 30 | e | 46 | u | 62 | + | |||
15 | P | 31 | f | 47 | v | 63 | / |