Base64

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Base64 ist 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 Multipurpose Internet Mail Extensions (MIME) Anwendung und wird dort 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). Außerdem wird es in der HTTP-Basisauthentifizierung zur Kodierung von Benutzernamen und Passwort verwendet.

Vorgehen bei der Kodierung[Bearbeiten | Quelltext bearbeiten]

Zur Kodierung werden die Zeichen A–Z, a–z, 0–9, + und / verwendet sowie = am Ende. Da diese Zeichen auch im Extended Binary Coded Decimals Interchange Code (EBCDIC) vorkommen (wenn auch an anderen Codepositionen), ist damit auch ein Datenaustausch zwischen Nicht-ASCII-Plattformen möglich.

Kodierung von Base64

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.

Padding: 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.

Da sich die Anzahl der ursprünglichen Bytes immer eindeutig aus der Anzahl der Base64-Eingabe-Zeichen ermitteln lässt, wird in manchen Kontexten und Protokollen kein Padding verwendet (abweichend von der ursprünglichen Base64 Definition).

Bei einer zu kodierenden Eingabe mit Byte beträgt der Platzbedarf für den Base64-kodierten Inhalt (ohne Zeilenumbrüche) Zeichen. (Die Klammern um den Bruch stehen für die aufrundende Ganzzahldivision.)

In der Darstellung von sehr langen Base64-Strings werden diese oftmals (zum Beispiel nach jeweils 64 Zeichen) umgebrochen, also ein Zeilenumbruch eingefügt. Solche Zeilenumbrüche sind für die Kodierung nicht von Belang und werden ignoriert.

Base64-Zeichensatz[Bearbeiten | Quelltext bearbeiten]

Wert Zeichen Wert Zeichen Wert Zeichen Wert Zeichen
dez. binär dez. binär dez. binär dez. binär
0 000000 A 16 010000 Q 32 100000 g 48 110000 w
1 000001 B 17 010001 R 33 100001 h 49 110001 x
2 000010 C 18 010010 S 34 100010 i 50 110010 y
3 000011 D 19 010011 T 35 100011 j 51 110011 z
4 000100 E 20 010100 U 36 100100 k 52 110100 0
5 000101 F 21 010101 V 37 100101 l 53 110101 1
6 000110 G 22 010110 W 38 100110 m 54 110110 2
7 000111 H 23 010111 X 39 100111 n 55 110111 3
8 001000 I 24 011000 Y 40 101000 o 56 111000 4
9 001001 J 25 011001 Z 41 101001 p 57 111001 5
10 001010 K 26 011010 a 42 101010 q 58 111010 6
11 001011 L 27 011011 b 43 101011 r 59 111011 7
12 001100 M 28 011100 c 44 101100 s 60 111100 8
13 001101 N 29 011101 d 45 101101 t 61 111101 9
14 001110 O 30 011110 e 46 101110 u 62 111110 +
15 001111 P 31 011111 f 47 101111 v 63 111111 /

Bei Dateinamen oder URLs können die Zeichen +, / und = nicht verwendet werden, da sie dort für besondere Funktionen reserviert sind. In einem solchen Fall wird mit „base64url“ eine inkompatible Abwandlung beschrieben. Die Zeichen + und / werden dann durch - (Minus, ASCII 2Dhex) und _ (Unterstrich, ASCII 5Fhex) ersetzt. Das Füllzeichen = am Ende wird prozentkodiert zu %3d, kann aber entfallen, wenn die Länge des Strings bekannt ist.[1]

Beispiel[Bearbeiten | Quelltext bearbeiten]

Polyfon zwitschernd aßen Mäxchens Vögel Rüben, Joghurt und Quark

Der 64 Zeichen lange Text ist UTF-8-kodiert 68 Byte lang, da das Eszett und die Umlaute jeweils eine Länge von zwei Byte haben, und wird mit der Umwandlung zu Base64 zu einer 92 Zeichen langen Base64-Zeichenkette:

UG9seWZvbiB6d2l0c2NoZXJuZCBhw59lbiBNw6R4Y2hlbnMgVsO2Z2VsIFLDvGJl
biwgSm9naHVydCB1bmQgUXVhcms=

Erkennbar ist hierbei, dass Base64 eine nicht lesbare Kodierung erstellt. Dieser Umstand ist jedoch nicht als wirksame Verschlüsselung anzusehen, da der Datenstrom von Ein- und Ausgabe unverändert ist und es daher ohne weiteres möglich ist, die Kodierung rückgängig zu machen, wenn die Zeichenfolge als Base64-kodiert erkannt ist.

Radix-64[Bearbeiten | Quelltext bearbeiten]

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

Siehe auch[Bearbeiten | Quelltext bearbeiten]

Weblinks[Bearbeiten | Quelltext bearbeiten]

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. RFC 4648 - Textdatei, englisch; abgerufen am 7. April 2016