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 publiée après la séance.

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 publiée après la séance.

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 publiée après la séance.

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 publiée après la séance.

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 publiée après la séance.

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.

Indice

Confidentialité : seuls les destinataires peuvent lire le message. Intégrité : le message n’a pas été modifié. Authentification : on est sûr de l’identité de l’interlocuteur. Pour chaque situation, se demander ce que le pirate apprend, modifie ou usurpe.

  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).

Correction publiée après la séance.

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

On appelle analyse fréquentielle la technique qui consiste à compter la fréquence de chaque lettre d’un message chiffré et à la comparer à la fréquence des lettres dans la langue du message. En français, la lettre E est de loin la plus fréquente : avec un chiffrement de César, la lettre la plus fréquente du message chiffré correspond donc probablement à E, ce qui donne le décalage. L’exercice 4 met en œuvre cette méthode.

  1. Chiffrer le message PYTHON avec la clé NSI.

    Indice

    Répéter la clé sous le message (NSINSI), puis décaler chaque lettre du message du rang de la lettre de clé placée dessous (A = 0, N = 13, S = 18, I = 8), en revenant à A après Z.

  2. Écrire une fonction chiffre_vigenere(message, cle) qui chiffre un message (en majuscules, sans accent) avec la clé donnée.

    Indice

    Parcourir le message en avançant d’une lettre dans la clé à chaque lettre chiffrée, avec un compteur j : j % len(cle) fait recommencer la clé au début. Le décalage d’une lettre de clé est son rang dans l’alphabet, ord(lettre) - ord("A"), et % 26 fait revenir à A après Z.

    Code à copier puis compléter
    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") + ...) % 26 + ord("A"))
                j += 1
            else:
                resultat += ...
        return resultat
    
  3. Écrire la fonction dechiffre_vigenere(message, cle) correspondante.

    Indice

    Même fonction que chiffre_vigenere, en retirant le décalage au lieu de l’ajouter : % 26 garde un rang compris entre 0 et 25.

  4. Pourquoi le chiffrement de Vigenère est-il plus résistant que celui de César face à l’analyse fréquentielle ?

    Indice

    Avec César, une même lettre est toujours chiffrée de la même façon. Avec Vigenère, que devient un E selon sa position dans le message ?

  5. Est-il pour autant incassable ? Justifier.

    Indice

    La clé se répète : si l’on connaît sa longueur, les lettres placées à intervalles réguliers de cette longueur sont chiffrées par un même décalage. Que peut-on alors appliquer à chacun de ces groupes de lettres ?

Correction publiée après la séance.

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.

    Indice

    Avec quelle clé publique le message est-il réellement chiffré ? Qui possède la clé privée correspondante ?

  2. Ève peut-elle lire le message d’Alice ? Justifier.

    Indice

    Un message chiffré avec une clé publique se déchiffre avec la clé privée associée : Ève possède-t-elle cette clé privée ?

  3. Ève peut-elle faire suivre le message à Bob sans qu’il se doute de quelque chose ? Expliquer comment.

    Indice

    Après avoir lu le message, Ève peut le chiffrer de nouveau : avec quelle clé, pour que Bob puisse le lire ?

  4. Quel mécanisme permet de se prémunir contre cette attaque ? Expliquer son fonctionnement.

    Indice

    Il faut pouvoir vérifier qu’une clé publique appartient bien à Bob : quel document, signé par une autorité de confiance, associe une clé publique à son propriétaire ?

Correction publiée après la séance.

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é.

    Indice

    Compter les lettres une à une, sans les espaces, par exemple à l’aide d’un dictionnaire en Python. Quelle lettre apparaît le plus souvent ?

  2. En déduire que ce message a probablement été chiffré avec un chiffrement de César. Trouver le décalage.

    Indice

    La lettre la plus fréquente du message chiffré correspond probablement à E : combien de rangs les séparent ? Vérifier que ce décalage donne des mots français.

  3. Déchiffrer le message.

    Indice

    Reculer chaque lettre du décalage trouvé, en revenant à Z après A.

  4. Écrire une fonction Python casse_cesar(message_chiffre) qui teste tous les décalages possibles et affiche les 26 résultats.

    Indice

    Deux boucles imbriquées : la première essaie chaque décalage de 0 à 25, la seconde déchiffre chaque lettre avec ce décalage, comme à l’exercice 2.

    Code à copier puis compléter
    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") - ...) % 26 + ord("A"))
                else:
                    resultat += c
            print(f"Décalage {decalage} : {resultat}")
    

Correction publiée après la séance.

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 ?

    Indice

    Comparer http et https : que garantit la version avec s ?

  2. Quel protocole est utilisé pour sécuriser cette connexion ?

    Indice

    C’est le protocole qui chiffre les échanges entre le navigateur et le serveur, successeur de SSL.

  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 ?

    Indice

    Le certificat lie la clé publique du serveur à l’identité de la banque : sans lui, que pourrait faire un pirate placé entre Clara et la banque ? Revoir l’exercice 3.

  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.

    Indice

    Le navigateur vérifie le certificat ; navigateur et serveur se mettent ensuite d’accord sur une clé de session, échangée grâce au chiffrement asymétrique ; la suite des échanges est chiffrée avec cette clé.

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.

    Indice

    Comparer la rapidité des deux types de chiffrement pour de gros volumes de données.

  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.

    Indice

    Clara calcule une empreinte de l’ordre de virement avec une fonction de hachage et la chiffre avec sa clé privée. Que peut alors vérifier la banque avec la clé publique 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.

    Indice

    random.choice(chaine) tire un caractère au hasard dans une chaîne. Écrire la chaîne des 36 caractères possibles, puis ajouter un à un taille caractères tirés au hasard.

    Code à copier puis compléter
    import random
    
    def genere_cle_session(taille):
        caracteres = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
        cle = ""
        for _ in range(taille):
            cle += random.choice(...)
        return cle
    
  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. Pour deux entiers a et b, l’expression a ^ b calcule le OU exclusif (XOR) bit à bit de leurs écritures binaires : par exemple, 6 ^ 3 vaut 5, car 110 XOR 011 donne 101. Le XOR de deux caractères c1 et c2 s’obtient donc par chr(ord(c1) ^ ord(c2)).

    Indice

    Parcourir le message par ses indices : le caractère de clé utilisé pour l’indice i est cle[i % len(cle)], ce qui répète la clé autant qu’il le faut.

    Code à copier puis compléter
    def xor_chiffre(message, cle):
        resultat = ""
        for i in range(len(message)):
            c_msg = ord(message[i])
            c_cle = ord(cle[...])
            resultat += chr(... ^ ...)
        return resultat
    

Correction publiée après la séance.