Base64

V počítačové vědě je base64 kódování informací pomocí 64 znaků , které bylo vybráno pro většinu systémů. Definováno jako MIME kódování v RFC  2045, je primárně používáno pro přenos zpráv ( e - mail a fóra Usenet ) přes internet . Je také definován samostatně v RFC  4648.

Popis

Abeceda 65 znaků, se používá pro umožnění znázornění 6 bitů o jeden znak. 65 th  znak (symbol „  =  “), se používá pouze v závěrečné komplementu v procesu kódování zprávy.

Tento proces kódování spočívá v kódování každé skupiny 24 po sobě jdoucích bitů dat řetězcem 4 znaků. Postupujeme zleva doprava, zřetězením 3 bajtů vytváříme jednu skupinu 24 bitů (8 bitů na bajt ). Poté jsou rozděleny na 4 čísla o pouhých 6 bitech (což v binárním formátu umožňuje pouze 64 kombinací). Každá ze 4 hodnot je nakonec reprezentována (kódována) znakem vybrané abecedy. (Tabulka níže.)

Jakékoli 3 bajty jsou tedy nahrazeny 4 znaky, které jsou vybrány tak, aby byly kompatibilní se všemi stávajícími systémy.

Každá hodnota (každá skupina 6 bitů) je použita jako index v tabulce níže. Odpovídající znak je uveden ve sloupci kódování .

Valeur Codage Valeur Codage Valeur Codage Valeur Codage 0 000000 A 17 010001 R 34 100010 i 51 110011 z 1 000001 B 18 010010 S 35 100011 j 52 110100 0 2 000010 C 19 010011 T 36 100100 k 53 110101 1 3 000011 D 20 010100 U 37 100101 l 54 110110 2 4 000100 E 21 010101 V 38 100110 m 55 110111 3 5 000101 F 22 010110 W 39 100111 n 56 111000 4 6 000110 G 23 010111 X 40 101000 o 57 111001 5 7 000111 H 24 011000 Y 41 101001 p 58 111010 6 8 001000 I 25 011001 Z 42 101010 q 59 111011 7 9 001001 J 26 011010 a 43 101011 r 60 111100 8 10 001010 K 27 011011 b 44 101100 s 61 111101 9 11 001011 L 28 011100 c 45 101101 t 62 111110 + 12 001100 M 29 011101 d 46 101110 u 63 111111 / 13 001101 N 30 011110 e 47 101111 v 14 001110 O 31 011111 f 48 110000 w (complément) = 15 001111 P 32 100000 g 49 110001 x 16 010000 Q 33 100001 h 50 110010 y

Speciální zpracování se provádí, pokud je na konci datové sekvence, která má být kódována, k dispozici méně než 24 bitů (nemusí mít nutně velikost, která je násobkem 24 bitů). V takovém případě jsou nuly přidány napravo od počátečních dat k přechodu na nejbližší 6bitový násobek. Každý 6bitový paket je převeden do abecedy. Potom přidáme další znaky "  =  ", aby stále tvořily 4 znaky.

Vzhledem k tomu, že vstupní data musí sestávat z celočíselného počtu bajtů, jsou na konci sekvence možné pouze tři případy:

Nevýhody

Toto kódování zvyšuje velikost dat: velikost dat se zvyšuje alespoň o jednu třetinu. Bílé znaky (mezera, karta, nový řádek) velikost ještě zvětšují.

S tímto kódováním jsou i čitelné znaky v původních datech kódovány nečitelně. Pokud je většina znaků původního textu již čitelná, je možné uvažovat o kódování pouze problematických znaků. Viz například kódování v uvozovkách pro tisk .

Zájem

Výhoda kódování base64 se tedy nenachází v reprezentaci textových dat , ale především v reprezentaci binárních dat .

Když chceme reprezentovat binární data ( obrázek , spustitelný soubor ) v textovém dokumentu, jako je e-mail, hexadecimální přepis v ASCII bajtů by vynásobil velikost dvěma, kódování base64 umožňuje toto zvýšení omezit.

Kritika týkající se čitelnosti údajů navíc spadá sama za těchto podmínek: binární data nejsou zamýšlena jako srozumitelná bez interpretace pomocí speciálního softwaru (například v případě obrázku).

base64url

Dokument RFC  4648 poskytuje alternativu ke kompatibilnímu kódování se jmény souborů a URI . Ve skutečnosti mohou znaky 62 ( + ) a 63 ( / ) způsobit problémy s určitými systémy souborů a v URI . Zvolené řešení spočívá v nahrazení těchto znaků minusem ( - ) a podtržítkem ( _ ). Znak doplňku zůstává „  =  “, ale lze jej ignorovat. Tento systém se například používá pro redukci URL .

Valeur Codage Valeur Codage Valeur Codage Valeur Codage 0 000000 A 17 010001 R 34 100010 i 51 110011 z 1 000001 B 18 010010 S 35 100011 j 52 110100 0 2 000010 C 19 010011 T 36 100100 k 53 110101 1 3 000011 D 20 010100 U 37 100101 l 54 110110 2 4 000100 E 21 010101 V 38 100110 m 55 110111 3 5 000101 F 22 010110 W 39 100111 n 56 111000 4 6 000110 G 23 010111 X 40 101000 o 57 111001 5 7 000111 H 24 011000 Y 41 101001 p 58 111010 6 8 001000 I 25 011001 Z 42 101010 q 59 111011 7 9 001001 J 26 011010 a 43 101011 r 60 111100 8 10 001010 K 27 011011 b 44 101100 s 61 111101 9 11 001011 L 28 011100 c 45 101101 t 62 111110 - (minus) 12 001100 M 29 011101 d 46 101110 u 63 111111 _ (underline) 13 001101 N 30 011110 e 47 101111 v 14 001110 O 31 011111 f 48 110000 w (complément) = 15 001111 P 32 100000 g 49 110001 x 16 010000 Q 33 100001 h 50 110010 y

Za účelem překonání nekompatibilní invariance Base64 v důsledku zahrnutí více než dvou znaků „symbolické třídy“ (+, /, = atd.) Do výstupního obsahu bylo do výstupního obsahu zavedeno nezašifrované schéma kódování Base62x pro obsah výstupu. oblast softwarového inženýrství. Base62x je považován za vylepšenou verzi nepodepsaného Base64.


Příklad

Zvažte skupinu 3 znaků ASCII „  Ahoj!  ". Pod prvním řádkem označuje binárně ekvivalenci těchto 3 bytů. Transformace spočívá, jak vidíme, v oddělení bitů tak, aby na výstupu byly 4 skupiny po 6 bitech:

01001000 01101001 00100001 ⇔ 010010 000110 100100 100001

4 skupiny 6 výstupních bitů nám dávají hodnoty 18, 6, 36 a 33. Sledováním korespondence indexované tabulky tedy získáme 4 znaky „  SGkh  “.

Pomocí příkazu base64 v systému Linux  :

$ echo -n 'Hi!' | base64
SGkh

Vezmeme-li znakový řetězec, který nemá počet bitů násobek 24 (kódování se provádí paketem 4 x 6 bitů = 24 bitů), například řetězec „  Ahoj  “:

S a l u t 01010011 01100001 01101100 01110101 01110100 ⇔ 010100 110110 000101 101100 011101 010111 010000 ?????? (nombre de bits multiple de 24) ⇔ U 2 F s d X Q =

Postup kódování je následující: Poslední skupina „0100“ je doplněna dvěma „0“, aby měla velikost 6 bitů. Odpovídajícím symbolem v tabulce je písmeno „Q“. Poté, abychom získali počet bitů, který je násobkem 24, je také nutné přidat skupinu 6 bitů „padding“, které jsou symbolizovány „=“.

Získali jsme tedy „  Ahoj  “ ⇒ „  U2FsdXQ =  “.

B o n j o u r 01000010 01101111 01101110 01101010 01101111 01110101 01110010 ⇔ 010000 100110 111101 101110 011010 100110 111101 110101 011100 100000 ?????? ??????? ⇔ Q m 9 u a m 9 1 c g = = (g vaut 100000)

Získali jsme tedy „  Hello  “ ⇒ „  Qm9uam91cg ==  “.

Příklad s OpenSSL

Kódování textového souboru v base64:

$ openssl enc -base64 -in monfichier.txt -out monfichier.b64

Dekódování textového souboru v base64:

$ openssl enc -d -base64 -in monfichier.b64 -out monfichier.txt

Poznámky a odkazy

  1. (in) Request for Comments n °  2045 .
  2. (in) Request for Comments n °  4648 .