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. Zeichen Nr. Zeichen Nr. Zeichen Nr. Zeichen Nr. Zeichen Nr. Zeichen Nr. Zeichen
32 Space 33 ! 34 " 35 # 36 $ 37 % 38 &
39 ' 40 ( 41 ) 42 * 43 + 44 , 45 -
46 . 47 / 48 0 49 1 50 2 51 3 52 4
53 5 54 6 55 7 56 8 57 9 58 : 59 ;
60 < 61 = 62 > 63 ? 64 @ 65 A 66 B
67 C 68 D 69 E 70 F 71 G 72 H 73 I
74 J 75 K 76 L 77 M 78 N 79 O 80 P
81 Q 82 R 83 S 84 T 85 U 86 V 87 W
88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^
95 _ 96 ` 97 a 98 b 99 c 100 d 101 e
102 f 103 g 104 h 105 i 106 j 107 k 108 l
109 m 110 n 111 o 112 p 113 q 114 r 115 s
116 t 117 u 118 v 119 w 120 x 121 y 122 z
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. Zeichen Nr. Zeichen Nr. Zeichen Nr. Zeichen Nr. Zeichen Nr. Zeichen Nr. 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.

Wert Zeichen Wert Zeichen Wert Zeichen Wert Zeichen Wert Zeichen
0 A 13 N 26 a 39 n 52 0
1 B 14 O 27 b 40 o 53 1
2 C 15 P 28 c 41 p 54 2
3 D 16 Q 29 d 42 q 55 3
4 E 17 R 30 e 43 r 56 4
5 F 18 S 31 f 44 s 57 5
6 G 19 T 32 g 45 t 58 6
7 H 20 U 33 h 46 u 59 7
8 I 21 V 34 i 47 v 60 8
9 J 22 W 35 j 48 w 61 9
10 K 23 X 36 k 49 x 62 +
11 L 24 Y 37 l 50 y 63 /
12 M 25 Z 38 m 51 z N.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
A 65 01000001
r 114 01110010
n 110 01101110
d 100 01100100
t 116 01110100
  32 00100000
B 66 01000010
r 114 01110010
ü 252 11111100
n 110 01101110
n 110 01101110
e 101 01100101
r 114 01110010
0 00000000
0 00000000

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:

Bits Wert Zeichen
010000 81 Q
010111 88 X
001001 74 J
101110 117 u
011001 90 Z
000111 72 H
010000 81 Q
100000 103 g
010000 81 Q
100111 110 n
001011 76 L
111100 56 8
011011 98 b
100110 109 m
111001 53 5
100101 108 l
011100 99 c
100000 103 g
000000 65 A *)
000000 65 A *)

*)  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