V dnešním příspěvku si představíme kódování Base64 a volně navážeme na úvodní díl do problematiky Šifry, kódy a hashovací funkce (1.část).

Base64

Base64 je kódování, které umí převést binární data, tj. tisknutelné a netisknutelné znaky, do množiny tisknutelných znaků. Toto kódování je oblíbené v některých aplikačních protokolech, aby přenášená binární data nenarušila konvence aplikačního protokolu a neznemožnila přenos informace. Kódování Base64 například najdeme ve standardu MIME, který používáme v e-mailech, abychom odeslali text s diakritikou nebo přílohu. Kódování Base64 můžeme použít i k přenosu binárního souboru mezi terminály přes schránku operačního systému. Jsou případy, kdy se tato vlastnost opravdu hodí, ať už jste zkušený admin nebo penetrační tester.

Algoritmus

Pokud máme zobrazit binární data do menšího prostoru tisknutelných znaků, je jasné, že kódovaná data budou delší. Název Base64 napovídá, že základem je 64 stavů, které lze reprezentovat 6 bity (6 bitů = 2^6 = 64 stavů).

Algoritmus kódování Base64 pracuje tak, že rozseká vstupní data po 3 bajtech a každé 3 bajty dále rozdělí po 6 bitech, což nám dává 4 * 6 bitových slov. Algoritmus udržuje tabulku tisknutelných znaků, kde indexem je právě tento 6bitový klíč. Když to shrneme, tak původní 3 bajty (3 tisknutelné nebo netisknutelné znaky) se při kódování Base64 promění na 4 tisknutelné znaky (ASCII). Při dekódování pracuje algoritmus obráceně, tj. rozseká tisknutelné znaky po čtyřech a zobrazí je přes mapovací tabulku na množinu 3 bajtů binárních dat.

Kódování

K demonstraci budeme potřebovat utilitku base64, která je dostupná a předinstalována v linuxových distribucích Ubuntu a Kali. Uživatele OS Windows mohou sáhnout po této verzi base64 nebo si na webu vyzkoušet online Base64 kodér a dekodér.

Příklad 1 – kódování

V příkazovém řádku pomocí příkazu echo postupně vytiskneme text, který reprezentují číslice „123“.  Příkaz echo doplníme o přepínač (-n), který zajistí, že text nebude odřádkován netisknutelným znakem, abychom měli jistotu, že kódujem to, co chceme. Připravený text pošleme na vstup programu base64 pomocí znaku roury „|“, která v operačním systému linux zřetězuje výstup jednoho programu na vstup následujícího programu.  Program base64 zakóduje zaslaný text a zobrazí jej v kódované formě na obrazovku.

Z použitých variací vidíme, že text o délce 1 až 3 bajty je po zakódování zarovnán vždy na čtyři znaky. Režie kódování je 33% (4/3), přesné vyjádření naleztene na stránce wikipedie – Base64.

Výplň

V předešlém příkladě se objevily znaky rovnítka, které reprezentují výplň. Pokud vstupní data (trojice bajtů) nemají ve druhém a třetím bajtu žádnou hodnotu, použije algoritmus kód pro výplň, tj. dva znaky rovnítek (==). Pokud chybí informace v posledním třetím bajtu, použije se jen jeden kód pro výplň (=). Výplň zajišťuje symetrii na trojice, aby zafungovalo správně dekódování.

Právě podle rovnítka na posledních pozicích nebo podle délky kódu, která je vždy násobkem 4, poznáme, že máme tu čest s kódováním Base64!

Dekódování

Příklad 2 – dekódování

Teď, když už poznáme kódovaný text v Base64, můžeme si ukázat reverzní operaci dekódování.

Závěr

V dnešním příspěvku jsme se seznámili s algoritmem kódováním Base64, identifikovali jsme výplň a vyzkoušeli jsme si operaci kódování a dekódování. Dále jsme ověřili, že délka kódu je vždy násobkem čtyř.