# Base32

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 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 (00000000$_2$) 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

| Wert | Zeichen | Wert | Zeichen | Wert | Zeichen | Wert | Zeichen |
| 0 | A | 8 | I | 16 | Q | 24 | Y |
| 1 | B | 9 | J | 17 | R | 25 | Z |
| 2 | C | 10 | K | 18 | S | 26 | 2 |
| 3 | D | 11 | L | 19 | T | 27 | 3 |
| 4 | E | 12 | M | 20 | U | 28 | 4 |
| 5 | F | 13 | N | 21 | V | 29 | 5 |
| 6 | G | 14 | O | 22 | W | 30 | 6 |
| 7 | H | 15 | P | 23 | X | 31 | 7 |
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 :
| Wert | Zeichen | Wert | Zeichen | Wert | Zeichen | Wert | Zeichen |
| 0 | 0 | 8 | 8 | 16 | G | 24 | O |
| 1 | 1 | 9 | 9 | 17 | H | 25 | P |
| 2 | 2 | 10 | A | 18 | I | 26 | Q |
| 3 | 3 | 11 | B | 19 | J | 27 | R |
| 4 | 4 | 12 | C | 20 | K | 28 | S |
| 5 | 5 | 13 | D | 21 | L | 29 | T |
| 6 | 6 | 14 | E | 22 | M | 30 | U |
| 7 | 7 | 15 | F | 23 | N | 31 | V |
RFC 3548 wurde von RFC 4648 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 :
| Wert | Zeichen | Wert | Zeichen | Wert | Zeichen | Wert | Zeichen |
| 0 | q | 8 | g | 16 | s | 24 | c |
| 1 | p | 9 | f | 17 | 3 | 25 | e |
| 2 | z | 10 | 2 | 18 | j | 26 | 6 |
| 3 | r | 11 | t | 19 | n | 27 | m |
| 4 | y | 12 | v | 20 | 5 | 28 | u |
| 5 | 9 | 13 | d | 21 | 4 | 29 | a |
| 6 | x | 14 | w | 22 | k | 30 | 7 |
| 7 | 8 | 15 | 0 | 23 | h | 31 | l |
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:
* 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.

## Beispiele

Beispielkodierung für ein Byte mit dem Wert 0 :
| Schritt | Block 1 | Block 2 | Block 3 | Block 4 | Block 5 | Block 6 | Block 7 | Block 8 |
| Integer-Wert | 0 | – | – | – | – | – | – | – |
| Repräsentiert als 8 Bits | 00000000 | – | – | – | – | – | – | – |
| Aufgeteilt in 8×5 Blöcke | 00000 | 000… | – | – | – | – | – | – |
| Fehlende Nullen aufgefüllt | 00000 | 00000 | – | – | – | – | – | – |
| Integer-Wert | 0 | 0 | – | – | – | – | – | – |
| Base32-Kodierung | A | A | = | = | = | = | = | = |
Beispielkodierung für den String „AB“ (entspricht in ASCII-Kodierung den Werten 65 und 66) :
| Schritt | Block 1 | Block 2 | Block 3 | Block 4 | Block 5 | Block 6 | Block 7 | Block 8 |
| Integer-Werte | 65 | 66 | – | – | – | – | – | – |
| Repräsentiert als 8 Bits | 01000001 | 01000010 | – | – | – | – | – | – |
| Aufgeteilt in 8×5 Blöcke | 01000 | 00101 | 00001 | 0.... | – | – | – | – |
| Fehlende Nullen aufgefüllt | 01000 | 00101 | 00001 | 00000 | – | – | – | – |
| Integer-Werte | 8 | 5 | 1 | 0 | – | – | – | – |
| Base32-Kodierung | I | F | B | A | = | = | = | = |