Matheseiten-Übersicht
zurück

Der Kodierungs-Standard base64

Seit den frühen Tagen der elektronischen Post (eMail) gibt es ein Standardverfahren, um beliebige Daten in eine Folge von Zeichen umzuwandeln, die in jedem (lateinischen) Schriftsatz enthalten sind. So können die Daten problemlos innerhalb von eMails versendet werden. Da der reduzierte Basis-Zeichensatz aus 64 Zeichen besteht, heißt das Verfahren base64. Die meisten eMail-attachments werden bis heute nach diesem Verfahren codiert.

Um die base64-Verschlüsselung nachvollziehen zu können, ist das Verständnis der ASCII-Codierung eine unumgängliche Voraussetzung. Daher wird im folgenden Text zunächst die Textcodierung nach dem ASCII-Standard erläutert. Dann wird das Prinzip des base64-Verfahrens erläutert und an einem Beispiel durchgeführt. Im untersten Abschnitt dieser Seite können Texte durch ein Javascript kodiert und dekodiert werden. Wahlweise kann automatisch passend zu den eingegebenen Texten eine detaillierte Erläuterung generiert werden.
→ dorthin springen

Der ASCII-Code

Textzeichen eines einfachen Zeichensatzes werden bis heute zumeist nach dem ASCII-Standard (American Standard Code for Information Interchange) codiert, wobei für ein Zeichen die Datengröße eines Bytes (= 8 bit) zur Verfügung steht. Ein Bit ist die kleinste Einheit an Information und hat nur zwei mögliche "Zustände": an/aus oder 1/0 o.ä. Eine Information mit der Größe zwei Bit hat 2·2 Zustände, denn jedes der beiden Bits kann 1 oder 0 sein, und somit gibt es bei zwei Bits diese vier Möglichkeiten: 00, 01, 10, 11. Bei drei Bits sind es acht: 000, 001, 010, 011, 100, 101, 110, 111. Bei jedem weiteren Bit verdoppelt sich die Zahl der Möglichkeiten. Bei n Bits sind es 2n Möglichkeiten.

Bei der Codierung von Zeichen wird oftmals eines der acht Bits als Prüfbit verwendet. Damit steht der Mindestzeichenumfang von 27 = 128 Zeichen zur Verfügung:

Nr.ZeichenNr.ZeichenNr.ZeichenNr.ZeichenNr.ZeichenNr.ZeichenNr.Zeichen
32Space33!34"35#36$37%38&
39'40(41)42*43+44,45-
46.47/480491502513524
53554655756857958:59;
60<61=62>63?64@65A66B
67C68D69E70F71G72H73I
74J75K76L77M78N79O80P
81Q82R83S84T85U86V87W
88X89Y90Z91[92\93]94^
95_96`97a98b99c100d101e
102f103g104h105i106j107k108l
109m110n111o112p113q114r115s
116t117u118v119w120x121y122z
123{124|125}126~

Die Zeichen unterhalb von 32 (Leerzeichen) werden für Steuerzeichen wie Zeilenvorschub (13), "Wagenrücklauf" (10), Tabulator (9), Escape (27) oder Dateiende (0) verwendet.

Bei 8-bit-Zeichensätzen werden höhere Zeichen für sprachspezifische und andere Sonderzeichen verwendet (ä, ß, ç, ¿, ©, ¾, § usw.). Beim hier verwendeten Zeichensatz (Verdana) sind wie in vielen anderen Zeichensätzen nur die Zeichen 160 bis 255 durchgängig besetzt, zwischen 127 und 159 finden sich einige Lücken.

Nr.ZeichenNr.ZeichenNr.ZeichenNr.ZeichenNr.ZeichenNr.ZeichenNr.Zeichen
130 131 ƒ 132 133 134 135 # 136 ˆ
137 % 138 Š 139 140 Œ
145 146 147 148 149 150
151 152 ˜ 153 154 š 155 156 œ
159 Ÿ 160   161¡ 162¢ 163£ 164¤
165¥ 166¦ 167§ 168¨ 169© 170ª 171«
172¬ 173­ 174® 175¯ 176° 177± 178²
179³ 180´ 181µ 182 183· 184¸ 185¹
186º 187» 188¼ 189½ 190¾ 191¿ 192À
193Á 194Â 195Ã 196Ä 197Å 198Æ 199Ç
200È 201É 202Ê 203Ë 204Ì 205Í 206Î
207Ï 208Ð 209Ñ 210Ò 211Ó 212Ô 213Õ
214Ö 215× 216Ø 217Ù 218Ú 219Û 220Ü
221Ý 222Þ 223ß 224à 225á 226â 227ã
228ä 229å 230æ 231ç 232è 233é 234ê
235ë 236ì 237í 238î 239ï 240ð 241ñ
242ò 243ó 244ô 245õ 246ö 247÷ 248ø
249ù 250ú 251û 252ü 253ý 254þ 255ÿ
Kodierung von eMails

eMails werden als ASCII-Code übertragen. Ein ASCII-Zeichensatz kann zwar theoretisch 256 verschiedene Zeichen enthalten, doch sind davon nur knapp 100 standardisiert (siehe oben).

Aus Kompatibilitätsgründen werden eMails daher oftmals nur mit 7bit-Zeichensätzen übertragen. Sonderzeichen sind dabei nicht möglich, Brünner müßte mit Bruenner umschrieben werden, usw.
Die Art der Codierung wird im sogenannten Header (Kopfbereich) der eMail angegeben. Das eMail-Programm dekodiert die Nachrichten aufgrund dieser Angabe automatisch.

Um Sonderzeichen zu übermitteln, kann zum Beispiel mit "8bit" codiert werden. Eine zweite Möglichkeit besteht in der sogenannten "quoted-printable"-Codierung: Hier wird der ASCII-Code der Sonderzeichen als eingeschobener zweistelliger, hexadezimaler Zahlencode nach dem Schlüsselzeichen '=' übergeben. Brünner wird bei diesem Verfahren beispielsweise mit Br=FCnner codiert. FC ist die hexadezimale Schreibweise für 252, den Ascii-Code für den Buchstaben ü.  → Umrechnung von Zahlensystemen

eMail-Anhänge werden nicht separat, sondern – unmerklich für Absender und Empfänger – als (Text-)Bestandteil der eMail verschickt. Sie müssen also vor dem Versenden in einen Text nach dem ASCII-Standard umgewandelt werden. Nun enthalten die allermeisten Dateien auch Bytes, die nicht "gefahrlos" mit ihren ASCII-Entsprechungen übertragen werden können. Der Bytewert 0 zum Beispiel wird meist als Dateiende interpretiert; und einige Zeichen mit dem ASCII-Code kleiner als 32 können in Textdarstellungen zu regelrechten Abstürzen führen.

Da beim Übertragen diese Steuerzeichen und auch die landesspezifischen Sonderzeichen zu unerwünschten Ergebnissen beim Dekodieren führen können, hat man ein Verfahren entwickelt, das alle Daten mit lediglich 64 verschiedenen Zeichen codiert: Die Groß- und Kleinbuchstaben des nichterweiterten Alphabets (ABC...XYZ und abc...xyz), die zehn Ziffern (0123456789) sowie die beiden Zeichen / und +. Diese Zeichen kommen in allen länder- und betriebssystemspezifischen Zeichensätzen vor.

Nach diesem Verfahren lassen sich alle Bytefolgen, die im Original nicht als ASCII-Text darstellbar sind, in einen solchen umformen. Übrigens wird von manchen eMail-Programmen auch der eigentliche Text der Mail derartig codiert.

Kodieren nach base64

Wie werden nun die 256 möglichen Zustände eines Bytes in die 64 möglichen Zustände der base64-Codierung umgewandelt?

Die Quelle besteht aus Byte-"Datenpäckchen" zu je 8 Bits (= je 256 Möglichkeiten). In der base64-Codierung stehen 64 Zeichen zur Verfügung. Da diese 64 Zeichen genau 6 Bits entsprechen (64 = 26), wird die (aneinandergehängte) Bitfolge der Quelldaten (je 8 Bits für jedes Byte) in Abschnitte zu 6 Bits aufgeteilt. Diese Abschnitte zu 6 Bits werden in die entsprechende Zahl und das zugehörige Zeichen nach der folgenden Entsprechungstabelle umgewandelt.

WertZeichenWertZeichenWertZeichen WertZeichenWertZeichen
0A13N26a39n520
1B14O27b40o531
2C15P28c41p542
3D16Q29d42q553
4E17R30e43r564
5F18S31f44s575
6G19T32g45t586
7H20U33h46u597
8I21V34i47v608
9J22W35j48w619
10K23X36k49x62+
11L24Y37l50y63/
12M25Z38m51zN.N.=

Je 3 Bytes des Quelltextes (3·8 bits = 24 bits) ergeben 4 Zeichen der Codierung (4·6 bits = 24 bits). Falls der Quelltext nicht aus einer Bytelänge besteht, die durch 3 teilbar ist, können einfach entsprechend viele Nullen ergänzt werden.

Am besten kann man das Verfahren anhand eines Beispiels nachvollziehen und verstehen:

Beispiel

Der Text "Arndt Brünner" soll codiert werden.

Zunächst werden die 13 Zeichen in ihren ASCII-Code und deren Bit-Entsprechung umgewandelt. Die Bit-Entsprechung ist die 8-stellige Binärschreibweise der Zahl.

Die Dezimalzahl 13 entspricht in Binärschreibweise 1101, denn 13=8+4+1. Jede Ziffer 1 der Binärzahl entspricht der zugehörigen Zweierpotenz in der Summenschreibweise. In achtstelliger Schreibweise entspricht die dezimale 13 der binären 00001101.
→ Script zum Umrechnen von Zahlensystemen

Um die Länge durch 3 teilbar zu machen, wird zweimal 0 angehängt.

Zeichen ASCII
dezimal

binär
A6501000001
r11401110010
n11001101110
d10001100100
t11601110100
 3200100000
B6601000010
r11401110010
ü25211111100
n11001101110
n11001101110
e10101100101
r11401110010
000000000
000000000

Die Bits werden zusammengehängt: 010000010111001001101110011001000111... und in Abschnitte zu 6 Bits aufgeteilt. Aus der oben abgedruckten Tabelle wird das entsprechende Zeichen zum jeweiligen Zahlenwertes abgelesen; hieraus entsteht die Zeichenkette des base64-Codes:

BitsWertZeichen
01000081Q
01011188X
00100174J
101110117u
01100190Z
00011172H
01000081Q
100000103g
01000081Q
100111110n
00101176L
111100568
01101198b
100110109m
111001535
100101108l
01110099c
100000103g
00000065A *)
00000065A *)

*)  Um Fehlinterpretationen beim Dekodieren zu vermeiden, werden die beiden 'A' am Schluß, die durch die angefügten Nullen entstanden, mit denen die Länge korrigiert wurde, durch das Zeichen '=' ersetzt.

Der base64-Code für Arndt Brünner ist also QXJuZHQgQnL8bm5lcg==

Dekodieren

Beim Dekodieren einer base64-kodierten Quelle wird umgekehrt verfahren. Alle Zeichen im Quelltext, die nicht im Katalog der 64 Zeichen vorkommen, werden dabei ignoriert. Der Quelltext kann daher sogar formatiert werden, d.h. beispielsweise mit Zeilenvorschüben gegliedert sein, ohne den Inhalt zu verändern.

Der Code QXJ,uZH QgQ_n L8??b@m5l#cgAA würde zunächst auf die relevanten Zeichen reduziert werden: QXJuZHQgQnL8bm5lcgAA, dann in die Zahlenentsprechungen der Zeichen und ihre Bitfolge zerlegt werden: 81, 88, 74, 117... = 010000, 010111, 001001, 101110 ...
Dann wird diese Bitfolge in Byteblocks, d.h. in Achtergruppen, aufgeteilt: 01000001, 01110010, 01101110, ..., deren Zahlenwert (dezimal 65, 114, 110, ...) als ASCII-Code interpretiert und in die entsprechenden Zeichen umgewandelt: A, r, n, ...
Die Nullen am Ende (im base64-Code als AA bzw. == erkennbar) werden ignoriert.
Hinweis: In der Regel wird beim Codieren statt des 'A' am Ende als Füllzeichen das Zeichen '=' verwendet, welches beim Dekodieren entweder ignoriert oder am Ende als 0 interpretiert wird.
(Eigentlich ist der Wert von '=' als 64 definiert: 64 ≡ 0 (mod 64).)

Aus dem Bitlängenverhältnis 8:6 ergibt sich ein Längenunterschied zwischen Original und Code von 3:4, d.h. der codierte Text ist um ein Drittel länger als das Original.

Schematische Übersicht
Uncodiertes Zeichen:     A       r        n          d        t      [space]       
         ASCII-Code:    65      114      110        100      116       32   
   Binärdarstellung: 01000001 01110010 01101110   01100100 01110100 00100000
     in 6er-Gruppen: 010000 010111 001001 101110  011001 000111 010000 100000
            dezimal:   16     23      9     46      25      7     16     32
     base64-Zeichen:    Q      X      J      u       Z      H      Q      g


Uncodiertes Zeichen:     B       r        ü          n        n        e          r
         ASCII-Code:    66      114      252        110      110      101        114   (3er-Block auffüllen)
   Binärdarstellung: 01000010 01110010 11111100   01101110 01101110 01100101   01110010 00000000 00000000
     in 6er-Gruppen: 010000 100111 001011 111100  011011 100110 111001 100101  011100 100000 000000 000000
            dezimal:   16     39     11     60      27     38     57     37      28     32      0      0
     base64-Zeichen:    Q      n      L      8       b      m      5      l       c      g      =      =
                                                                                              (aufgefüllte 0 
                                                                                               werden durch
                                                                                               = dargestellt)



 

Das base64-Verfahren anwenden

Im folgenden Abschnitt kann ein Text nach dem base64-Verfahren kodiert oder dekodiert werden. Wenn die Option "Erklärungen generieren" aktiviert ist, wird im unteren Textfenster eine detaillierte Beschreibung der (De-)Kodierung des Textes angezeigt. Diese Funktion ist wegen des hohen Speicherbedarfs und der erhöhten Rechenzeit auf maximal 750 Zeichen Originaltext (=1000 Zeichen Code) beschränkt. Für das Dekodieren von kodierten Daten, die nicht als ASCII-Text darstellbar sind, steht die Funktion "dekodierte Bytes anzeigen" zur Verfügung.

Text eingeben und Schaltfläche der gewünschten Funktion betätigen:


   Zeilenlänge:                 dekodierte Bytes anzeigen
hexadezimal

Erklärungen generieren


Version: 9. 11. 2003
© Arndt Brünner
Zahlensysteme
Matheseiten-Übersicht
zurück




TGllYmVyIExlc2VyLCBsaWViZSBMZXNlcmluIQ0KDQpJY2ggaG9mZmUsIGRh3yBkaWVzZSBF
cmzkdXRlcnVuZ2VuIHZlcnN05G5kbGljaCBzaW5kIHVuZCBkYXMgSmF2YXNjcmlwdA0KZmVo
bGVybG9zIGZ1bmt0aW9uaWVydCB1bmQgaGlsZnJlaWNoIGlzdC4gTG9iLCBLb21tZW50YXJl
IHVuZCBGZWhsZXJtZWxkdW5nZW4NCnNlbmRlbiBTaWUgYml0dGUgcGVyIGVNYWlsIGFuOiBh
cm5kdC5icnVlbm5lckB0LW9ubGluZS5kZQ0KDQpCZXN0ZSBHcvzfZSwNCklocg0KQXJuZHQg
QnL8bm5lcg==