Encoder puis décoder en Base64

Partagez votre expérience de PureBasic avec les autres utilisateurs.
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

Encoder puis décoder en Base64

Message par gansta93 »

Bonjour tout le monde,

Voici un petit code qui pourait servire.
Peut-être y a-t-il eu déjà un poste à ce sujet, mais je ne l'ai pas trouvé.
Donc ce code... Vous entrez une chaîne de caractère, il la crypte en Base64, vous montre le résultat, la décode, vous montre le résultat, et si les deux chaînes ne sont pas les mêmes, il le dit :-).

Code : Tout sélectionner

Procedure Decode(b64in$, b64len.l, *b64out, b64max.l)
  *b64in.l = @b64in$ ; <- On mait ça pour utiliser une chaîne de caractère en paramaître
  ; Tables de conversion
  For b64x = 0 To 255
    b64asc$ = b64asc$ + Right("0000000" + Bin(b64x), 8) + "|" ; Code ASC Binairs
  Next b64x
  
  b64tab$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" ; Code base64
  RtlFillMemory_(*b64out, b64max, 0)
  
  ; décoder
  b64tln = b64len / 4
  
  For b64xln.l = 0 To b64tln - 1
    b64bcd$ = PeekS(*b64in + b64xln * 4, 4)
    
    b64bin$ = ""
    b64pad = 0
    For b64xb = 1 To 4
      b64tcd$ = Mid(b64bcd$, b64xb, 1)
      b64num = FindString(b64tab$, b64tcd$, 0) ; base64 à 6 Bit-Code
      If b64num > 0
        If b64num = 65
          b64pad + 1
        EndIf
        b64bin$ + Right("000000" + Bin(b64num - 1), 6) ; Code 24 Bit
      Else
        b64err = 1
        b64xln = b64tln + 1
      EndIf
    Next b64xb
    
    For b64xu = 0 To 2 - b64pad
      b64bit$ = Mid(b64bin$, 1 + b64xu * 8, 8) + "|"
      b64num = FindString(b64asc$, b64bit$, 0) / 9 ; ASC Code 8 Bit Binair
      PokeS(*b64out + b64buf, Chr(b64Num))
      b64buf + 1
      If b64buf > b64max
        b64err = 1
        b64xln = b64tln + 1
      EndIf
    Next b64xu
    
  Next b64xln
  
  If b64err = 1
    RtlFillMemory_(*b64out, b64max, 0)
    b64buf = -1
  EndIf
  ProcedureReturn b64buf
EndProcedure

mot$ = InputRequester("Essais Base64 Encoder", "Entrez la phrase à crypter:", LSet("Essais", 1000, "@")) ; on force à avoir une chaîne longue comme valeure par défaut (faut bien s'amuser!)
If mot$
  nb = Len(mot$) + Len(mot$) * 1.31 ; on calcule ce qu'il faudra alouer comme mémoire (31% de plus que le nombre d'octets que prand la chaîne originale).
  If nb < 64 ; Comme il faut alouer au minimum 64 octets de mémoire pour Base64Encoder(),
;   on vérifi que le nombre calculé est bien supérieur ou égal à 64
; S'il est inférieur, on le défini à 64
    nb = 64
  EndIf
  *buffer = AllocateMemory(nb)
  Base64Encoder(mot$, Len(mot$), *buffer, nb)
  var$ = PeekS(*buffer)
  MessageRequester("Essais", var$, #mb_ok | #mb_iconasterisk)
  *buffer2 = AllocateMemory(Len(var$)) ; à paremment, pas de restriction au niveau de la mémoire à alouer pour décoder.
  Decode(var$, Len(var$), *buffer2, Len(var$)) ; ........ on décode!
  decripte$ = PeekS(*buffer2) ; on récupère le contenu du buffer contenant la chaîne redécryptée
  MessageRequester("Essais", decripte$, #mb_ok | #mb_iconasterisk)
  If decripte$ <> mot$ ; Histoire de croire en sois, on vérifie que la chaîne décryptée et la chaîne
  ; originale soit bien les mêmes
    MessageRequester("Oups", "Les deux chaînes sont différentes!", #mb_ok | #mb_iconexclamation)
  EndIf
  FreeMemory(*buffer)
  FreeMemory(*buffer2)
EndIf
End
La procedure pour décoder est tirée de CodeArchive, donc dsl pour la traduction plutot... pas très compréhensible :-).

Amusez-vous bien! :-D