Procédure de chiffrement et de déchiffrement AES avec Python

Python est un langage de programmation flexible qui permet une implémentation facile de l’algorithme de chiffrement puissant AES (Advanced Encryption Standard). Cet article explique en détail les bases du chiffrement AES, des concepts fondamentaux aux exemples de code réels. Il s’adresse à ceux qui souhaitent renforcer la sécurité des données et protéger les informations sensibles. À la fin, vous serez capable de construire un système pratique de chiffrement et de déchiffrement.

Sommaire

Concepts de base du chiffrement AES


AES (Advanced Encryption Standard) est un algorithme de chiffrement par blocs défini par le NIST (Institut national des normes et technologies des États-Unis), offrant une grande sécurité et efficacité. Il divise les données en blocs de taille fixe (généralement 128 bits) et effectue le chiffrement. AES est un algorithme de chiffrement symétrique, ce qui signifie qu’il utilise la même clé pour le chiffrement et le déchiffrement.

Modes de fonctionnement de l’AES


AES propose plusieurs modes de fonctionnement, chacun ayant ses avantages en fonction de l’application. Les modes les plus courants sont les suivants :

  • GCM (Galois/Counter Mode) : Fournit une vérification de l’intégrité des données en plus du chiffrement.

Tailles de clé AES

AES prend en charge trois tailles de clés :

    • 128 bits (16 octets) : La plus courante et fournit une sécurité standard.

    • 192 bits (24 octets) : Utilisée lorsque des niveaux de sécurité plus élevés sont nécessaires.

    • 256 bits (32 octets) : Convient lorsque des niveaux de sécurité très élevés sont nécessaires.

La taille de la clé doit être choisie en fonction des exigences de sécurité. Pour des utilisations courantes, une clé de 128 bits est suffisante, mais pour des besoins de sécurité plus stricts, une clé de 256 bits est recommandée.

Caractéristiques d’AES

AES est l’un des algorithmes de chiffrement les plus utilisés aujourd’hui, en raison de ses avantages :

    • Performance : Il fonctionne rapidement sur le matériel et les logiciels.

    • Robustesse : Sa fiabilité a été prouvée au fil des années d’utilisation.

    • Flexibilité : Il offre des modes de fonctionnement adaptés à divers usages.

Grâce à sa capacité à fournir une protection avancée des données, AES est largement utilisé dans les implémentations Python pour la sécurité des données.

Installation des bibliothèques Python nécessaires

Pour effectuer un chiffrement et un déchiffrement AES en Python, vous devez utiliser une bibliothèque spécialisée dans le chiffrement. La bibliothèque recommandée est PyCryptodome, qui est une extension du module « Crypto » de la bibliothèque standard Python.

Installation de PyCryptodome

Pour installer PyCryptodome, utilisez la commande suivante :

pip install pycryptodome

Vérification de l’installation

Pour vérifier si l’installation a été effectuée correctement, lancez l’interpréteur Python et entrez la commande suivante :

from Crypto.Cipher import AES
print("PyCryptodome is successfully installed!")

Si aucune erreur n’apparaît, l’installation a été effectuée avec succès.

Principales fonctionnalités de PyCryptodome

PyCryptodome offre les fonctionnalités de chiffrement suivantes :

    • Chiffrement symétrique (AES, DES, etc.)

    • Chiffrement asymétrique (RSA, ECC, etc.)

    • Codes d’authentification des messages (HMAC, etc.)

    • Fonctions de hachage (SHA256, SHA3, etc.)

Dans cet article, nous allons utiliser le module Crypto.Cipher.AES pour le chiffrement et le déchiffrement AES.

Autres options

Outre PyCryptodome, d’autres bibliothèques peuvent être utilisées pour le chiffrement AES :

    • cryptography : Offre des opérations de chiffrement de haut niveau. La commande d’installation est pip install cryptography.

    • m2crypto : Bibliothèque Python qui enveloppe la bibliothèque C OpenSSL.

Cependant, PyCryptodome est facile à utiliser, même pour les débutants, et est idéal pour apprendre et implémenter le chiffrement AES. Cet article se concentre sur l’utilisation de PyCryptodome.

Préparation pour le chiffrement

Avant de procéder au chiffrement AES, certains éléments doivent être préparés, notamment la clé de chiffrement (clé) et le vecteur d’initialisation (IV). Si ces éléments ne sont pas correctement configurés, le chiffrement et le déchiffrement ne fonctionneront pas correctement.

Génération de la clé de chiffrement

Dans AES, la clé de chiffrement est cruciale. La longueur de la clé doit être de 128 bits (16 octets), 192 bits (24 octets) ou 256 bits (32 octets). Voici un exemple pour générer une clé en Python :

from Crypto.Random import get_random_bytes

# Générer une clé de 256 bits (32 octets)
key = get_random_bytes(32)  
print("Generated Key:", key)

Ce code génère une clé sécurisée aléatoire à utiliser pour le chiffrement.

Génération du vecteur d’initialisation (IV)

Le vecteur d’initialisation (IV) est un ensemble de données aléatoires utilisé pour rendre chaque session de chiffrement unique. Il est particulièrement nécessaire dans les modes de fonctionnement comme CBC. La longueur de l’IV doit être égale à la taille du bloc AES (généralement 16 octets). Voici un exemple pour générer un IV avec PyCryptodome :

# Générer un IV de 16 octets
iv = get_random_bytes(16)  
print("Generated IV:", iv)

Stockage de la clé et de l’IV

La clé et l’IV générés doivent être stockés de manière sécurisée, car ils sont nécessaires pour le chiffrement et le déchiffrement. Il est important de les conserver dans un endroit sûr. Voici quelques conseils pour leur stockage :

    1. Lieu de stockage sécurisé : La clé doit être stockée de manière cryptée dans le système de fichiers ou dans une base de données, ou bien utiliser un module de sécurité matériel (HSM).

    1. Ne pas la partager : Partager la clé avec un tiers peut rendre les données chiffrées vulnérables.

    1. Éviter la régénération : Le chiffrement et le déchiffrement des mêmes données nécessitent la même clé et le même IV.

Lorsque la préparation est terminée

Une fois la clé et l’IV préparés, vous pouvez passer à l’implémentation du chiffrement AES dans la section suivante.

Implémentation du chiffrement AES avec Python

Pour implémenter le chiffrement AES en Python, vous utilisez le module Crypto.Cipher.AES. Cette section explique comment utiliser la clé et l’IV générés pour chiffrer les données.

Processus de chiffrement

Voici un exemple de code pour effectuer le chiffrement AES avec PyCryptodome :

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Random import get_random_bytes

# Générer la clé et l'IV
key = get_random_bytes(32)  # Clé de 256 bits
iv = get_random_bytes(16)   # IV de 16 octets pour AES

# Données à chiffrer
data = "Ceci est un message chiffré"
# Convertir les données en bytes
data_bytes = data.encode('utf-8')

# Préparer le chiffrement
cipher = AES.new(key, AES.MODE_CBC, iv)  # Utilisation du mode CBC
# Ajouter du padding aux données pour les adapter à la taille du bloc
encrypted_data = cipher.encrypt(pad(data_bytes, AES.block_size))

# Afficher les résultats
print("Données chiffrées :", encrypted_data)
print("Clé :", key)
print("IV :", iv)

Explication du code

    1. Génération de la clé et de l’IV

    • La fonction get_random_bytes génère une clé et un IV aléatoires.

    • La taille de la clé est fixée à 256 bits (32 octets), mais peut être modifiée en fonction des besoins.

    1. Préparation des données

    • Les données à chiffrer sont fournies sous forme de chaîne de caractères et converties en bytes avec encode('utf-8').

    1. Configuration d’AES

    • La fonction AES.new configure le chiffrement AES. Le mode CBC est utilisé en spécifiant AES.MODE_CBC.

    1. Ajout du padding

    • AES fonctionne avec des blocs de taille fixe (16 octets), donc les données doivent être ajustées avec la fonction pad.

    1. Exécution du chiffrement

    • Les données sont chiffrées à l’aide de cipher.encrypt.

Manipulation des données chiffrées

Les données chiffrées sont sorties sous forme de séquence d’octets. Pour les transférer ou les stocker, il peut être pratique d’utiliser un encodage comme Base64 :

import base64

# Encoder les données chiffrées en Base64
encoded_data = base64.b64encode(encrypted_data).decode('utf-8')
print("Données chiffrées en Base64 :", encoded_data)

Avec cela, vous pouvez sécuriser vos données avec AES. Dans la section suivante, nous expliquerons comment déchiffrer ces données.

Implémentation du déchiffrement AES avec Python

Pour déchiffrer des données chiffrées, vous devez utiliser la même clé et le même IV que ceux utilisés pour le chiffrement. Cette section explique comment implémenter le déchiffrement AES avec PyCryptodome.

Processus de déchiffrement

Voici un exemple de code pour déchiffrer les données générées par AES :

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64

# Données chiffrées (encodées en Base64)
encrypted_data_base64 = "entrez ici les données chiffrées en Base64"
encrypted_data = base64.b64decode(encrypted_data_base64)  # Décodage Base64

# Clé et IV nécessaires pour le déchiffrement (les mêmes que pour le chiffrement)
key = b"entrez ici la clé utilisée pour le chiffrement"  # Clé de 32 octets (exemple : b'key12345678901234567890123456789')
iv = b"entrez ici l'IV utilisé pour le chiffrement"   # IV de 16 octets

# Exécution du déchiffrement
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted_data = unpad(cipher.decrypt(encrypted_data), AES.block_size)

# Convertir les données déchiffrées en chaîne de caractères
print("Données déchiffrées :", decrypted_data.decode('utf-8'))

Explication du code

    1. Chargement des données chiffrées

    • Si les données sont encodées en Base64, vous devez d’abord les décoder avec base64.b64decode.

    • Si les données sont déjà en format binaire, cette étape n’est pas nécessaire.

    1. Spécification de la clé et de l’IV

    • La clé et l’IV utilisés pour le déchiffrement doivent être les mêmes que ceux utilisés pour le chiffrement. Sinon, le déchiffrement échouera.

    1. Configuration du déchiffrement

    • La fonction AES.new configure le déchiffrement AES en mode CBC, en utilisant la clé et l’IV.

    1. Exécution du déchiffrement

    • Les données sont déchiffrées avec cipher.decrypt.

    • Les données déchiffrées sont ajustées à la taille d’origine avec la fonction unpad.

    1. Affichage des résultats

    • Les données déchiffrées sont converties en chaîne de caractères avec decode('utf-8') pour les afficher.

Exemple de déchiffrement avec des données d’exemple

Voici un exemple de déchiffrement direct en code avec des données chiffrées :

# Données chiffrées d'exemple
encrypted_data = b"\x93\x4e\x8b\x12\xab..."  # Données chiffrées en octets (exemple)
key = b"key12345678901234567890123456789"  # Clé de 32 octets
iv = b"iv12345678901234"  # IV de 16 octets

# Déchiffrement
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted_data = unpad(cipher.decrypt(encrypted_data), AES.block_size)
print("Résultat du déchiffrement :", decrypted_data.decode('utf-8'))

Erreurs possibles

Voici quelques erreurs possibles lors du déchiffrement :

    • ValueError: Padding is incorrect.

    • Se produit si la clé ou l’IV ne correspondent pas à ceux utilisés pour le chiffrement.

    • Il peut aussi y avoir une altération des données.

    • TypeError: Object type cannot be passed to the function.

    • Cette erreur se produit si le format des données (octets ou chaîne) est incorrect.

Avec ces informations, vous pouvez résoudre les problèmes lors de l’implémentation du déchiffrement AES. La section suivante explique comment implémenter des fonctionnalités de chiffrement et de déchiffrement de fichiers.

Exemple appliqué : Chiffrement de fichiers

Le chiffrement AES ne se limite pas aux données texte, vous pouvez également protéger des fichiers entiers. Cette section montre comment effectuer un chiffrement et un déchiffrement de fichiers.

Procédure de chiffrement de fichier

Voici un exemple de code pour chiffrer un fichier en Python :

from Crypto.Cipher

 import AES
from Crypto.Util.Padding import pad
from Crypto.Random import get_random_bytes

# Chemin du fichier à chiffrer
input_file_path = 'input.txt'  # Fichier à chiffrer
encrypted_file_path = 'encrypted.bin'  # Fichier chiffré

# Générer la clé et l'IV
key = get_random_bytes(32)  # Clé de 256 bits
iv = get_random_bytes(16)   # IV de 16 octets

# Lire les données du fichier et les chiffrer
with open(input_file_path, 'rb') as input_file:
    file_data = input_file.read()
    cipher = AES.new(key, AES.MODE_CBC, iv)
    encrypted_data = cipher.encrypt(pad(file_data, AES.block_size))

# Sauvegarder les données chiffrées
with open(encrypted_file_path, 'wb') as encrypted_file:
    # Inclure la clé et l'IV dans le fichier (attention à la sécurité)
    encrypted_file.write(iv + encrypted_data)

print(f"Le fichier '{input_file_path}' a été chiffré et sauvegardé sous '{encrypted_file_path}'.")

Procédure de déchiffrement de fichier

Voici un exemple de code pour déchiffrer un fichier chiffré :

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad

# Chemin du fichier chiffré
encrypted_file_path = 'encrypted.bin'  # Fichier chiffré
decrypted_file_path = 'decrypted.txt'  # Fichier déchiffré

# Clé (identique à celle utilisée pour le chiffrement)
key = b"entrez ici la clé utilisée pour le chiffrement"  # Clé de 32 octets

# Lire les données du fichier chiffré et les déchiffrer
with open(encrypted_file_path, 'rb') as encrypted_file:
    file_data = encrypted_file.read()
    # Extraire l'IV du fichier
    iv = file_data[:16]
    encrypted_data = file_data[16:]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted_data = unpad(cipher.decrypt(encrypted_data), AES.block_size)

# Sauvegarder les données déchiffrées
with open(decrypted_file_path, 'wb') as decrypted_file:
    decrypted_file.write(decrypted_data)

print(f"Le fichier '{encrypted_file_path}' a été déchiffré et sauvegardé sous '{decrypted_file_path}'.")

Points importants du code

    1. Stockage de la clé et de l’IV

    • Le code d’exemple omet la gestion sécurisée de la clé et de l’IV. Si vous incluez ces éléments dans le fichier chiffré, soyez vigilant à ne pas les rendre accessibles aux tiers.

    1. Adaptation à la taille du bloc

    • Les données des fichiers ne correspondent généralement pas à un multiple de la taille du bloc, c’est pourquoi nous utilisons la fonction pad pour ajuster la taille.

    1. Stockage séparé de la clé et de l’IV

    • Pour des raisons de sécurité, il est préférable de stocker la clé et l’IV séparément, dans un fichier sécurisé ou un stockage sûr.

Sécurisation du chiffrement de fichiers

Le chiffrement de fichiers permet de protéger les informations sensibles. Il est essentiel de gérer correctement les clés et d’ajouter des mécanismes de détection de falsification (comme HMAC) pour améliorer la sécurité.

Ainsi, vous pouvez chiffrer et déchiffrer des fichiers avec AES en toute sécurité. La section suivante aborde les précautions de sécurité lors de l’implémentation du chiffrement.

Précautions de sécurité

Lorsque vous utilisez AES pour le chiffrement et le déchiffrement, il est crucial de suivre certaines bonnes pratiques de sécurité pour éviter des vulnérabilités. Cet article présente les principaux points de sécurité à prendre en compte.

1. Gestion des clés

La gestion sécurisée des clés est essentielle pour assurer la sécurité du chiffrement. La fuite ou une mauvaise gestion des clés peut rendre les données vulnérables.

    • Choisir un endroit sûr pour stocker les clés

    • Les clés ne doivent pas être stockées en texte clair dans le système de fichiers, mais doivent être cryptées et gérées de manière sécurisée.

    • Recommandation : utiliser un module de sécurité matériel (HSM) ou un service de gestion de clés dans le cloud comme AWS KMS ou Azure Key Vault.

    • Rotation régulière des clés

    • Changer régulièrement les clés permet de réduire les risques de sécurité à long terme.

2. Gestion du vecteur d’initialisation (IV)

La gestion appropriée des IV renforce la sécurité du chiffrement AES.

    • Assurer l’unicité

    • Chaque opération de chiffrement doit utiliser un IV unique.

    • Recommandation : générer un IV aléatoire pour chaque chiffrement et le stocker de manière sécurisée avec les données chiffrées.

    • Gérer l’IV séparément de la clé

    • Ne stockez pas la clé et l’IV ensemble, car cela pourrait faciliter l’accès non autorisé.

3. Choix du mode de fonctionnement

AES propose plusieurs modes de fonctionnement, et il est important de choisir celui qui offre la meilleure sécurité.

    • Mode recommandé : GCM

    • Le mode GCM (Galois/Counter Mode) offre non seulement du chiffrement mais aussi une vérification de l’intégrité des données.

    • Si vous utilisez le mode CBC, ajoutez une vérification d’intégrité avec HMAC pour la détection de modifications.

4. Résistance aux attaques

Pour minimiser les risques que les données chiffrées soient analysées, vous devez suivre certaines pratiques :

    • Prévention des attaques par timing

    • Veillez à ce que les opérations de chiffrement soient effectuées dans des délais constants.

    • Uniformiser la longueur des données chiffrées

    • Ajoutez un padding aux données pour éviter que les variations de taille ne soient utilisées pour des analyses.

5. Vérification de l’intégrité des données

Le chiffrement seul ne garantit pas l’intégrité des données. Pour cela, vous devez ajouter une fonction de détection de falsification.

    • Ajout d’HMAC

    • Utilisez HMAC (Hash-based Message Authentication Code) pour vérifier si les données ont été altérées.

    • Exemple d’utilisation de HMAC avec PyCryptodome :
      python from Crypto.Hash import HMAC, SHA256 h = HMAC.new(key, digestmod=SHA256) h.update(encrypted_data) mac = h.hexdigest()

6. Génération de clés à partir d’un mot de passe

Si vous générez une clé à partir d’un mot de passe utilisateur, utilisez un algorithme sécurisé.

    • Algorithme recommandé : PBKDF2

    • PBKDF2 combine un sel et des itérations pour sécuriser la génération de la clé.

    • Exemple d’utilisation de PBKDF2 avec PyCryptodome :
      python from Crypto.Protocol.KDF import PBKDF2 salt = get_random_bytes(16) key = PBKDF2("motdepasse", salt, dkLen=32, count=100000)

7. Mise à jour des bibliothèques

Les bibliothèques de chiffrement peuvent avoir des vulnérabilités, donc il est important de toujours utiliser la version la plus récente.

pip install --upgrade pycryptodome

8. Suppression sécurisée des données chiffrées

Lorsque les données chiffrées ou les fichiers de clé ne sont plus nécessaires, supprimez-les de manière sécurisée en les écrasant avant la suppression.

Résumé

La sécurité du chiffrement AES dépend de la manière dont il est mis en œuvre. Accordez une attention particulière à la gestion des clés et des IV, à la prévention des accès non autorisés et à la vérification de l’intégrité des données. Ainsi, vous pourrez construire un système de chiffrement sécurisé et pratique.

Conclusion

Dans cet article, nous avons expliqué en détail la mise en œuvre du chiffrement et du déchiffrement AES avec Python, en abordant les concepts de base, l’installation des bibliothèques nécessaires, et les étapes pratiques de chiffrement et déchiffrement des données et des fichiers. Nous avons également couvert les précautions de sécurité à prendre en compte lors de l’implémentation du chiffrement AES.

En gérant correctement les clés et les IV, en ajoutant des mécanismes de vérification de l’intégrité des données, et en suivant les bonnes pratiques de sécurité, vous pourrez maximiser la puissance du chiffrement AES et protéger les données sensibles de manière efficace.

Conclusion

Dans cet article, nous avons expliqué en détail la mise en œuvre du chiffrement et du déchiffrement AES avec Python, en abordant les concepts de base, l’installation des bibliothèques nécessaires, et les étapes pratiques de chiffrement et déchiffrement des données et des fichiers. Nous avons également couvert les précautions de sécurité à prendre en compte lors de l’implémentation du chiffrement AES.

En gérant correctement les clés et les IV, en ajoutant des mécanismes de vérification de l’intégrité des données, et en suivant les bonnes pratiques de sécurité, vous pourrez maximiser la puissance du chiffrement AES et protéger les données sensibles de manière efficace.

Sommaire