Whiz Tools

Encodeur/Décodeur Base64

Convertir du texte en encodage Base64 et vice versa

Copier

Encodeur et Décodeur Base64

Introduction

Base64 est un schéma de codage binaire en texte qui représente les données binaires sous un format de chaîne ASCII. Il est conçu pour transporter des données stockées dans des formats binaires à travers des canaux qui ne prennent en charge que de manière fiable le contenu textuel. Le codage Base64 convertit les données binaires en un ensemble de 64 caractères (d'où le nom) qui peuvent être transmis en toute sécurité sur des protocoles basés sur du texte sans corruption des données.

L'ensemble de caractères Base64 se compose de :

  • Lettres majuscules A-Z (26 caractères)
  • Lettres minuscules a-z (26 caractères)
  • Chiffres 0-9 (10 caractères)
  • Deux caractères supplémentaires, généralement "+" et "/" (2 caractères)

Cet outil vous permet de facilement encoder du texte au format Base64 ou de décoder des chaînes Base64 en leur texte d'origine. Il est particulièrement utile pour les développeurs, les professionnels de l'informatique et toute personne travaillant avec des données qui doivent être transmises en toute sécurité à travers des canaux basés sur du texte.

Comment fonctionne le codage Base64

Processus de codage

Le codage Base64 fonctionne en convertissant chaque groupe de trois octets (24 bits) de données binaires en quatre caractères Base64. Le processus suit ces étapes :

  1. Convertir le texte d'entrée en sa représentation binaire (en utilisant l'encodage ASCII ou UTF-8)
  2. Regrouper les données binaires en morceaux de 24 bits (3 octets)
  3. Diviser chaque morceau de 24 bits en quatre groupes de 6 bits
  4. Convertir chaque groupe de 6 bits en son caractère Base64 correspondant

Lorsque la longueur de l'entrée n'est pas divisible par 3, un remplissage avec des caractères "=" est ajouté pour maintenir le rapport de 4:3 des longueurs de sortie par rapport à l'entrée.

Représentation mathématique

Pour une séquence d'octets b1,b2,b3b_1, b_2, b_3, les caractères Base64 correspondants c1,c2,c3,c4c_1, c_2, c_3, c_4 sont calculés comme suit :

c1=Base64[(b1>>2)]c_1 = \text{Base64}[(b_1 >> 2)]
c2=Base64[((b1&3)<<4)(b2>>4)]c_2 = \text{Base64}[((b_1 \& 3) << 4) | (b_2 >> 4)]
c3=Base64[((b2&15)<<2)(b3>>6)]c_3 = \text{Base64}[((b_2 \& 15) << 2) | (b_3 >> 6)]
c4=Base64[(b3&63)]c_4 = \text{Base64}[(b_3 \& 63)]

Base64[i]\text{Base64}[i] représente le ii-ème caractère dans l'alphabet Base64.

Processus de décodage

Le décodage Base64 inverse le processus de codage :

  1. Convertir chaque caractère Base64 en sa valeur de 6 bits
  2. Concaténer ces valeurs de 6 bits
  3. Regrouper les bits en morceaux de 8 bits (octets)
  4. Convertir chaque octet en son caractère correspondant

Remplissage

Lorsque le nombre d'octets à encoder n'est pas divisible par 3, un remplissage est appliqué :

  • S'il reste un octet, il est converti en deux caractères Base64 suivis de "=="
  • S'il reste deux octets, ils sont convertis en trois caractères Base64 suivis de "="

Exemple

Encodons le texte "Hello" en Base64 :

  1. Représentation ASCII de "Hello" : 72 101 108 108 111
  2. Représentation binaire : 01001000 01100101 01101100 01101100 01101111
  3. Regroupement en morceaux de 6 bits : 010010 000110 010101 101100 011011 000110 1111
  4. Le dernier morceau n'a que 4 bits, donc nous ajoutons des zéros : 010010 000110 010101 101100 011011 000110 111100
  5. Conversion en décimal : 18, 6, 21, 44, 27, 6, 60
  6. Recherche dans l'alphabet Base64 : S, G, V, s, b, G, 8
  7. Le résultat est "SGVsbG8="

Notez le remplissage "=" à la fin car la longueur de l'entrée (5 octets) n'est pas divisible par 3.

Formule

La formule générale pour calculer la longueur d'une chaîne encodée en Base64 est :

longueur_encodeˊe=4×longueur_d’entreˊe3\text{longueur\_encodée} = 4 \times \lceil \frac{\text{longueur\_d'entrée}}{3} \rceil

x\lceil x \rceil représente la fonction plafond (arrondir à l'entier supérieur le plus proche).

Cas d'utilisation

Le codage Base64 est largement utilisé dans diverses applications :

  1. Pièces jointes d'e-mail : MIME (Multipurpose Internet Mail Extensions) utilise Base64 pour encoder des pièces jointes binaires dans les e-mails.

  2. URLs de données : Intégration d'images, de polices ou d'autres ressources directement dans HTML, CSS ou JavaScript en utilisant le schéma d'URL data:.

  3. Communications API : Transmission sécurisée de données binaires dans des charges utiles JSON ou d'autres formats API basés sur du texte.

  4. Stockage de données binaires dans des formats texte : Lorsque des données binaires doivent être stockées dans XML, JSON ou d'autres formats basés sur du texte.

  5. Systèmes d'authentification : L'authentification de base dans HTTP utilise le codage Base64 (bien que ce ne soit pas pour la sécurité, juste pour le codage).

  6. Cryptographie : Dans le cadre de divers protocoles et systèmes cryptographiques, souvent pour encoder des clés ou des certificats.

  7. Valeurs de cookies : Codage de structures de données complexes à stocker dans des cookies.

Alternatives

Bien que Base64 soit largement utilisé, il existe des alternatives qui peuvent être plus appropriées dans certaines situations :

  1. Base64 sécurisé pour les URL : Une variante qui utilise "-" et "_" au lieu de "+" et "/" pour éviter les problèmes d'encodage d'URL. Utile pour les données qui seront incluses dans des URL.

  2. Base32 : Utilise un ensemble de 32 caractères, ce qui entraîne une sortie plus longue mais avec une meilleure lisibilité humaine et une insensibilité à la casse.

  3. Encodage hexadécimal : Conversion simple en hexadécimal, qui est moins efficace (double la taille) mais très simple et largement pris en charge.

  4. Transfert binaire : Pour les gros fichiers ou lorsque l'efficacité est cruciale, les protocoles de transfert binaire directs comme HTTP avec des en-têtes Content-Type appropriés sont préférables.

  5. Compression + Base64 : Pour de grandes données textuelles, compresser avant d'encoder peut atténuer l'augmentation de taille.

  6. Sérialisation JSON/XML : Pour les données structurées, utiliser la sérialisation JSON ou XML native peut être plus approprié que le codage Base64.

Histoire

Le codage Base64 a ses racines dans les premiers systèmes informatiques et de télécommunications où les données binaires devaient être transmises sur des canaux conçus pour le texte.

La spécification formelle de Base64 a été publiée pour la première fois en 1987 dans le cadre de la RFC 989, qui définissait le courrier électronique amélioré en matière de confidentialité (PEM). Cela a été mis à jour par la suite dans la RFC 1421 (1993) et la RFC 2045 (1996, dans le cadre de MIME).

Le terme "Base64" vient du fait que le codage utilise 64 caractères ASCII différents pour représenter des données binaires. Ce choix de 64 caractères était délibéré, car 64 est une puissance de 2 (2^6), ce qui rend la conversion entre binaire et Base64 efficace.

Au fil du temps, plusieurs variantes de Base64 ont émergé :

  • Base64 standard : Tel que défini dans la RFC 4648, utilisant A-Z, a-z, 0-9, +, / et = pour le remplissage
  • Base64 sécurisé pour les URL : Utilise - et _ au lieu de + et / pour éviter les problèmes d'encodage d'URL
  • Base64 sécurisé pour les noms de fichiers : Semblable à Base64 sécurisé pour les URL, conçu pour une utilisation dans des noms de fichiers
  • Base64 modifié pour IMAP : Utilisé dans le protocole IMAP avec un ensemble différent de caractères spéciaux

Bien qu'il ait plus de trois décennies, Base64 reste un outil fondamental dans l'informatique moderne, en particulier avec la montée des applications Web et des API qui reposent fortement sur des formats de données textuels comme JSON.

Exemples de code

Voici des exemples de codage et de décodage Base64 dans divers langages de programmation :

// Codage/Décodage Base64 en JavaScript
function encodeToBase64(text) {
  return btoa(text);
}

function decodeFromBase64(base64String) {
  try {
    return atob(base64String);
  } catch (e) {
    throw new Error("Chaîne Base64 invalide");
  }
}

// Exemple d'utilisation
const originalText = "Hello, World!";
const encoded = encodeToBase64(originalText);
console.log("Encodé :", encoded);  // SGVsbG8sIFdvcmxkIQ==

try {
  const decoded = decodeFromBase64(encoded);
  console.log("Décodé :", decoded);  // Hello, World!
} catch (error) {
  console.error(error.message);
}
# Codage/Décodage Base64 en Python
import base64

def encode_to_base64(text):
    # Convertir la chaîne en octets puis encoder
    text_bytes = text.encode('utf-8')
    base64_bytes = base64.b64encode(text_bytes)
    return base64_bytes.decode('utf-8')

def decode_from_base64(base64_string):
    try:
        # Convertir la chaîne base64 en octets puis décoder
        base64_bytes = base64_string.encode('utf-8')
        text_bytes = base64.b64decode(base64_bytes)
        return text_bytes.decode('utf-8')
    except Exception as e:
        raise ValueError(f"Chaîne Base64 invalide : {e}")

# Exemple d'utilisation
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
print(f"Encodé : {encoded}")  # SGVsbG8sIFdvcmxkIQ==

try:
    decoded = decode_from_base64(encoded)
    print(f"Décodé : {decoded}")  # Hello, World!
except ValueError as e:
    print(e)
// Codage/Décodage Base64 en Java
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class Base64Example {
    public static String encodeToBase64(String text) {
        byte[] textBytes = text.getBytes(StandardCharsets.UTF_8);
        byte[] encodedBytes = Base64.getEncoder().encode(textBytes);
        return new String(encodedBytes, StandardCharsets.UTF_8);
    }
    
    public static String decodeFromBase64(String base64String) {
        try {
            byte[] base64Bytes = base64String.getBytes(StandardCharsets.UTF_8);
            byte[] decodedBytes = Base64.getDecoder().decode(base64Bytes);
            return new String(decodedBytes, StandardCharsets.UTF_8);
        } catch (IllegalArgumentException e) {
            throw new IllegalArgumentException("Chaîne Base64 invalide : " + e.getMessage());
        }
    }
    
    public static void main(String[] args) {
        String originalText = "Hello, World!";
        String encoded = encodeToBase64(originalText);
        System.out.println("Encodé : " + encoded);  // SGVsbG8sIFdvcmxkIQ==
        
        try {
            String decoded = decodeFromBase64(encoded);
            System.out.println("Décodé : " + decoded);  // Hello, World!
        } catch (IllegalArgumentException e) {
            System.err.println(e.getMessage());
        }
    }
}
<?php
// Codage/Décodage Base64 en PHP
function encodeToBase64($text) {
    return base64_encode($text);
}

function decodeFromBase64($base64String) {
    $decoded = base64_decode($base64String, true);
    if ($decoded === false) {
        throw new Exception("Chaîne Base64 invalide");
    }
    return $decoded;
}

// Exemple d'utilisation
$originalText = "Hello, World!";
$encoded = encodeToBase64($originalText);
echo "Encodé : " . $encoded . "\n";  // SGVsbG8sIFdvcmxkIQ==

try {
    $decoded = decodeFromBase64($encoded);
    echo "Décodé : " . $decoded . "\n";  // Hello, World!
} catch (Exception $e) {
    echo "Erreur : " . $e->getMessage() . "\n";
}
?>
// Codage/Décodage Base64 en C#
using System;
using System.Text;

class Base64Example
{
    public static string EncodeToBase64(string text)
    {
        byte[] textBytes = Encoding.UTF8.GetBytes(text);
        return Convert.ToBase64String(textBytes);
    }
    
    public static string DecodeFromBase64(string base64String)
    {
        try
        {
            byte[] base64Bytes = Convert.FromBase64String(base64String);
            return Encoding.UTF8.GetString(base64Bytes);
        }
        catch (FormatException)
        {
            throw new FormatException("Chaîne Base64 invalide");
        }
    }
    
    static void Main()
    {
        string originalText = "Hello, World!";
        string encoded = EncodeToBase64(originalText);
        Console.WriteLine($"Encodé : {encoded}");  // SGVsbG8sIFdvcmxkIQ==
        
        try
        {
            string decoded = DecodeFromBase64(encoded);
            Console.WriteLine($"Décodé : {decoded}");  // Hello, World!
        }
        catch (FormatException e)
        {
            Console.WriteLine($"Erreur : {e.Message}");
        }
    }
}
# Codage/Décodage Base64 en Ruby
require 'base64'

def encode_to_base64(text)
  Base64.strict_encode64(text)
end

def decode_from_base64(base64_string)
  begin
    Base64.strict_decode64(base64_string)
  rescue ArgumentError => e
    raise "Chaîne Base64 invalide : #{e.message}"
  end
end

# Exemple d'utilisation
original_text = "Hello, World!"
encoded = encode_to_base64(original_text)
puts "Encodé : #{encoded}"  # SGVsbG8sIFdvcmxkIQ==

begin
  decoded = decode_from_base64(encoded)
  puts "Décodé : #{decoded}"  # Hello, World!
rescue StandardError => e
  puts "Erreur : #{e.message}"
end
// Codage/Décodage Base64 en Go
package main

import (
    "encoding/base64"
    "fmt"
)

func encodeToBase64(text string) string {
    return base64.StdEncoding.EncodeToString([]byte(text))
}

func decodeFromBase64(base64String string) (string, error) {
    bytes, err := base64.StdEncoding.DecodeString(base64String)
    if err != nil {
        return "", fmt.Errorf("chaîne Base64 invalide : %v", err)
    }
    return string(bytes), nil
}

func main() {
    originalText := "Hello, World!"
    encoded := encodeToBase64(originalText)
    fmt.Println("Encodé :", encoded)  // SGVsbG8sIFdvcmxkIQ==
    
    decoded, err := decodeFromBase64(encoded)
    if err != nil {
        fmt.Println("Erreur :", err)
    } else {
        fmt.Println("Décodé :", decoded)  // Hello, World!
    }
}
// Codage/Décodage Base64 en Swift
import Foundation

func encodeToBase64(_ text: String) -> String? {
    if let data = text.data(using: .utf8) {
        return data.base64EncodedString()
    }
    return nil
}

func decodeFromBase64(_ base64String: String) -> String? {
    if let data = Data(base64Encoded: base64String) {
        return String(data: data, encoding: .utf8)
    }
    return nil
}

// Exemple d'utilisation
let originalText = "Hello, World!"
if let encoded = encodeToBase64(originalText) {
    print("Encodé : \(encoded)")  // SGVsbG8sIFdvcmxkIQ==
    
    if let decoded = decodeFromBase64(encoded) {
        print("Décodé : \(decoded)")  // Hello, World!
    } else {
        print("Erreur : Impossible de décoder la chaîne Base64")
    }
} else {
    print("Erreur : Impossible d'encoder le texte")
}
' Codage/Décodage Base64 en VBA Excel
' Remarque : Cela nécessite une référence à Microsoft XML, v6.0
Function EncodeToBase64(text As String) As String
    Dim xmlObj As Object
    Set xmlObj = CreateObject("MSXML2.DOMDocument")
    
    Dim xmlNode As Object
    Set xmlNode = xmlObj.createElement("b64")
    
    xmlNode.DataType = "bin.base64"
    xmlNode.nodeTypedValue = StrConv(text, vbFromUnicode)
    
    EncodeToBase64 = xmlNode.text
    
    Set xmlNode = Nothing
    Set xmlObj = Nothing
End Function

Function DecodeFromBase64(base64String As String) As String
    On Error GoTo ErrorHandler
    
    Dim xmlObj As Object
    Set xmlObj = CreateObject("MSXML2.DOMDocument")
    
    Dim xmlNode As Object
    Set xmlNode = xmlObj.createElement("b64")
    
    xmlNode.DataType = "bin.base64"
    xmlNode.text = base64String
    
    DecodeFromBase64 = StrConv(xmlNode.nodeTypedValue, vbUnicode)
    
    Set xmlNode = Nothing
    Set xmlObj = Nothing
    Exit Function
    
ErrorHandler:
    DecodeFromBase64 = "Erreur : Chaîne Base64 invalide"
End Function

' Utilisation dans une feuille de calcul :
' =EncodeToBase64("Hello, World!")
' =DecodeFromBase64("SGVsbG8sIFdvcmxkIQ==")
# Codage/Décodage Base64 en R
# Nécessite le package 'base64enc'
# install.packages("base64enc")
library(base64enc)

encode_to_base64 <- function(text) {
  # Convertir le texte en octets bruts, puis encoder
  text_raw <- charToRaw(text)
  base64_encoded <- base64encode(text_raw)
  return(rawToChar(base64_encoded))
}

decode_from_base64 <- function(base64_string) {
  tryCatch({
    # Convertir la chaîne base64 en octets bruts, puis décoder
    base64_raw <- charToRaw(base64_string)
    decoded_raw <- base64decode(base64_raw)
    return(rawToChar(decoded_raw))
  }, error = function(e) {
    stop(paste("Chaîne Base64 invalide :", e$message))
  })
}

# Exemple d'utilisation
original_text <- "Hello, World!"
encoded <- encode_to_base64(original_text)
cat("Encodé :", encoded, "\n")  # SGVsbG8sIFdvcmxkIQ==

tryCatch({
  decoded <- decode_from_base64(encoded)
  cat("Décodé :", decoded, "\n")  # Hello, World!
}, error = function(e) {
  cat("Erreur :", e$message, "\n")
})
% Codage/Décodage Base64 en MATLAB
function demo_base64()
    originalText = 'Hello, World!';
    
    % Encoder
    encoded = encode_to_base64(originalText);
    fprintf('Encodé : %s\n', encoded);  % SGVsbG8sIFdvcmxkIQ==
    
    % Décoder
    try
        decoded = decode_from_base64(encoded);
        fprintf('Décodé : %s\n', decoded);  % Hello, World!
    catch e
        fprintf('Erreur : %s\n', e.message);
    end
end

function encoded = encode_to_base64(text)
    % Convertir le texte en tableau uint8 et encoder
    bytes = uint8(text);
    encoded = base64encode(bytes);
end

function decoded = decode_from_base64(base64String)
    try
        % Décoder la chaîne base64 en tableau uint8
        bytes = base64decode(base64String);
        decoded = char(bytes);
    catch
        error('Chaîne Base64 invalide');
    end
end
// Codage/Décodage Base64 en C utilisant OpenSSL
#include <stdio.h>
#include <string.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
#include <stdint.h>

char* encode_to_base64(const char* input) {
    BIO *bio, *b64;
    BUF_MEM *bufferPtr;
    
    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new(BIO_s_mem());
    bio = BIO_push(b64, bio);
    
    BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
    BIO_write(bio, input, strlen(input));
    BIO_flush(bio);
    BIO_get_mem_ptr(bio, &bufferPtr);
    
    char* result = (char*)malloc(bufferPtr->length + 1);
    memcpy(result, bufferPtr->data, bufferPtr->length);
    result[bufferPtr->length] = '\0';
    
    BIO_free_all(bio);
    
    return result;
}

char* decode_from_base64(const char* input) {
    BIO *bio, *b64;
    size_t length = strlen(input);
    char* buffer = (char*)malloc(length);
    
    b64 = BIO_new(BIO_f_base64());
    bio = BIO_new_mem_buf(input, -1);
    bio = BIO_push(b64, bio);
    
    BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
    int decoded_length = BIO_read(bio, buffer, length);
    
    if (decoded_length <= 0) {
        free(buffer);
        BIO_free_all(bio);
        return NULL; // Chaîne Base64 invalide
    }
    
    buffer[decoded_length] = '\0';
    
    BIO_free_all(bio);
    
    return buffer;
}

int main() {
    const char* original_text = "Hello, World!";
    
    char* encoded = encode_to_base64(original_text);
    printf("Encodé : %s\n", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    char* decoded = decode_from_base64(encoded);
    if (decoded) {
        printf("Décodé : %s\n", decoded);  // Hello, World!
        free(decoded);
    } else {
        printf("Erreur : Chaîne Base64 invalide\n");
    }
    
    free(encoded);
    
    return 0;
}
// Codage/Décodage Base64 en Rust
use base64::{encode, decode};
use std::str;

fn encode_to_base64(text: &str) -> String {
    encode(text)
}

fn decode_from_base64(base64_string: &str) -> Result<String, String> {
    match decode(base64_string) {
        Ok(bytes) => {
            match str::from_utf8(&bytes) {
                Ok(text) => Ok(text.to_string()),
                Err(e) => Err(format!("Séquence UTF-8 invalide : {}", e))
            }
        },
        Err(e) => Err(format!("Chaîne Base64 invalide : {}", e))
    }
}

fn main() {
    let original_text = "Hello, World!";
    let encoded = encode_to_base64(original_text);
    println!("Encodé : {}", encoded);  // SGVsbG8sIFdvcmxkIQ==
    
    match decode_from_base64(&encoded) {
        Ok(decoded) => println!("Décodé : {}", decoded),  // Hello, World!
        Err(e) => println!("Erreur : {}", e)
    }
}

Cas limites et considérations

Lorsque vous travaillez avec le codage et le décodage Base64, soyez conscient de ces considérations importantes :

  1. Unicode et caractères non-ASCII : Lors de l'encodage de texte avec des caractères non-ASCII, assurez-vous d'utiliser un encodage de caractères approprié (généralement UTF-8) avant l'encodage Base64.

  2. Remplissage : Le Base64 standard utilise un remplissage avec des caractères "=" pour garantir que la longueur de sortie est un multiple de 4. Certaines implémentations permettent d'omettre le remplissage, ce qui peut causer des problèmes de compatibilité.

  3. Sauts de ligne : Les implémentations Base64 traditionnelles insèrent des sauts de ligne (généralement tous les 76 caractères) pour la lisibilité, mais les applications modernes omettent souvent cela.

  4. Base64 sécurisé pour les URL : Le Base64 standard utilise les caractères "+" et "/" qui ont des significations spéciales dans les URL. Pour les contextes d'URL, utilisez le Base64 sécurisé pour les URL qui remplace ceux-ci par "-" et "_".

  5. Espaces blancs : Lors du décodage, certaines implémentations sont indulgentes et ignorent les espaces blancs, tandis que d'autres exigent une entrée exacte.

  6. Augmentation de taille : Le codage Base64 augmente la taille des données d'environ 33 % (4 octets de sortie pour chaque 3 octets d'entrée).

  7. Performance : Le codage/décodage Base64 peut être intensif en calcul pour des données très volumineuses. Envisagez des approches de diffusion pour les gros fichiers.

Références

  1. RFC 4648 - Les encodages de données Base16, Base32 et Base64
  2. RFC 2045 - MIME Partie Un : Format des corps de messages Internet
  3. MDN Web Docs : Codage et décodage Base64
  4. Base64 - Wikipédia
  5. MIME - Wikipédia
Feedback