Exercices : sécurisation des communications

Exercice 0. QCM d’activation

Pour chaque question, une seule réponse est correcte.

Question 1. Le chiffrement symétrique utilise :

  • A) deux clés différentes : une publique et une privée
  • B) une seule clé, partagée entre l’émetteur et le récepteur
  • C) uniquement la clé publique du destinataire
  • D) aucune clé, seulement un algorithme secret
Correction

Réponse B. Le chiffrement symétrique repose sur une clé unique, identique pour chiffrer et déchiffrer. Le problème est la transmission sécurisée de cette clé.

  • A est faux : c’est le principe du chiffrement asymétrique ;
  • C est faux : la clé publique seule ne suffit pas en chiffrement symétrique ;
  • D est faux : la sécurité repose sur le secret de la clé, pas de l’algorithme (principe de Kerckhoffs).

Question 2. Quel objectif de sécurité garantit que le message n’a pas été modifié pendant le transport ?

  • A) la confidentialité
  • B) l’authentification
  • C) l’intégrité
  • D) la non-répudiation
Correction

Réponse C. L’intégrité garantit que le message reçu est identique au message envoyé, sans altération.

  • A est faux : la confidentialité empêche un tiers de lire le message ;
  • B est faux : l’authentification vérifie l’identité de l’émetteur ;
  • D est faux : la non-répudiation empêche l’émetteur de nier avoir envoyé le message.

Question 3. Dans le chiffrement asymétrique, pour envoyer un message confidentiel à Alice, Bob chiffre avec :

  • A) la clé privée d’Alice
  • B) la clé publique de Bob
  • C) la clé publique d’Alice
  • D) la clé privée de Bob
Correction

Réponse C. Bob chiffre avec la clé publique d’Alice (accessible à tous). Seule Alice pourra déchiffrer avec sa clé privée (qu’elle seule possède).

  • A est faux : Bob n’a pas accès à la clé privée d’Alice ;
  • B est faux : chiffrer avec sa propre clé publique ne permettrait qu’à lui-même de déchiffrer ;
  • D est faux : chiffrer avec sa clé privée correspondrait à une signature, pas à un chiffrement confidentiel.

Question 4. Le chiffrement de César avec un décalage de 3 transforme la lettre D en :

  • A) A
  • B) G
  • C) F
  • D) H
Correction

Réponse B. Le chiffrement de César décale chaque lettre de 3 positions dans l’alphabet : D → E → F → G.

  • A est faux : ce serait un décalage de -3 (déchiffrement) ;
  • C est faux : ce serait un décalage de 2 ;
  • D est faux : ce serait un décalage de 4.

Question 5. Un certificat numérique (HTTPS) permet principalement de :

  • A) chiffrer les données avec un chiffrement symétrique uniquement
  • B) vérifier l’identité du serveur et établir une connexion chiffrée
  • C) empêcher toute attaque informatique sur le réseau
  • D) stocker les mots de passe des utilisateurs de manière sécurisée
Correction

Réponse B. Le certificat numérique, délivré par une autorité de certification, permet au navigateur de vérifier qu’il communique bien avec le bon serveur (authentification), puis d’établir une connexion chiffrée (protocole TLS/SSL).

  • A est faux : le certificat utilise le chiffrement asymétrique pour échanger la clé de session ;
  • C est faux : le certificat ne protège pas contre toutes les attaques (par exemple, les attaques côté client) ;
  • D est faux : les certificats ne servent pas au stockage de mots de passe.

Exercice 1 — Identifier les objectifs de sécurité

Pour chaque situation, indiquer quel(s) objectif(s) de sécurité (confidentialité, intégrité, authentification) est (sont) menacé(s). Justifier.

  1. Un pirate intercepte un email et le lit sans que l’expéditeur ni le destinataire ne s’en aperçoivent.
  2. Un pirate modifie le montant d’un virement bancaire pendant son transfert sur le réseau.
  3. Un pirate crée un faux site web identique à celui d’une banque pour récupérer les identifiants des clients.
  4. Un pirate intercepte un message chiffré, le supprime et le remplace par un autre message (également chiffré avec la bonne clé publique).
Solution
  1. Confidentialité menacée : le pirate a pu lire le contenu du message alors qu’il n’en était pas le destinataire.
  2. Intégrité menacée : le message a été altéré pendant son transport. Le destinataire reçoit un montant différent de celui envoyé par l’expéditeur.
  3. Authentification menacée : le client croit communiquer avec sa banque, mais il communique en réalité avec le pirate. C’est une attaque de l’homme du milieu.
  4. Intégrité et authentification menacées : le message original a été remplacé (intégrité), et le destinataire croit que le nouveau message provient de l’expéditeur légitime (authentification). En revanche, la confidentialité du message original n’est pas nécessairement compromise (le pirate ne peut pas le déchiffrer s’il n’a pas la clé privée).

Exercice 2 — Chiffrement de Vigenère

Le chiffrement de Vigenère est une extension du chiffrement de César. Au lieu d’utiliser un décalage unique, on utilise un mot-clé qui détermine un décalage différent pour chaque lettre du message.

Par exemple, avec le mot-clé NSI (décalages 13, 18, 8) :

Position123456
MessageSECRET
Clé (répétée)NSINSI
Décalage1318813188
ChiffréFWKEWB
  1. Chiffrer le message PYTHON avec la clé NSI.
  2. Écrire une fonction chiffre_vigenere(message, cle) qui chiffre un message (en majuscules, sans accent) avec la clé donnée.
  3. Écrire la fonction dechiffre_vigenere(message, cle) correspondante.
  4. Pourquoi le chiffrement de Vigenère est-il plus résistant que celui de César face à l’analyse fréquentielle ?
  5. Est-il pour autant incassable ? Justifier.
Solution
  1. Clé NSI répétée : NSINSI. Décalages : 13, 18, 8, 13, 18, 8.

    • P(15) + 13 = 2 → C
    • Y(24) + 18 = 16 → Q
    • T(19) + 8 = 1 → B
    • H(7) + 13 = 20 → U
    • O(14) + 18 = 6 → G
    • N(13) + 8 = 21 → V

    Le message chiffré est CQBUGV.

def chiffre_vigenere(message, cle):
    resultat = ""
    j = 0
    for c in message:
        if "A" <= c <= "Z":
            decalage = ord(cle[j % len(cle)]) - ord("A")
            resultat += chr((ord(c) - ord("A") + decalage) % 26 + ord("A"))
            j += 1
        else:
            resultat += c
    return resultat
def dechiffre_vigenere(message, cle):
    resultat = ""
    j = 0
    for c in message:
        if "A" <= c <= "Z":
            decalage = ord(cle[j % len(cle)]) - ord("A")
            resultat += chr((ord(c) - ord("A") - decalage) % 26 + ord("A"))
            j += 1
        else:
            resultat += c
    return resultat
  1. Avec César, chaque lettre est toujours décalée de la même valeur : la fréquence des lettres dans le message chiffré reflète directement celle du message clair (le E chiffré est toujours la même lettre). Avec Vigenère, une même lettre du message clair peut donner des lettres chiffrées différentes selon sa position, ce qui brouille les fréquences.

  2. Non, il n’est pas incassable. Si un attaquant devine la longueur de la clé (par exemple par le test de Kasiski ou l’indice de coïncidence), il peut décomposer le message en autant de sous-messages, chacun chiffré par un simple César, et appliquer l’analyse fréquentielle sur chaque sous-message.

Exercice 3 — Attaque de l’homme du milieu

Alice veut envoyer un message confidentiel à Bob en utilisant un chiffrement asymétrique. Elle récupère la clé publique de Bob sur un serveur public. Mais un pirate, Ève, a remplacé la clé publique de Bob par la sienne sur le serveur.

  1. Décrire précisément ce qui se passe lorsque Alice chiffre son message et l’envoie.
  2. Ève peut-elle lire le message d’Alice ? Justifier.
  3. Ève peut-elle faire suivre le message à Bob sans qu’il se doute de quelque chose ? Expliquer comment.
  4. Quel mécanisme permet de se prémunir contre cette attaque ? Expliquer son fonctionnement.
Solution
  1. Alice chiffre son message avec ce qu’elle croit être la clé publique de Bob, mais qui est en réalité la clé publique d’Ève. Elle envoie le message chiffré.

  2. Oui. Ève intercepte le message et le déchiffre avec sa clé privée (puisque le message a été chiffré avec sa clé publique). Elle peut donc lire le contenu en clair.

  3. Oui. Après avoir lu le message, Ève le re-chiffre avec la vraie clé publique de Bob et le lui transmet. Bob le déchiffre normalement avec sa clé privée et ne se doute de rien : il reçoit bien le message d’Alice, sans savoir qu’Ève l’a lu.

  4. Le certificat électronique délivré par une autorité de certification (AC). L’AC vérifie l’identité du propriétaire de chaque clé publique et signe un certificat liant cette clé à son propriétaire. Quand Alice récupère la clé publique de Bob, elle vérifie le certificat : si Ève a remplacé la clé, le certificat ne correspondra pas, et Alice sera alertée.

Exercice 4 — Analyse fréquentielle

Le message suivant a été chiffré par substitution mono-alphabétique (chaque lettre est remplacée par une autre, toujours la même) :

OH FKLIIUHPHQW HVW XQH PHWKRGH DQFLHQQH

On sait que, dans un texte français suffisamment long, les lettres les plus fréquentes sont E, A, S, I, N, T (dans cet ordre approximatif).

  1. Compter la fréquence de chaque lettre dans le message chiffré.
  2. En déduire que ce message a probablement été chiffré avec un chiffrement de César. Trouver le décalage.
  3. Déchiffrer le message.
  4. Écrire une fonction Python casse_cesar(message_chiffre) qui teste tous les décalages possibles et affiche les 26 résultats.
Solution
  1. Fréquences dans le message chiffré (en ignorant les espaces) :

    H apparaît 9 fois, Q apparaît 5 fois, W apparaît 3 fois, F apparaît 2 fois, K apparaît 2 fois, L apparaît 2 fois, I apparaît 2 fois, P apparaît 2 fois, O apparaît 1 fois, U apparaît 1 fois, V apparaît 1 fois, X apparaît 1 fois, R apparaît 1 fois, G apparaît 1 fois, D apparaît 1 fois.

  2. H est la lettre la plus fréquente (7 occurrences). Dans un texte français, la lettre la plus fréquente est E. Si H correspond à E, le décalage est 7 − 4 = 3. On peut vérifier : avec un décalage de 3, Q (16) → N (13), W (22) → T (19), P (15) → M (12). Les lettres N, T, M sont bien fréquentes en français. De plus, chaque lettre est décalée du même nombre, ce qui confirme qu’il s’agit d’un chiffrement de César.

  3. En décalant chaque lettre de −3 : LE CHIFFREMENT EST UNE METHODE ANCIENNE.

def casse_cesar(message_chiffre):
    for decalage in range(26):
        resultat = ""
        for c in message_chiffre:
            if "A" <= c <= "Z":
                resultat += chr((ord(c) - ord("A") - decalage) % 26 + ord("A"))
            else:
                resultat += c
        print(f"Décalage {decalage:2d} : {resultat}")

En exécutant casse_cesar("OH FKLIIUHPHQW HVW XQH PHWKRGH DQFLHQQH"), le décalage 3 donne le seul résultat lisible.

Exercice 5 — Scénario complet (type bac)

Cet exercice porte sur la sécurisation des communications.

Clara se connecte au site de sa banque depuis son navigateur. L’adresse du site commence par https://.

Partie A — Mise en place de la connexion sécurisée

  1. Que signifie le s dans https ?
  2. Quel protocole est utilisé pour sécuriser cette connexion ?
  3. Expliquer pourquoi le navigateur de Clara vérifie le certificat du serveur de la banque avant d’établir la connexion. Quel type d’attaque cette vérification permet-elle d’éviter ?
  4. Décrire les étapes de l’établissement de la connexion sécurisée entre le navigateur de Clara et le serveur de la banque.

Partie B — Pendant la communication

  1. Une fois la connexion établie, le chiffrement utilisé pour échanger les données est-il symétrique ou asymétrique ? Justifier ce choix.
  2. Clara effectue un virement de 500 € vers le compte de David. Expliquer comment la signature électronique peut garantir que l’ordre de virement n’a pas été modifié pendant le transfert et qu’il provient bien de Clara.

Partie C — Programmation

  1. On souhaite simuler un échange de clé simplifié. Écrire une fonction genere_cle_session(taille) qui renvoie une chaîne aléatoire de taille caractères parmi les lettres majuscules et les chiffres.
  2. Écrire une fonction xor_chiffre(message, cle) qui chiffre un message en effectuant un XOR caractère par caractère entre le message et la clé (répétée si nécessaire). On rappelle que ord(c) renvoie le code ASCII d’un caractère et chr(n) renvoie le caractère de code ASCII n.
Solution

Partie A

  1. Le s signifie secure : la communication est chiffrée. Le protocole HTTP est encapsulé dans une couche de sécurité.

  2. Le protocole TLS (anciennement SSL).

  3. Le certificat garantit que la clé publique reçue appartient bien au serveur de la banque et non à un imposteur. Sans cette vérification, un pirate pourrait se faire passer pour le serveur de la banque en présentant sa propre clé publique (attaque de l’homme du milieu).

  4. Étapes simplifiées :

    • Le navigateur de Clara contacte le serveur et demande une connexion sécurisée.
    • Le serveur envoie son certificat contenant sa clé publique.
    • Le navigateur vérifie ce certificat auprès d’une autorité de certification.
    • Le navigateur génère une clé de session aléatoire, la chiffre avec la clé publique du serveur et l’envoie (chiffrement asymétrique).
    • Le serveur déchiffre cette clé de session avec sa clé privée.
    • La communication se poursuit en chiffrement symétrique avec la clé de session.

Partie B

  1. Le chiffrement est symétrique (avec la clé de session échangée lors de l’étape précédente). Le chiffrement asymétrique est trop lent pour chiffrer de grandes quantités de données en temps réel. Le protocole hybride utilise l’asymétrique uniquement pour transmettre la clé de session de manière sécurisée.

  2. Le serveur de la banque (au nom de Clara, authentifiée par ses identifiants) :

    • calcule une empreinte de l’ordre de virement à l’aide d’une fonction de hachage ;
    • chiffre cette empreinte avec la clé privée du serveur : c’est la signature ;
    • envoie l’ordre de virement accompagné de la signature.

    Le destinataire (le système de la banque de David) :

    • déchiffre la signature avec la clé publique de la banque de Clara ;
    • recalcule l’empreinte de l’ordre reçu ;
    • compare les deux empreintes : si elles sont identiques, l’ordre n’a pas été modifié (intégrité) et provient bien de la banque de Clara (authentification).

Partie C

import random
import string

def genere_cle_session(taille):
    caracteres = string.ascii_uppercase + string.digits
    return "".join(random.choice(caracteres) for _ in range(taille))
def xor_chiffre(message, cle):
    resultat = ""
    for i in range(len(message)):
        c_msg = ord(message[i])
        c_cle = ord(cle[i % len(cle)])
        resultat += chr(c_msg ^ c_cle)
    return resultat

Le XOR a la propriété intéressante d’être sa propre inverse : xor_chiffre(xor_chiffre(message, cle), cle) redonne le message original. C’est le même principe que le chiffrement symétrique : la même clé sert à chiffrer et à déchiffrer.