Plateforme de Cryptographie Par Kaci AMAOUCHE

Exercices - Chapitre 3: Fonction de hash

Mettez en pratique vos connaissances sur les fonctions de hachage cryptographique

Exercice 3.1 : Génération et comparaison de hash

Cet exercice vous permettra de comprendre comment différentes fonctions de hachage transforment les données et comment de petites modifications affectent le résultat.

Partie A : Calcul de valeurs de hash

Écrivez un programme Python qui calcule et affiche les valeurs de hash d'une chaîne de caractères en utilisant différents algorithmes (MD5, SHA-1, SHA-256, SHA-3). Testez votre programme avec les entrées suivantes :

  • "Bonjour monde"
  • "Bonjour monde."
  • "bonjour monde"

Observez comment une légère modification du message affecte considérablement la valeur de hash générée.

Partie B : Propriétés des fonctions de hash

Pour chacune des propriétés suivantes des fonctions de hachage cryptographiques, expliquez son importance et donnez un exemple concret de situation où cette propriété est cruciale :

  1. Effet d'avalanche
  2. Résistance à la préimage
  3. Résistance aux collisions

Partie C : Détection de modifications

Vous êtes responsable de vérifier l'intégrité d'un fichier important qui est téléchargé par de nombreux utilisateurs. Décrivez comment vous utiliseriez les fonctions de hash pour garantir que le fichier n'a pas été modifié lors du téléchargement. Incluez dans votre réponse :

  • Quel algorithme de hash vous choisiriez et pourquoi
  • Le processus complet, de la création à la vérification du hash
  • Comment vous géreriez la distribution sécurisée des valeurs de hash

Exercice 3.2 : Stockage sécurisé de mots de passe

Le stockage sécurisé des mots de passe est une application critique des fonctions de hash. Dans cet exercice, vous allez explorer les bonnes pratiques et mettre en œuvre un système sécurisé.

Partie A : Identification des problèmes

Examinez le code suivant qui est censé gérer l'authentification des utilisateurs. Identifiez au moins trois problèmes de sécurité et expliquez comment ils pourraient être exploités :


import sqlite3

def create_user(username, password):
    conn = sqlite3.connect('users.db')
    cursor = conn.cursor()
    cursor.execute('CREATE TABLE IF NOT EXISTS users (username TEXT, password TEXT)')
    cursor.execute('INSERT INTO users VALUES (?, ?)', (username, password))
    conn.commit()
    conn.close()
    print(f"Utilisateur {username} créé avec succès")

def authenticate(username, password):
    conn = sqlite3.connect('users.db')
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM users WHERE username = ? AND password = ?', (username, password))
    user = cursor.fetchone()
    conn.close()
    return user is not None

# Exemple d'utilisation
create_user("admin", "password123")
is_valid = authenticate("admin", "password123")
print(f"Authentification réussie: {is_valid}")
                

Partie B : Implémentation sécurisée

Réécrivez le code ci-dessus en utilisant les bonnes pratiques pour le stockage sécurisé des mots de passe, incluant :

  1. Utilisation d'une fonction de hash adaptée
  2. Salage des mots de passe
  3. Algorithme de dérivation de clé

Expliquez brièvement le rôle de chaque amélioration dans votre solution.

Partie C : Scénario d'attaque

Supposons qu'un attaquant ait obtenu un accès en lecture à votre base de données d'utilisateurs. Comparez les défenses offertes par :

  1. Un stockage en texte clair
  2. Un simple hash MD5
  3. Un hash SHA-256 avec sel
  4. Votre solution de la partie B

Face à différentes attaques (force brute, dictionnaire, rainbow tables).

Exercice 3.3 : Construction d'un arbre de Merkle

Les arbres de Merkle (ou arbres de hachage) sont une structure de données importante utilisée dans de nombreuses applications cryptographiques, notamment les blockchains.

Partie A : Principe et implémentation

Expliquez le principe de fonctionnement d'un arbre de Merkle et implémentez une fonction en Python qui :

  1. Prend une liste de données en entrée
  2. Calcule les hashes de chaque élément (feuilles de l'arbre)
  3. Construit l'arbre de Merkle en combinant et hachant les nœuds par paires
  4. Retourne la racine de l'arbre (Merkle root)

Partie B : Preuve d'inclusion

Implémentez une fonction qui génère une "preuve d'inclusion" pour un élément donné dans l'arbre de Merkle. La preuve doit permettre à quelqu'un qui ne possède pas l'ensemble des données de vérifier qu'un élément particulier fait bien partie de l'ensemble, en connaissant seulement la racine de l'arbre.

Partie C : Application à la blockchain

Expliquez comment les arbres de Merkle sont utilisés dans les blockchains comme Bitcoin pour permettre une vérification efficace des transactions. Quels avantages cette structure apporte-t-elle par rapport à une simple liste de hashes ?

Exercice 3.4 : Fonctions de hachage à sens unique avec trappe

Les fonctions de hachage à sens unique avec trappe (trapdoor one-way functions) sont un concept fondamental pour la cryptographie asymétrique.

Partie A : Définition et propriétés

Expliquez ce qu'est une fonction de hachage à sens unique avec trappe et en quoi elle diffère d'une fonction de hachage cryptographique standard. Quelles sont les propriétés essentielles d'une bonne fonction à sens unique avec trappe ?

Partie B : Applications

Citez et expliquez au moins trois applications concrètes des fonctions à sens unique avec trappe dans les systèmes cryptographiques modernes.

Partie C : Exemple mathématique

Expliquez comment la factorisation de grands nombres peut être considérée comme une fonction à sens unique avec trappe. Illustrez avec un exemple simple (en utilisant de petits nombres pour la clarté) comment RSA utilise ce principe.