Base64 beschreibt ein Verfahren zur Kodierung von 8-Bit-Binärdaten (z. B. ausführbare Programme, ZIP-Dateien oder Bilder) in eine Zeichenfolge, die nur aus lesbaren, Codepage-unabhängigen ASCII-Zeichen besteht. Im Zusammenhang mit OpenPGP wird noch eine Prüfsumme (CRC-24) angehängt; dieses leicht modifizierte Verfahren trägt den Namen Radix-64.
Es findet im Internet-Standard MIME (Multipurpose Internet Mail Extensions) Anwendung und wird damit hauptsächlich zum Versenden von E-Mail-Anhängen verwendet. Nötig ist dies, um den problemlosen Transport von beliebigen Binärdaten zu gewährleisten, da SMTP in seiner ursprünglichen Fassung nur für den Versand von 7-Bit-ASCII-Zeichen ausgelegt war. Durch die Kodierung steigt der Platzbedarf des Datenstroms um 33–36 % (33 % durch die Kodierung selbst, bis zu weitere 3 % durch die im kodierten Datenstrom eingefügten Zeilenumbrüche).
Vorgehen bei der Kodierung
Zur Kodierung werden die Zeichen A–Z, a–z, 0–9, + und / verwendet sowie = am Ende. Da diese Zeichen auch in EBCDIC (Extended Binary Coded Decimals Interchange Code) vorkommen (wenn auch an anderen Code-Positionen), ist damit auch ein Datenaustausch zwischen Nicht-ASCII-Plattformen möglich.
Zur Kodierung werden jeweils drei Byte des Bytestroms (= 24 Bit) in vier 6-Bit-Blöcke aufgeteilt. Jeder dieser 6-Bit-Blöcke bildet eine Zahl von 0 bis 63. Diese Zahlen werden anhand der nachfolgenden Umsetzungstabelle in „druckbare ASCII-Zeichen“ umgewandelt und ausgegeben. Der Name des Algorithmus erklärt sich durch ebendiesen Umstand – jedem Zeichen des kodierten Datenstroms lässt sich eine Zahl von 0 bis 63 zuordnen (siehe Tabelle).
Mathematisch betrachtet gleicht dies einem Stellenwertsystem der Basis 64. In der Regel wird spätestens nach jeweils 76 ausgegebenen Zeichen, das entspricht 57 kodierten Bytes, ein Zeilenumbruch eingefügt, welcher jedoch ansonsten für die Kodierung nicht von Belang ist. Falls die Gesamtanzahl der Eingabebytes nicht durch drei teilbar ist, wird der zu kodierende Text am Ende mit aus Nullbits bestehenden Füllbytes aufgefüllt, so dass sich eine durch drei teilbare Anzahl an Bytes ergibt.
Um dem Dekodierer mitzuteilen, wie viele Füllbytes angefügt wurden, werden die 6-Bit-Blöcke, die vollständig aus Füllbytes entstanden sind, mit = kodiert. Somit können am Ende einer Base64-kodierten Datei null, ein oder zwei =-Zeichen auftreten. Anders gesagt, es werden so viele =-Zeichen angehängt, wie Füllbytes angefügt worden sind.
Bei einem zu kodierenden Text mit n Zeichen beträgt der Platzbedarf für den Base64-kodierten Inhalt (ohne Zeilenumbrüche) 4 * ((n + 2 – ((n + 2) mod 3)) / 3) Zeichen.
Wert | Zeichen | Wert | Zeichen | Wert | Zeichen | Wert | Zeichen | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w | |||
1 | B | 17 | R | 33 | h | 49 | x | |||
2 | C | 18 | S | 34 | i | 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 | I | 24 | Y | 40 | o | 56 | 4 | |||
9 | J | 25 | Z | 41 | p | 57 | 5 | |||
10 | K | 26 | a | 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 | / |
Für den Fall, dass die Zeichen + und / nicht verwendet werden können (zum Beispiel bei Dateinamen oder URLs), wird mit „base64url“ eine inkompatible Abwandlung beschrieben. Die Zeichen + und / werden durch – (Minus, ASCII 2Dhex) und _ (Unterstrich, ASCII 5Fhex) ersetzt.
Beispiel
Polyfon zwitschernd aßen Mäxchens Vögel Rüben, Joghurt und Quark
Der UTF-8-kodierte Text wird Base64-kodiert zu:
UG9seWZvbiB6d2l0c2NoZXJuZCBhw59lbiBNw6R4Y2hlbnMgVsO2Z2VsIFLDvGJlbiwgSm9n aHVydCB1bmQgUXVhcms=
Erkennbar ist hierbei, dass Base64 eine nicht lesbare Kodierung erstellt, im Gegensatz dazu ist ein quoted-printable-kodierter Text mit Ausnahme der Sonderzeichen zumindest teilweise lesbar.
Radix-64
-----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.10 (GNU/Linux) jA0EAwMCxamDRMfOGV5gyZPnyX1BBPOQAE4BHbh7PfTDInn+94hXmnBr9D8+4x5R kNNl4E499Me3Fotq8/zvznEycz2h7vJ21SdP5akLhRPd4W1S79LoCvbZYh2x4t6x Cnqev6S97ys4chOPgz0FePfKQos0I7+rrMSAc9+vXHmUCthFqp7FJJ7/D9bCfmdF 1qkYNhtk/P5uvZ0N2zAUsiScDJA= =XXuR -----END PGP MESSAGE-----
Der Base64-Teil endet in diesem Beispiel mit …DJA=. Anschließend folgt ein Zeilenumbruch, ein Gleichheitszeichen und die base64-kodierte CRC-24-Prüfsumme über die Original-Nachricht (also vor der Base64-Kodierung).
Quelle: Wikipedia (https://de.wikipedia.org/wiki/Base64)