Daten können in verschiedenen Repräsentationen vorliegen: Während der Mensch am liebsten Zahlen, Buchstaben und Sonderzeichen ließt, stellen diese für einen Computer lediglich Bitfolgen, also Nullen und Einsen dar.
Standards wie ASCII ermöglichen es hier überhaupt erst, das eine solche Maschine die für Menschen lesbaren Zeichen ausgeben und verarbeiten kann.
Hierfür werden, salopp gesagt, bestimmte Bitmuster als Zeichen interpretiert.
Doch was ist nun, wenn wir eine Schnittstelle verwenden, welche ausschließlich ASCII-basierte Zeichen unterstützt?
Ist es möglich, auch Bits über ebendiese zu übertragen?
Wenn ich eine E-Mail versende, einen IRC verwende, oder einen Messenger mit lediglich Textfunktion benutze, kann ich hierüber auch Dateien übermitteln?
Base-Codierung
Egal ob Base16, Base32 oder Base64, die zugrundeliegende Idee ist dieselbe:
Wir teilen die Bits der zu codierenden Daten in Gruppen der Länge von n Bits auf.
Diese werden nun anhand einer Tabelle in ein ASCII-Zeichen umgewandelt.
Heraus kommt eine Zeichenfolge, welche sich für textbasierte Kommunikation eignet.
Im folgenden werde ich beispielhaft genauer auf base32 eingehen, da das Konzept hierdurch etwas klarer werden sollte.
Base32
Base32 teilt die Daten in Bitgruppen der Länge 5 auf.
Die Übersetzung erfolgt für 40 Bit, also 8 Buchstaben in der Ausgabe auf einmal.
Die Tabelle sieht folgendermaßen aus:
Wert | Codierung | Wert | Codierung | Wert | Codierung | Wert | Codierung |
---|---|---|---|---|---|---|---|
0 | A | 9 | J | 18 | S | 26 | 2 |
1 | B | 10 | K | 19 | T | 27 | 3 |
2 | C | 11 | L | 20 | U | 28 | 4 |
3 | D | 12 | M | 21 | V | 29 | 5 |
4 | E | 13 | N | 22 | W | 30 | 6 |
5 | F | 14 | O | 23 | X | 31 | 7 |
6 | G | 15 | P | 24 | Y | Padding | = |
7 | H | 16 | Q | 25 | Z | ||
8 | I | 17 | R |
Hierbei sei anzumerken, das durch das Konvertieren in 8er-Gruppen (40Bits) die Zahl der Buchstaben durch 8 teilbar sein muss. Sollte dem nicht so sein, werden die restlichen Zeichen mit = aufgefüllt.
Anhand des GNU-Programms base32
können wir nun einen kleinen Test durchführen.
Beispiel
Da base32 jeglichen Input als Binär-Datenstrom interpretiert, werde ich der Einfachheit halber hier nur Zeichenfolgen base32-codieren.
Dies ist jedoch selbstverständlich auch mit anderen Dateien(Bilder, PDF, Videos, Musik, Executables usw.)/Bitfolgen möglich.
Über den Befehl
echo "Hello World" | base32
Erhalten wir den base32-String
JBSWY3DPEBLW64TMMQFA====
mit 24 Zeichen (20 Zeichen + 4 Zeichen Padding).
Dieser kann nun durch den Befehl
echo "JBSWY3DPEBLW64TMMQFA===="|base32 -d
zurück in Hello World
übersetzt werden.
Aufgaben
Der folgende base32-Strings enthält Fehler.
Findet und behebt diesen, um den Originaltext zu erhalten:
MJQXGZJTGIQGS43UEBZXK4DFOIFA
Und die (schwerere) Fleißaufgabe:
JZUWG2DUEBX9HK4RAMRQXGICQMFSGI2LOM4QGW8YLONYQE-MZLINRSXEIDFNZ2GQYLMORSW4CQ=
Quelle
Der rfc3548-Standard
https://tools.ietf.org/html/rfc3548.html