Annonce

Réduire
Aucune annonce.

Le base64 en php

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Le base64 en php

    Nous verrons dans un premier temps la définition de la base64, en quoi cela consiste, à quoi elle peut servir, son fonctionnement théorique... Ensuite nous étudierons son fontionnement pratique à l'aide du php, et enfin nous verrons le script final.


    1/ Piqure de rappel

    - « Qu'est ce que la base64 ? »

    Comme son nom l'indique, c'est une base codée sur... 65 caracteres !!!

    - « De quoi ? Mais pourquoi on l'a appelé base64 alors ? »

    Oh la mon gamin ! Tout vient a point nommé ! D'abord, a quoi ca sert la base64 ?
    Et bien elle sert a coder des mails par exemple. Exemple : si j'envoie un mail au Etats Unis, avec comme piece jointe un programme. Ce programme sera codé selon un base ASCII francaise. Effectivement, au dela de 7 bits, les tables ASCII changent delon les langues (par exemple, le é francais ne sera pas codé dans une table ASCII américaine), ce qui risque de poser problème lors de la lecture du mail. Pour pallier à ce problème, des petits malins ont inventés la base64 ! Et oui !

    - « Mais, euhh... Comment ca marche ta base machin chose, la ! »

    Base64 ! Et bien en fait ce n'est pas très compliqué. On a juste transposé chaque caractere dans une table tierce, codée sur 6 bits (donc 64 caractères). Cette table comporte l'alphabet min/MAJ, les chiffres de 0 à 9, le + et le /
    Pour transposer des caractères de la table ASCII étendue, on coupe donc le binaire des caractères sur 6 bits, que l'ont transpose ensuite en alphanumérique grace à cette table tierce.
    Voilà une preuve par l'exemple :
    Pour écrire le mot « Hi! », on code le H en binaire, puis le i, puis le !, ce qui nous donne quelque chose comme ceci :

    01001000 01101001 00100001

    On coupe ensuite les groupe de 8 pour en faire des groupes de 6 bits :

    010010 00 0110 1001 00 100001

    Ce qui, bien regroupé, donne ceci :

    010010 000110 100100 100001

    Ensuite, on transpose chaque groupe en caractere de la table base64.
    Ainsi, le 010010, donne en décimal un S, et ainsi de suite, ce qui nous donne au final la chaine : SGkh
    Pour repasser dans le sens inverse, il suffit de remettre chaque groupe en 8 bits.

    - « Mais tu as dit tout a l'heure qu'il y avait 65 caractères ! Tu mens alors ! »

    Et bien non ! En fait, le 65eme caractere correspond au = . Il est d'ailleurs tres utilse. En fait, imaginons qu'il y aie eu un espace entre le Hi et le ! de l'exemple d'avant. Cela aurait donné en binaire :

    01001000 01101001 0100000 00100001

    si l'on coupe le binaire en groupe de 6, on obtient ceci :

    010010 000110 100100 100000 001000 01

    Et la : Probleme ! Il reste deux caractère (le 01)... on a donc décidé de remplacer les 0 manquants par des = (c'est ce qu'on appelle le padding, ou bourrage). Ainsi, le message de tout a l'heure (Hi !) correspondrait à SGkgIQ== (chaque = correspond a deux 0), ce qui permet d'arriver a obentir un groupe de 6 bits.
    Enfin, voilà la table base64 :
    Code:
    Valeur Codage
    
    0 A            17 R            34 i            51 z
    1 B            18 S            35 j            52 0
    2 C            19 T            36 k            53 1
    3 D            20 U            37 l            54 2
    4 E            21 V            38 m           55 3
    5 F            22 W            39 n           56 4
    6 G            23 X            40 o           57 5
    7 H            24 Y             41 p          58 6
    8 I            25 Z             42 q           59 7
    9 J            26 a             43 r            60 8
    10 K            27 b            44 s            61 9
    11 L            28 c             45 t            62 +
    12 M            29 d            46 u           63 /
    13 N            30 e            47 v
    14 O            31 f            48 w           (complément) =
    15 P            32 g            49 x
    16 Q            33 h            50 y
    voilà, je pense que vous savez tout pour la piqure de rappel ! Maintenant, deuxieme partie !

    2/ base64 en php

    - « Quoi ? Base64 en php ? T'as codé ca ? Mais t'es couillon ! Il existe une fonction toute faite ! »

    Et alors ! Ca permet d'apprendre a fond la base64 et en plus ca fait découvrir des fonctions php, donc c'est tout bénef !

    Bon, un petit récapitulatif s'impose, pour bien comprendre le fonctionnement de la base64 en php :
    - Passer chaque caractere en decimal pas rapport à la table ASCII
    - Pour ensuite les passer en binaire
    - Diviser la chaine binaire en groupe de 6
    - Repasser le binaire en decimal
    - Puis enfin les remettre en caractere selon la table base64 (voir plus haut)

    Pour cela, nous allons utiliser des boucles qui verifieront que le caractère existe. A l'interieur de cette boucle, a l'aide de la fonction ord() (merci a zours pour l'info), nous remplacerons chaque cara par son equivalent décimal. Ensuite, toujours dans la boucle, il faut remplacer, avec la fonction decbin(), les caracteres décimaux en binaire.

    Un point sensible de decbin est qu'il fait au plus simple. C'est a dire qu'il ne code pas en binaire selon 8 bits, mais au plus court, c'est à dire qu'il codera un 5 en 101 et non pas en 00000101.

    Il faut donc modifier chaque séquence binaire afin de rajouter le nombre de 0 nécéssaire, pour arriver à 8 bits (si chaque groupe n'est pas à 8 bits, le codage est faussé par la suite). (Une boucle While ($binaire < 8 ) { $binaire = 0.$binaire; } suffit pour corriger le problème.)
    A la fin de la boucle, on concatène chaque groupe de 8 bits, pour que le prochain tour du while n'efface pas le contenu du tour précédent.
    On doit donc ensuite scinder la variable binaire en séquence de 6 bits, pour pouvoir les coder selon la table base64.
    La solution que j'ai trouvé est de faire un wordwrap() afin d'inserer un caractère (en l'occurence <br />) tous les 6 caractère ; pour ensuite faire un tableau avec la fonction explode()
    Chaque séquence de 6 bits est donc inscrit dans une entrée d'un tableau.
    Il faut ensuite ouvrir une nouvelle boucle, qui permettra de travailler sur les entrées du tableau.
    Dans cette boucle, on doit simplement passer les groupe binaire en decimal (avec la fonction bindec() ), puis les passés du décimal au caractères de la base64().
    Pour cela, il suffit en fait de faire un tableau avec les caractères de la base64, dans l'ordre. C'est à dire $tableau = array ('A', 'B',..., '9', '+', '/').
    Ensuite, il faut simplement passer chaque caractère décimal dans le tableau, et en tirer son équivalent en base64(). Par exemple, si après le bindec, on obtient un caractère décimal 27, il faut faire
    $base .= $tableau[27] ;
    Ainsi, le caractère 27 sera interprété par un b dans la variable base.
    On note le point de concaténation, qui nous sert a garder en mémoire les itérations précédentes.
    Voilà comment on encode en base64 avec php.
    La partie décodage reste sur le même principe, mais dans le sens inverse, je conseille de bien regarder le code source pour comprendre comment se font ses deux parties.

    Bien évidemment, je n'ai pas tout expliqué dans cette partie. Il reste certains points, comme la sécurité (XSS),le padding, ou quelques problèmes du à certains caractères (pour ceux qui regarderont le code source, si vous savez pourquoi le 0 ne passe pas, envoyez moi un mail ou laissez un commentaire) qui n'ont pas été eclaircits.

    3 / Le fameux script

    Je laisse le script dans un fichier php à part, contenu dans le fichier zip. Je vous laisse le soin de l'étudier, de le comprendre, et, pourquoi pas, de l'optimiser (si jamais vous améliorez ce script, mailez moi, ou laissez moi un commentaire.). Si vous voulez vous teste à l'écrire dans un autre language, je pourrai le rajouter sur le site et sur le fichier zip
    " Une teuf sans drogue c'est comme une levrette sans fessé, c'est quand même rare. "

    †|

  • #2
    where's the script?
    sigpic

    Cyprium Download Link

    Plus j'étudie plus j'me rends compte que je n'sais rien.

    †|

    Commentaire

    Chargement...
    X