Convertisseur Base64

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

Télécharger à ce lien.

Aperçu

Le logiciel est en action dans cette vidéo Flash.

Pour le développement, vous avez besoin de :

  • L'article Wikipédia sur Base64
  • Masm32
  • Un débuggeur
  • Visual C++
  • Table de caractères - Charmap.exe
  • Calculatrice Windows - Calc.exe
  • Le tout en poche - Assembleur x86 de Jean-Bernard Emond

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).

Creative Commons - Attribution, No derivative work (BY-ND)

Structure du programme

On commence par l'en-tête

  • On déclare les entêtes pour activer la gestion des fenêtres, des contrôles et des fonctionnalités avancées.
  • Dans .CONST, les composants sont définis par un numéro entier unique. Un nom commençant par IDC_ (IDent + Component) permet de s'en souvenir facilement. On y stocke aussi notre table de conversion qui ne bougera plus.
  • Dans .DATA, on déclare principalement les chaînes de caractères. Elles peuvent être dans .CONST de manière à ce qu'elles ne soient plus modifiables, mais je préfère hiérarchiser mes variables. Dans .CONST, il est crucial que les ID composants ne changent pas.
  • Dans .DATA?, on déclare les variables logicielles pour le fonctionnement des API Windows et des tampons de stockage.

L'encodage

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.

Le décodage

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.

L'interface

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++

Les performances

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.

Avez-vous trouvé l'information que vous cherchiez ? Votre retour d'expérience sur le site nous intéresse.

Dernière modification le 27 janvier 2013 à 19:24