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
TGllYmVyIExlc2VyLCBsaWViZSBMZXNlcmluIQ0KDQpJY2ggaG9mZmUsIGRh3yBkaWVzZSBF cmzkdXRlcnVuZ2VuIHZlcnN05G5kbGljaCBzaW5kIHVuZCBkYXMgSmF2YXNjcmlwdA0KZmVo bGVybG9zIGZ1bmt0aW9uaWVydCB1bmQgaGlsZnJlaWNoIGlzdC4gTG9iLCBLb21tZW50YXJl IHVuZCBGZWhsZXJtZWxkdW5nZW4NCnNlbmRlbiBTaWUgYml0dGUgcGVyIGVNYWlsIGFuOiBh cm5kdC5icnVlbm5lckB0LW9ubGluZS5kZQ0KDQpCZXN0ZSBHcvzfZSwNCklocg0KQXJuZHQg QnL8bm5lcg==