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.

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). Base64 wird zum Beispiel auch zur Kodierung von Benutzernamen und Passwort in der HTTP-Basisauthentifizierung und zur Übertragung von SSH-Server-Zertifikaten verwendet.

Vorgehen bei der Kodierung

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 ein verlustfreier Datenaustausch zwischen diesen Plattformen gesichert.

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, beinhaltet der letzte Eingabeblock weniger als 24 Bits. In diesem Fall ist ein Padding der Eingabedaten erforderlich. An den Eingabeblock werden Nullbits angehängt, bis die Länge durch 6 teilbar ist. Anschließend wird die Ausgabe mit einem oder zwei = Zeichen aufgefüllt. Wenn der Eingabeblock 8 Bit lang ist, werden 4 Nullbits angehängt und zwei = Zeichen ausgegeben. Wenn der Eingabeblock 16 Bit lang ist, werden 2 Nullbits angehängt und ein = Zeichen ausgegeben.

Beispiel: Padding
Eingabebytes
(Hex)
Anzahl
Bits
aufgefüllt auf durch 6 teilbare Bitzahl
(Binärdarstellung, Senkrechtstrich trennt Padding-Bits)
Base64
(ohne Ausgabe-Padding)
Base64
(mit Ausgabe-Padding)
00 8 000000 00|0000 AA AA==
00 00 16 000000 000000 0000|00 AAA AAA=
00 00 00 24 000000 000000 000000 000000 AAAA AAAA
FF 8 111111 11|0000 /w /w==
FF FF 16 111111 111111 1111|00 //8 //8=
FF FF FF 24 111111 111111 111111 111111 //// ////

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

Platzbedarf

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 Dekodierung nicht von Belang und werden ignoriert.

Base64-Zeichensatz

Wert Zeichen Wert Zeichen Wert Zeichen Wert Zeichen
dez.binär hex. dez.binär hex. dez.binär hex. dez.binär hex.
0000000 00A16010000 10Q32100000 20g48110000 30w
1000001 01B17010001 11R33100001 21h49110001 31x
2000010 02C18010010 12S34100010 22i50110010 32y
3000011 03D19010011 13T35100011 23j51110011 33z
4000100 04E20010100 14U36100100 24k52110100 340
5000101 05F21010101 15V37100101 25l53110101 351
6000110 06G22010110 16W38100110 26m54110110 362
7000111 07H23010111 17X39100111 27n55110111 373
8001000 08I24011000 18Y40101000 28o56111000 384
9001001 09J25011001 19Z41101001 29p57111001 395
10001010 0AK26011010 1Aa42101010 2Aq58111010 3A6
11001011 0BL27011011 1Bb43101011 2Br59111011 3B7
12001100 0CM28011100 1Cc44101100 2Cs60111100 3C8
13001101 0DN29011101 1Dd45101101 2Dt61111101 3D9
14001110 0EO30011110 1Ee46101110 2Eu62111110 3E+
15001111 0FP31011111 1Ff47101111 2Fv63111111 3F/

In Dateinamen und 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.

Beispiel

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

Dieser 64 Zeichen lange Text wäre in UTF-8-Kodierung 68 Byte lang, da in UTF-8 das Eszett und die Umlaute jeweils eine Länge von zwei Bytes haben. Mit der Umwandlung zu Base64 wird daraus eine 92 Zeichen lange Base64-Zeichenkette:

UG9seWZvbiB6d2l0c2NoZXJuZCBhw59lbiBNw6R4Y2hlbnMgVsO2Z2VsIFLDvGJl
biwgSm9naHVydCB1bmQgUXVhcms=

Erkennbar ist hierbei, dass Base64 eine für Menschen nicht lesbare Kodierung erstellt. Dieser Umstand ist jedoch nicht als wirksame Verschlüsselung anzusehen, da der Datenstrom der Eingabe sehr leicht aus der Zeichenfolge am Ausgang zurückgewonnen werden kann, sobald diese als Base64-kodiert erkannt ist.

Umwandlung der Zeichen "Pol" in Base64
PhaseDatenAnmerkungen
UrsprungstextPol
Unicode-ZeichenU+0050 U+006F U+006Cgemäß Unicodeblock Basis-Lateinisch
Bytes0x500x6F0x6Cgemäß UTF-8
Binärschreibweise0101 0000 0110 1111 0110 1100siehe Hexadezimalsystem
Gruppierung in 6er-Blöcken010100000110 111101 101100jeder 6er-Block entspricht einem Base64-Zeichen
Codierung als Base64-ZeichenUG9sgemäß der Tabelle oben von „binär“ nach „Zeichen“
Ohne LeerzeichenUG9s

Radix-64

Das OpenPGP-Datenformat definiert eine Variante von Base64, die ASCII Armor genannt wird. Diese besteht aus genormten Kopf- und Fußzeilen, welche zum einen den Anfang und das Ende der Daten anzeigen, zum anderen einen Hinweis für den menschlichen Leser geben, welche Art von Daten kodiert sind und mit welchem Programm die Daten erzeugt worden sind.

An die Base64-kodierten Daten wird eine Prüfsumme (CRC-24) angehängt; dieses leicht modifizierte Verfahren trägt den Namen Radix-64.

-----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 in diesem Beispiel beginnt mit jA0E… und endet 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

Normen und Standards

  • J. Linn: RFC 1421 Privacy Enhancement for Internet Electronic Mail: Part I: Message Encryption and Authentication Procedures. Februar 1993 (löst RFC 1113 ab, historisch, englisch).
  • N. Borenstein, N. Freed: RFC 1521 MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies. September 1993 – Standard: [draft] (löst RFC 1341 ab, aktualisiert durch RFC 1590, veraltet, englisch).
  • S. Josefsson: RFC 3548 The Base16, Base32, and Base64 Data Encodings [Errata: RFC 3548]. Juli 2003 (aktualisiert durch RFC 4648, veraltet, abgelöst durch RFC 4648, englisch).
  • S. Josefsson: RFC 4648 The Base16, Base32, and Base64 Data Encodings [Errata: RFC 4648]. Oktober 2006 – Standard: [proposed] (löst RFC 3548 ab, englisch).
  • J. Callas, L. Donnerhacke, H. Finney, D. Shaw, R. Thayer: RFC 4880 OpenPGP Message Format [Errata: RFC 4880]. November 2007 – Standard: [proposed] (aktualisiert durch RFC 5581, löst RFC 1991 und RFC 2440 ab, englisch).

Base64-Codierung/Decodierung online. base64decode.org

Einzelnachweise

  1. RFC 4648 The Base16, Base32, and Base64 Data Encodings. Oktober 2006, Abschnitt 4 (englisch).
  2. S. Josefsson: RFC 4648 The Base16, Base32, and Base64 Data Encodings [Errata: RFC 4648]. Oktober 2006 – Standard: [proposed] (löst RFC 3548 ab, englisch).
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.