Niveau :
Résumé : openssl base64 ; perl -MMIME::Base64
De nombreux standards sont définis pour être explicitement lisibles par l'utilisateur, par exemple le mail. Il doivent donc être composés de caractères lisibles. Cela peut poser problème si on veut transmettre un fichier binaire qui par définition peut contenir n'importe quoi.
C'est à ce moment qu'on a inventé l'encodage en base 64. Le principe est simple, plutôt que d'utiliser des octets de 8 bits, on va utiliser des "octets" de 6 bits (2^6 = 64, vous aurez compris le nom), lesquels seront écrit dans des octets de 8 bits, mais en utilisant exclusivement des caractères ascii lisibles (A-Z,a-z,0-9,+,/). Exemple :
# on transforme 3 octets en base 64 Caractères (/8) : "ABC" Hexadécimal (/8) : 41 42 43 Binaire (/8) : 01000001 01000010 01000011 Binaire (/6) : 010000 010100 001001 000011 Hexadécimal (/6) : 10 14 09 03 Base64 : "QUJD"
La dernière étape n'a rien d'évidente puisqu'elle n'utilise pas la table ascii, mais une table spécifique que voici :
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
On y ajoute quelques subtilités, par exemple il n'est pas toujours possible de faire des blocs de 6 complets. Si le nombre d'octets à coder n'est pas multiple de 3, on complète les caractères base64 manquant par des '=' pour indiquer de ne pas prendre en compte les bits correspondant. Notez que tous les caractères qui ne font pas partie de l'encodage sont autorisés et simplement ignorés lors de décodage. Ce qui veut dire que vous pouvez formater votre base64 comme vous voulez avec des espaces et des retours à la ligne.
Maintenant que vous avez compris le principe vous n'allez pas toujours encoder ou décoder à la main. Des outils sont déjà présents chez vous :
# avec openssl $ echo "Binaire" | openssl base64 > QmluYWlyZQo= $ echo "QmluYWlyZQo=" | openssl base64 -d > Binaire # ou avec perl $ perl -MMIME::Base64 -e 'print encode_base64("Binaire\n");' > QmluYWlyZQo= $ perl -MMIME::Base64 -e 'print decode_base64("QmluYWlyZQo=");' > Binaire
Conclusion : maintenant vous savez pourquoi les pièces jointes des email prennent 33% de plus de bande passante que leur taille réelle (il en est de même pour les news binaires ;-). Et vous savez aussi pourquoi il vous est possible de copier/coller facilement votre clé ssh ou gpg alors que ce sont des binaires.