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
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
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
Bei der Codierung von Zeichen wird oftmals eines der acht Bits als Prüfbit
verwendet. Damit steht der Mindestzeichenumfang von
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 | ÿ |
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 ü.
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.
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
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 (
Am besten kann man das Verfahren anhand eines Beispiels nachvollziehen und verstehen:
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.
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
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==
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:
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.
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)
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.
Version: 9. 11.
2003
© Arndt Brünner
Zahlensysteme
Matheseiten-Übersicht
zurück