veilletech.fr
13 sept. Feed du jour
#08 OUTILS Article

Base84, un encodage taillé pour les noms de fichiers

Quatre-vingt-quatre caractères, et plus un nom de fichier qui casse.

TurboCrypt encodait les noms de fichiers chiffrés en Base91, qui tient sur Unix et macOS mais casse sur Windows. Frank Denis propose Base84 : les 94 ASCII imprimables hors espace, moins les 9 caractères interdits par Windows, moins le point. L'expansion moyenne tombe à 25,2 % contre 33,3 % pour Base64, et un nom de 255 octets transporte 197 octets d'entrée au lieu de 191.

3 min de lectureavancévidéo 1:19
Partager
Sommaire5 sections
  1. Ce qui se passe
  2. Comment on arrive à 84
  3. L'empaquetage
  4. L'effet de bord utile
  5. À retenir

Ce qui se passe

TurboCrypt chiffre les noms de fichiers et encodait le résultat en Base91 : compact, et accepté sur Unix et macOS — la contrainte n'étant pas le système de fichiers mais les applications par-dessus, le Finder en tête. Puis le support de Windows a été demandé, et Windows interdit plusieurs caractères de cet alphabet. D'où une bascule vers Base84, un encodage que personne ne semblait avoir ni défini ni utilisé.

Comment on arrive à 84

Le décompte se refait à la main :

Étape Reste
Caractères ASCII imprimables, espace exclu 94
Moins les 9 interdits par Windows : `< > : " / \ ? *`
Moins le point 84

Le point part pour deux raisons : un nom terminé par un point ne passe pas de façon fiable à travers le shell et les API Windows, et l'exclure évite au passage les noms cachés sur Unix et les cas particuliers . et ...

L'alphabet, dans l'ordre d'encodage :

TEXT
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&'()+,-;=@[]^_`{}~

L'empaquetage

L'encodeur émet des groupes de cinq caractères, et cinq est le bon nombre : 84⁵ = 4 182 119 424, soit 2,6 % sous 2³². Il regarde les 31 bits suivants ; si leur valeur est inférieure à 84⁵ − 2³¹, il y a la place d'un 32ᵉ bit, sinon il n'en consomme que 31. Sur une entrée aléatoire : 31,95 bits par groupe, soit 6,39 bits par caractère.

Encodage Expansion moyenne Pire cas
Base64 33,3 % 33,3 %
Base84 25,2 % 29,0 %

Le pire cas s'obtient avec une entrée remplie de 0xff, qui force chaque groupe à 31 bits. Et comme 5 divise exactement les 255 octets auxquels la plupart des systèmes plafonnent un nom, même un nom maximal ne contient que des groupes complets : 197 octets utiles, contre 191 en Base64 sans remplissage.

L'effet de bord utile

Windows réserve des noms de périphériques — CON, NUL, PRN, AUX, COM1 à COM9, LPT1 à LPT9 — quelle que soit la casse. L'empaquetage par cinq les rend inexprimables, sans traitement particulier :

À retenir

Pour des noms Unix uniquement, Base84 n'est pas le bon choix : la variante filesystem de zig-base91 remplace la barre oblique par une apostrophe et descend à environ 23 % d'expansion, pour 6,51 bits par caractère. Le Base91 standard, lui, contient encore /.

Base84 n'est pas un standard mais une proposition, avec une implémentation : jedisct1/zig-base84.