Plateforme de Cryptographie Par Kaci AMAOUCHE

Exercices - Chapitre 2: Chiffrement symétrique et asymétrique

Mettez en pratique vos connaissances sur les différentes méthodes de chiffrement

Exercice 2.1 : Chiffrement AES

L'Advanced Encryption Standard (AES) est l'un des algorithmes de chiffrement symétrique les plus utilisés aujourd'hui. Dans cet exercice, vous allez implémenter et comprendre son fonctionnement.

Partie A : Implémentation en Python

Complétez le code Python suivant pour implémenter un chiffrement et déchiffrement AES en mode CBC :


from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import os

def encrypt_aes_cbc(plaintext, key):
    # Assurez-vous que la clé fait 16, 24 ou 32 octets (AES-128, AES-192 ou AES-256)
    if len(key) not in [16, 24, 32]:
        raise ValueError("La clé doit faire 16, 24 ou 32 octets")
    
    # TODO: Générer un vecteur d'initialisation (IV) aléatoire de 16 octets
    iv = # À compléter
    
    # TODO: Créer le chiffreur avec l'algorithme AES, le mode CBC et l'IV
    cipher = # À compléter
    
    # TODO: Initialiser l'encryptor
    encryptor = # À compléter
    
    # Padder le texte en clair pour qu'il soit un multiple de la taille de bloc (16 octets)
    padding_length = 16 - (len(plaintext) % 16)
    padded_plaintext = plaintext + bytes([padding_length]) * padding_length
    
    # TODO: Chiffrer le texte en clair paddé
    ciphertext = # À compléter
    
    # Retourner l'IV et le texte chiffré
    return iv + ciphertext

def decrypt_aes_cbc(ciphertext, key):
    # Extraire l'IV (les 16 premiers octets)
    iv = ciphertext[:16]
    actual_ciphertext = ciphertext[16:]
    
    # TODO: Créer le chiffreur avec l'algorithme AES, le mode CBC et l'IV
    cipher = # À compléter
    
    # TODO: Initialiser le decryptor
    decryptor = # À compléter
    
    # TODO: Déchiffrer le texte
    padded_plaintext = # À compléter
    
    # Enlever le padding
    padding_length = padded_plaintext[-1]
    plaintext = padded_plaintext[:-padding_length]
    
    return plaintext

# Exemple d'utilisation
key = os.urandom(16)  # Clé aléatoire de 16 octets (AES-128)
message = b"Message secret a chiffrer avec AES"

encrypted = encrypt_aes_cbc(message, key)
decrypted = decrypt_aes_cbc(encrypted, key)

print(f"Message original: {message}")
print(f"Message déchiffré: {decrypted}")
                

Partie B : Analyse des modes d'opération

Comparez les modes d'opération CBC et ECB en termes de sécurité. Pourquoi le mode ECB est-il généralement déconseillé pour les applications réelles ?

Partie C : Vecteur d'initialisation (IV)

Expliquez l'importance du vecteur d'initialisation dans le mode CBC. Que se passerait-il si le même IV était réutilisé pour chiffrer plusieurs messages avec la même clé ?

Exercice 2.2 : Diffie-Hellman

L'algorithme Diffie-Hellman permet à deux parties d'établir une clé secrète partagée sur un canal non sécurisé, sans nécessiter d'échange préalable de secrets.

Partie A : Simulation d'un échange de clés

Simulez un échange de clés Diffie-Hellman en Python en suivant ces étapes :

  1. Définissez un nombre premier p et une base g
  2. Alice et Bob génèrent chacun un nombre secret aléatoire
  3. Alice et Bob calculent et s'échangent leurs valeurs publiques
  4. Alice et Bob calculent la clé secrète partagée
  5. Vérifiez que les deux clés secrètes sont identiques

Partie B : Analyse de sécurité

Expliquez pourquoi il est difficile pour un attaquant écoutant l'échange de clés Diffie-Hellman de déterminer la clé secrète partagée. Sur quel problème mathématique repose cette sécurité ?

Partie C : Vulnérabilité à l'attaque de l'homme du milieu

Le protocole Diffie-Hellman de base est vulnérable à l'attaque de l'homme du milieu (MITM). Décrivez comment fonctionne cette attaque et proposez une solution pour la contrer.

Exercice 2.3 : RSA

L'algorithme RSA est l'un des systèmes de chiffrement à clé publique les plus utilisés. Dans cet exercice, vous allez explorer son fonctionnement et ses applications.

Partie A : Génération de clés et chiffrement/déchiffrement

Implémentez les fonctions suivantes en Python :

  1. Générer une paire de clés RSA (clé publique et clé privée)
  2. Chiffrer un message avec la clé publique
  3. Déchiffrer le message avec la clé privée

Utilisez de petits nombres pour illustrer le fonctionnement de l'algorithme.

Partie B : Sécurité de RSA

Expliquez pourquoi la factorisation de grands nombres premiers est cruciale pour la sécurité de RSA. Quelle est la taille de clé RSA recommandée aujourd'hui pour une sécurité adéquate, et pourquoi ?

Partie C : Signature numérique avec RSA

Expliquez comment RSA peut être utilisé pour créer une signature numérique. Implémentez un exemple simple de signature et de vérification de signature en Python.

Exercice 2.4 : Systèmes cryptographiques hybrides

Les systèmes cryptographiques hybrides combinent les avantages des chiffrements symétriques (rapidité) et asymétriques (facilité de gestion des clés).

Partie A : Conception d'un système hybride

Décrivez étape par étape comment vous concevriez un système de communication sécurisée hybride utilisant AES et RSA. Incluez les détails du premier échange de clé et du chiffrement/déchiffrement des messages.

Partie B : Implémentation partielle

Esquissez en pseudocode ou en Python l'implémentation d'une fonction qui :

  1. Génère une clé AES aléatoire
  2. Chiffre un message avec cette clé
  3. Chiffre la clé AES avec la clé publique RSA du destinataire
  4. Renvoie le message chiffré et la clé chiffrée pour transmission

Partie C : Analyse de cas d'utilisation

Analysez comment PGP (Pretty Good Privacy) utilise l'approche hybride pour le chiffrement des emails. Quels sont les algorithmes typiquement utilisés et comment sont-ils combinés ?