Base64 Python : Guide complet pour encoder et decoder les donnees binaires

Maitrisez le module base64 de Python pour encoder et decoder vos donnees binaires. Guide complet avec exemples pratiques pour Base64, Base32, Base16, ASCII85 et Base85.

Mahmoud DEVO
Mahmoud DEVO
December 27, 2025 7 min read
Base64 Python : Guide complet pour encoder et decoder les donnees binaires

Introduction

Le codage Base64 est une technique fondamentale en programmation qui permet de convertir des donnees binaires en une representation textuelle ASCII. Cette transformation est essentielle dans de nombreux contextes : transmission de donnees via des protocoles qui ne supportent que du texte (comme SMTP pour les emails), stockage de donnees binaires dans des formats texte (JSON, XML), ou encore integration d’images directement dans du code HTML/CSS.

Le module base64 fait partie de la bibliotheque standard Python, ce qui signifie qu’aucune installation supplementaire n’est necessaire. Il offre un ensemble complet de fonctions pour encoder et decoder des donnees dans differentes bases numeriques : Base64, Base32, Base16 (hexadecimal), ASCII85 et Base85.

Pourquoi utiliser l’encodage Base64 ?

L’encodage Base64 est particulierement utile dans les situations suivantes :

  • Emails avec pieces jointes : Le protocole SMTP ne supporte que les caracteres ASCII, l’encodage Base64 permet d’envoyer des fichiers binaires
  • APIs REST : Transmission de fichiers ou d’images dans des payloads JSON
  • Data URIs : Integration d’images directement dans le HTML ou CSS
  • Tokens d’authentification : Encodage de credentials dans les headers HTTP (Basic Auth)
  • Stockage de donnees : Conservation de donnees binaires dans des bases de donnees textuelles

Dans cet article, nous allons explorer en detail chaque type d’encodage disponible dans le module base64, avec des exemples pratiques et des cas d’utilisation concrets.

Section 1 : Encodage et Decodage Base64

Le Base64 utilise un alphabet de 64 caracteres (A-Z, a-z, 0-9, + et /) pour representer les donnees binaires. Chaque caractere Base64 represente 6 bits de donnees.

Pour inclure le module base64 dans votre script, vous devez l’importer en premier :

import base64

Les fonctions d’encodage et de decodage Base64 necessitent un objet bytes-like. Pour convertir une chaine de caracteres en objet bytes, nous utilisons la methode encode de Python :

s = "Hello World!"
b = s.encode("UTF-8")
print(b)  # Output: b'Hello World!'

Le prefixe b indique que la valeur est un objet bytes. Pour encoder ces octets en Base64, nous utilisons la fonction base64.b64encode() :

import base64

s = "Hello World!"
b = s.encode("UTF-8")
e = base64.b64encode(b)
print(e)  # Output: b'SGVsbG8gV29ybGQh'

Pour obtenir une chaine de caracteres a partir de ces octets, utilisez la methode decode() :

s1 = e.decode("UTF-8")
print(s1)  # Output: SGVsbG8gV29ybGQh

Decodage Base64

Le decodage fonctionne de maniere inverse avec base64.b64decode() :

import base64

encoded = "SGVsbG8gV29ybGQh"
decoded_bytes = base64.b64decode(encoded)
decoded_string = decoded_bytes.decode("UTF-8")
print(decoded_string)  # Output: Hello World!

Exemple pratique : Encoder une image

Voici comment encoder une image en Base64 pour l’utiliser dans une Data URI :

import base64

def image_to_base64(image_path):
    with open(image_path, "rb") as image_file:
        encoded = base64.b64encode(image_file.read())
        return encoded.decode("UTF-8")

# Utilisation
base64_image = image_to_base64("logo.png")
data_uri = f"data:image/png;base64,{base64_image}"

Section 2 : Encodage et Decodage Base32

Le Base32 utilise un alphabet de 32 caracteres (A-Z et 2-7) pour representer les donnees. Il est souvent utilise dans les applications d’authentification a deux facteurs (2FA) car il evite les caracteres ambigus.

import base64

s = "Hello World!"
b = s.encode("UTF-8")
e = base64.b32encode(b)
print(e.decode("UTF-8"))  # Output: JBSWY3DPEBLW64TMMQQQ====

Le decodage se fait avec base64.b32decode() :

decoded = base64.b32decode("JBSWY3DPEBLW64TMMQQQ====")
print(decoded.decode("UTF-8"))  # Output: Hello World!

Section 3 : Encodage et Decodage Base16

Le Base16, egalement connu sous le nom d’hexadecimal, utilise les caracteres 0-9 et A-F. C’est le format le plus lisible mais aussi le moins compact (doublement de la taille des donnees).

import base64

s = "Hello World!"
b = s.encode("UTF-8")
e = base64.b16encode(b)
print(e.decode("UTF-8"))  # Output: 48656C6C6F20576F726C6421

Le decodage hexadecimal :

decoded = base64.b16decode("48656C6C6F20576F726C6421")
print(decoded.decode("UTF-8"))  # Output: Hello World!

Section 4 : Encodage et Decodage ASCII85

Adobe a cree son propre schema d’encodage appele ASCII85, souvent utilise dans les fichiers PDF et PostScript. Il offre un meilleur ratio de compression que le Base64.

import base64

s = "Hello World!"
b = s.encode("UTF-8")
e = base64.a85encode(b)
print(e.decode("UTF-8"))  # Output: 87cURD]i,"Ebo80

Le decodage ASCII85 :

decoded = base64.a85decode(b'87cURD]i,"Ebo80')
print(decoded.decode("UTF-8"))  # Output: Hello World!

Section 5 : Encodage et Decodage Base85

Le Base85 (RFC 1924) est une variante plus compacte que le Base64, souvent utilisee pour encoder des donnees binaires dans des formats comme Git ou ZeroMQ.

import base64

s = "Hello World!"
b = s.encode("UTF-8")
e = base64.b85encode(b)
print(e.decode("UTF-8"))  # Output: NM&qnZy;B1a%^NF

Le decodage Base85 :

decoded = base64.b85decode(b"NM&qnZy;B1a%^NF")
print(decoded.decode("UTF-8"))  # Output: Hello World!

Bonnes Pratiques

Voici les recommandations essentielles pour utiliser efficacement le module base64 :

1. Toujours travailler avec des bytes

# Bonne pratique : convertir explicitement en bytes
data = "Mon texte"
encoded = base64.b64encode(data.encode("UTF-8"))

# Mauvaise pratique : passer une string directement (provoque une erreur)
# encoded = base64.b64encode(data)  # TypeError!

2. Gerer correctement l’encodage UTF-8

def encode_safely(text):
    """Encode une chaine en Base64 de maniere securisee."""
    if isinstance(text, str):
        text = text.encode("UTF-8")
    return base64.b64encode(text).decode("UTF-8")

def decode_safely(encoded_text):
    """Decode une chaine Base64 de maniere securisee."""
    if isinstance(encoded_text, str):
        encoded_text = encoded_text.encode("UTF-8")
    return base64.b64decode(encoded_text).decode("UTF-8")

3. Utiliser urlsafe pour les URLs

Pour les donnees qui seront utilisees dans des URLs, utilisez les variantes URL-safe :

import base64

data = b"Hello World!"
# Standard Base64 peut contenir + et /
standard = base64.b64encode(data)

# URL-safe remplace + par - et / par _
url_safe = base64.urlsafe_b64encode(data)
print(url_safe.decode())  # Utilise - et _ au lieu de + et /

Pieges Courants

1. Oublier que Base64 n’est PAS un chiffrement

# ATTENTION : Base64 n'est PAS securise pour proteger des donnees sensibles
password = "mon_mot_de_passe_secret"
encoded = base64.b64encode(password.encode())
# N'importe qui peut decoder facilement !
decoded = base64.b64decode(encoded).decode()
print(decoded)  # Affiche le mot de passe en clair

Pour la securite, utilisez des bibliotheques de chiffrement appropriees comme cryptography.

2. Ignorer le padding (caracteres =)

# Le Base64 utilise le padding avec = pour aligner les donnees
# Certaines implementations retirent ce padding, ce qui peut causer des erreurs

encoded_without_padding = "SGVsbG8gV29ybGQh"  # Pas de =
# Ajouter le padding manquant si necessaire
padding = 4 - len(encoded_without_padding) % 4
if padding != 4:
    encoded_without_padding += "=" * padding

3. Confondre les types bytes et string

# Erreur frequente : melanger bytes et strings
import base64

# Ceci fonctionne
result = base64.b64encode(b"Hello")  # bytes -> bytes

# Ceci echoue
# result = base64.b64encode("Hello")  # string -> TypeError!

# Solution : toujours encoder les strings en bytes d'abord
result = base64.b64encode("Hello".encode("UTF-8"))

4. Ne pas valider les donnees avant decodage

import base64
import binascii

def safe_decode(encoded_string):
    """Decode avec gestion d'erreur."""
    try:
        return base64.b64decode(encoded_string).decode("UTF-8")
    except (binascii.Error, UnicodeDecodeError) as e:
        print(f"Erreur de decodage: {e}")
        return None

# Test avec une chaine invalide
result = safe_decode("ceci-nest-pas-du-base64!!!")

Comparaison des Encodages

EncodageCaracteresRatio tailleCas d’usage
Base6464 (A-Z, a-z, 0-9, +, /)4:3Emails, APIs, Data URIs
Base3232 (A-Z, 2-7)8:52FA, codes lisibles
Base1616 (0-9, A-F)2:1Debug, hex dump
ASCII85855:4PDF, PostScript
Base85855:4Git, ZeroMQ

Conclusion

Le module base64 de Python est un outil puissant et polyvalent pour encoder et decoder des donnees binaires. Dans cet article, nous avons explore :

  • Base64 : Le standard le plus repandu pour la transmission de donnees binaires
  • Base32 : Ideal pour les codes humainement lisibles et l’authentification 2FA
  • Base16 : Utile pour le debogage et l’affichage hexadecimal
  • ASCII85 et Base85 : Options plus compactes pour des cas d’usage specifiques

N’oubliez jamais que l’encodage Base64 n’est pas un mecanisme de securite. Il sert uniquement a transformer des donnees binaires en texte ASCII transportable. Pour proteger des donnees sensibles, utilisez toujours des solutions de chiffrement appropriees.

Pour aller plus loin

  • Documentation officielle : Module base64 Python
  • RFC 4648 : Standard pour les encodages Base16, Base32 et Base64
  • Securite : Explorez le module cryptography pour le chiffrement reel
  • Performance : Pour de gros fichiers, considerez le streaming avec base64.encodebytes()
Advertisement

In-Article Ad

Dev Mode

Share this article

Mahmoud DEVO

Mahmoud DEVO

Senior Full-Stack Developer

I'm a passionate full-stack developer with 10+ years of experience building scalable web applications. I write about Vue.js, Node.js, PostgreSQL, and modern DevOps practices.

Enjoyed this article?

Subscribe to get more tech content delivered to your inbox.

Related Articles