L'algorithme Base 64, utilisé dans les authentifications Basic par HTTP et dans les formats MIME des mails, permet de coder toute donnée avec des caractères imprimables ASCII simples : A-Z, a-z, 0-9, +, /
Le fonctionnement est simple. Un caractère est codé sur 8 bits. Une chaîne de caractères est la succession de ces caractères. En partant de la gauche, on considère 6 bits à chaque fois. Ces bits codent une valeur entre 0 et 63.
Le nombre obtenu correspond à la position d'un caractère dans une table de conversion. Le zéro code pour "A", le un code pour "B"... et 63 pour "/". Ces caractères sont nécessairement codés sur 8 bits. On les met les uns à la suite des autres afin d'obtenir la traduction en BASE64.
Le décodage consiste en l'opération inverse.
Le logiciel est en action dans cette vidéo Flash.
Pour le développement, vous avez besoin de :
Le logiciel est livré open-source sous les termes de la licence Creative Commons. Vous pouvez le redistribuer dans sa forme originale non modifiée, tout en spécifiant les droits de propriété (ie. l'URL de ce site web).
On commence par l'en-tête
Il commence par le calcul du nombre de paquets possibles en groupant 3 octets. Les octets restants permettent de compléter la chaîne de sortie avec des signes "=", pour former une longueur multiple de 4.
Une fois la chaîne récupérée en position ESI, on stocke 4 octets à partir de [ESI] dans EAX (mais seuls les 3 premiers octets seront utilisés). Comme Intel est antipathique avec nous sur le coup, les données [ESI]aa,[ESI+1]bb,[ESI+2]cc,[ESI+3]dd sont transférées en tant que EAX=ddccbbaa. Pour calculer des groupes de 6 bits, il faut donc réordonner en aabbccdd. C'est du calcul qui aurait pu être évité.
On fait une opération logique sur les 6 bits de poids fort de EAX, on les déplace tout à droite (les vides sont complétés avec des zéros via SHR). On cherche le correspondant dans la table de conversion. Une opération logique de AL sur CL permet de copier rapidement les bits.
On décale les bits pour passer au suivant. Etc... une fois les 24 bits d'entrées traités, on désordonne les données pour les copier dans [EDI].
Avec l'encodage, 3 octets en génèrent 4. Comme les tampons sont limités à 1024, il est logique qu'en mode encodage, la longueur d'entrée soit limitée à 768 caractères. Sinon, il y a petit dépassement du tampon de sortie mis à la fin du bloc .DATA.
C'est le même principe. On considère 4 octets en entrée (24 bits utiles répartis sur 32 bits). Sur chaque caractère, seul les 6 bits de droite nous intéressent. On les isole en lisant tout simplement AL.
Avec CharMap.exe, on détermine les soustractions à faire pour faire correspondre "A" à 0, "B" à 1... Ca nous donne un nombre entre 0 et 63. Il est structuré sur 8 bits, avec ses 2 bits de poids fort mis à zéro. Un simple OR sur CL permet de copier les 6 bits faibles de AL dans CL, sans que les 2 bits forts de CL ne soient touchés. C'est le principe du OU logique.
On désordonne les données pour les copier à la destination finale. La chaîne est alors décodée.
Au niveau de l'Entry Point, on charge des variables techniques pour que les fonctions API puissent agir sur notre application. Le SoftProcessor() permet de faire la moulinette de tous les messages envoyés à l'application par Windows.
Il n'est pas utile de faire de longs discours sur comment marche la fonction. Ce ne sont que des appels standards avec transmission de paramètres. Arrêtons-nous uniquement sur WM_INITDIALOG : il n'est exécuté qu'une seule fois afin de régler les paramètres d'affichage, notamment les caractéristiques utilisateur des composants de texte.
Pour faire évoluer l'apparence du logiciel et modifier l'ordre des tabulations, il faut ouvrir le fichier RC à l'aide de Visual C++
Le logiciel inclut une portion de code pour mesurer les performances de l'algorithme. J'obtiens 975.000 conversions par seconde en encodage pour une chaîne de caractères relativement longue.
Dernière modification le 27 janvier 2013 à 19:24