Base32 beschreibt ein Verfahren zur Kodierung von Binärdaten in eine Zeichenfolge, die nur aus 32 verschiedenen ASCII-Zeichen besteht (plus einem zusätzlichen 33. Zeichen als Füllzeichen am Datenende). Im Vergleich zum verwandten Verfahren Base64 eignet es sich für Datenformate, bei denen nicht zwischen Groß- und Kleinbuchstaben unterschieden wird. Eine Gruppe weiter ähnlicher Kodierungsverfahren ist unter Base85 bekannt.

Grundprinzip

RFC 3548[1] beschreibt die Kodierung beliebiger Binärdaten wie folgt: Fünf Bytes à 8-Bit (also zusammen 40 Bit) werden in acht 5-Bit-Gruppen zerlegt. Jede dieser Gruppen entspricht einer Zahl zwischen 0 und 31. Diese Zahlen werden anhand der nachfolgenden Umsetzungstabelle in „druckbare ASCII-Zeichen“ umgewandelt und ausgegeben. Wenn am Ende kein kompletter 40-Bit-Block mehr gebildet werden kann, wird dieser Block mit Nullbytes (000000002) aufgefüllt und jene 5-Bit-Gruppen, die nur aus Füllbits bestehen, mit dem Füllzeichen = kodiert, um dem Dekodierer mitzuteilen, wie viele Füllbits hinzugefügt wurden.

Kodierungstabelle

Während Base64 in der Maschine-zu-Maschine-Kommunikation eingesetzt wird, werden Base32-ähnliche Kodierungen oft in Bereichen verwendet, wo sie von Menschen gelesen und eingegeben werden. Es sind verschiedene Kodierungen in Verwendung, die zum Ziel haben, Verwechslungsgefahren zwischen ähnlich aussehenden Zeichen zu minimieren und dafür gezielt einzelne Zeichen, die für missverständlich gehalten werden, von der Verwendung ausschließen. Daher wird in der Regel eine tabellarische Übersetzung der Base32-Zahlen auf kodierte Zeichen vorgenommen.

Base32 nach RFC 3548 / RFC 4648

WertZeichenWertZeichenWertZeichenWertZeichen
0A8I16Q24Y
1B9J17R25Z
2C10K18S262
3D11L19T273
4E12M20U284
5F13N21V295
6G14O22W306
7H15P23X317

Die Ziffern 0 und 1 werden nicht verwendet, da bei schriftlicher Wiedergabe eine Verwechslungsgefahr mit den Buchstaben O und I besteht.

Base32hex nach RFC 4648

Base32hex nach RFC 4648[2]
WertZeichenWertZeichenWertZeichenWertZeichen
008816G24O
119917H25P
2210A18I26Q
3311B19J27R
4412C20K28S
5513D21L29T
6614E22M30U
7715F23N31V

RFC 3548[1] wurde von RFC 4648[2] abgelöst, das eine weitere Kodierung einführt. Diese benutzt – ähnlich wie das Hexadezimalsystem – für die Werte 0 bis 9 die dezimalen Ziffern. Die Werte 10 bis 31 werden durch die Buchstaben A bis V repräsentiert. Damit bleibt, wie bei Hexadezimalzahlen, die Reihenfolge der kodierten Werte bei lexikographischer Sortierung erhalten, allerdings wird darauf verzichtet, optisch ähnliche Zeichen zu vermeiden. Damit ist das Einsatzgebiet dieser Kodierung eher die Maschine-zu-Maschine-Kommunikation in Bereichen, wo nicht zwischen Klein- und Großbuchstaben unterschieden werden kann.

So wird diese Kodierung beispielsweise beim NSEC3 Resource Record von DNSSEC verwendet.

Bech32-Kodierung von Bitcoin-Adressen

Bech32-Kodierungstabelle
WertZeichenWertZeichenWertZeichenWertZeichen
0q8g16s24c
1p9f17325e
2z10218j266
3r11t19n27m
4y12v20528u
5913d21429a
6x14w22k307
7815023h31l

Bitcoin-Adressen werden üblicherweise in einer „base58check“ genannten Kodierung angegeben, welche zwar eine relativ kompakte textuelle Darstellung erlaubt, aber in der Praxis einige Nachteile aufweist:

  • Die Textdarstellung ist zwar kompakt, aber als QR-Code recht ineffizient.
  • Da Groß- und Kleinbuchstaben benutzt werden, ist es schwierig, die Adressen z. B. mündlich weiterzugeben.
  • Die Base58-Kodierung ist recht rechenaufwändig und erfordert 256-Bit-Arithmetik.
  • Die gewählte Prüfsumme wurde nicht nach wohlüberlegten Fehlererkennungs- oder -korrekturmöglichkeiten ausgewählt.

Das im Bitcoin Improvement Proposal 0173 (BIP0173) vorgeschlagene Format namens „Bech32“ versucht, diese Nachteile zu umgehen:[3]

  • Base32 ist etwa 15 % länger als Base58. Wenn Adressen über Copy and Paste weitergegeben werden, spielt die etwas größere Länge jedoch keine Rolle.
  • In der Textdarstellung sollen Kleinbuchstaben benutzt werden. Als QR-Code dagegen Großbuchstaben, da dies den kompakteren „Alphanumeric Mode“ erlaubt, der jeweils 2 Zeichen in 11 Bit kodiert.
  • Base32 ist effizient mit 32-Bit-Arithmetik zu implementieren
  • Der Prüfsummenalgorithmus wurde gezielt nach den gewünschten Fehlererkennungs- und -korrektur-Eigenschaften ausgesucht.

Bech32 benutzt eine spezielle Kodierungstabelle, die so designt wurde, dass die kodierte 5-Bit-Folge von visuell ähnlichen (und daher am ehesten zu verwechselnde) Zeichen sich stets um mehr als nur 1 Bit unterscheidet, so dass die der Prüfsummenalgorithmus davon profitiert. Dabei werden die Buchstaben b, i und o sowie die Ziffer 1 bei der Bech32-Kodierung nicht verwendet. Das Präfix bc1, mit dem jede Bech32-Bitcoin-Adresse beginnt, ist nicht Teil dieser Kodierung, sondern lediglich die Kennung.

Weitere Kodierungsalphabete

In Videospielen werden Passwörter und Level-Codes oft in einer modifizierten Base32-Kodierung dargestellt. Die verwendeten Kodierungsalphabete sind dabei nicht genormt. Oft werden Ziffern und Konsonanten verwendet, um möglichst keine „sprechenden“ Passwörter zu erzeugen.

ZRTP benutzt eine eigene Kodierungstabelle namens z-base-32, die ebenfalls darauf optimiert wurde, bei mündlicher Wiedergabe (etwa via Telefon) Missverständnisse zu vermeiden.[4]

Beispiele

Beispielkodierung für ein Byte mit dem Wert 0
SchrittBlock 1Block 2Block 3Block 4Block 5Block 6Block 7Block 8
Integer-Wert0
Repräsentiert als 8 Bits00000000
Aufgeteilt in 8×5 Blöcke00000000…
Fehlende Nullen aufgefüllt0000000000
Integer-Wert00
Base32-KodierungAA======
Beispielkodierung für den String „AB“ (entspricht in ASCII-Kodierung den Werten 65 und 66)
SchrittBlock 1Block 2Block 3Block 4Block 5Block 6Block 7Block 8
Integer-Werte6566
Repräsentiert als 8 Bits0100000101000010
Aufgeteilt in 8×5 Blöcke0100000101000010....
Fehlende Nullen aufgefüllt01000001010000100000
Integer-Werte8510
Base32-KodierungIFBA====

Einzelnachweise