Si Internet est l’autoroute de l’information, le chemin du courrier électronique est un étroit ravin. Seuls les très petits chariots peuvent passer.
Le système de transport de courrier électronique est conçu pour le texte ASCII brut uniquement. Essayer d'envoyer du texte dans d'autres langues ou des fichiers arbitraires revient à faire passer un camion dans le ravin.
Comment se passe le gros camion dans le ravin?
Alors, comment envoyez-vous un gros camion dans un petit ravin? Vous devez le démonter d'un côté, transporter les morceaux à travers le ravin et reconstruire le camion à partir des morceaux de l'autre.
La même chose se produit lorsque vous envoyez un fichier en pièce jointe par courrier électronique. Dans un processus appelé codage, les données binaires sont transformées en texte ASCII, qui peut être transporté sans problème par courrier électronique. Du côté du destinataire, les données sont décodées et le fichier d'origine est reconstruit.
Une méthode de codage de données arbitraires sous forme de texte ASCII brut est Base64. C'est l'une des techniques employées par la norme MIME pour envoyer des données autres que du texte brut.
Base64 à la rescousse
Le codage Base64 prend trois octets, chacun composé de huit bits, et les représente sous forme de quatre caractères imprimables dans la norme ASCII. Il le fait essentiellement en deux étapes.
La première étape consiste à convertir trois octets en quatre nombres de six bits. Chaque caractère de la norme ASCII comprend sept bits. Base64 utilise uniquement 6 bits (correspondant à 2 ^ 6 = 64 caractères) pour garantir que les données codées sont imprimables et lisibles par l'homme. Aucun des caractères spéciaux disponibles en ASCII n'est utilisé.
Les 64 caractères (d'où le nom Base64) sont 10 chiffres, 26 caractères minuscules, 26 caractères majuscules ainsi que "+" et "/".
Si, par exemple, les trois octets sont 155, 162 et 233, le train de bits correspondant (et effrayant) est 100110111010001011101001, ce qui correspond aux valeurs à 6 bits 38, 58, 11 et 41.
Ces nombres sont convertis en caractères ASCII à la deuxième étape à l'aide du tableau de codage Base64. Les valeurs à 6 bits de notre exemple sont traduites en séquence ASCII "m6Lp".
- 155 -> 10011011
- 162 -> 10100010
- 233 -> 11101001
- 100110 -> 38
- 111010 -> 58
- 001011 -> 11
- 101001 -> 41
- 38 -> m
- 58 -> 6
- 11 -> L
- 41 -> p
Ce processus en deux étapes est appliqué à toute la séquence d'octets codés. Pour vous assurer que les données codées peuvent être correctement imprimées et ne dépassent pas la limite de longueur de ligne du serveur de messagerie, des caractères de nouvelle ligne sont insérés pour maintenir les longueurs de ligne inférieures à 76 caractères. Les caractères de nouvelle ligne sont codés comme toutes les autres données.
Résoudre la phase finale
À la fin du processus de codage, nous pourrions rencontrer un problème. Si la taille en octets des données d'origine est un multiple de trois, tout fonctionne correctement. Si ce n'est pas le cas, nous pourrions nous retrouver avec un ou deux octets de 8 bits. Pour un codage correct, nous avons toutefois besoin d’exactement trois octets.
La solution consiste à ajouter suffisamment d'octets avec la valeur «0» pour créer un groupe de 3 octets. Deux de ces valeurs sont ajoutées si nous avons un octet supplémentaire de données, une est ajoutée pour deux octets supplémentaires.
Bien entendu, ces 0 finaux artificiels ne peuvent pas être codés à l'aide du tableau de codage ci-dessous. Ils doivent être représentés par un 65ème caractère.
Le caractère de remplissage Base64 est '='. Naturellement, il ne peut jamais apparaître qu'à la fin des données encodées.
Table d'encodage Base64
Valeur | Carboniser | Valeur | Carboniser | Valeur | Carboniser | Valeur | Carboniser | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | UNE | 16 | Q | 32 | g | 48 | w | |||
1 | B | 17 | R | 33 | h | 49 | X | |||
2 | C | 18 | S | 34 | je | 50 | y | |||
3 | ré | 19 | T | 35 | j | 51 | z | |||
4 | E | 20 | U | 36 | k | 52 | 0 | |||
5 | F | 21 | V | 37 | l | 53 | 1 | |||
6 | g | 22 | W | 38 | m | 54 | 2 | |||
7 | H | 23 | X | 39 | n | 55 | 3 | |||
8 | je | 24 | Y | 40 | o | 56 | 4 | |||
9 | J | 25 | Z | 41 | p | 57 | 5 | |||
10 | K | 26 | une | 42 | q | 58 | 6 | |||
11 | L | 27 | b | 43 | r | 59 | 7 | |||
12 | M | 28 | c | 44 | s | 60 | 8 | |||
13 | N | 29 | ré | 45 | t | 61 | 9 | |||
14 | O | 30 | e | 46 | vous | 62 | + | |||
15 | P | 31 | F | 47 | v | 63 | / |