Exercice 1 Nouvelle Calédonie – Bac NSI 2025 – Jour 2
mots clés: sécurisation des communications, représentation des données, programmation
🔎 Voir les exercices similaires ↓
Nouvelle Calédonie – Bac NSI 2025 – Jour 2 Énoncé de l'exercice 1
Cet exercice porte sur la sécurisation des communications, la représentation des données et la programmation en Python.
Alice et Bob cherchent à communiquer de manière sécurisée sur un réseau ouvert à tous. Eve veille et écoute tout ce qui passe sur le réseau. Mallory aimerait bien se faire passer pour quelqu’un d’autre. L’objectif de cet exercice est de s’intéresser à des protocoles de chiffrements et à un protocole de signature permettant d’authentifier l’auteur d’un message.
Alice, qui ne connaît Bob que par les réseaux sociaux, aimerait lui faire parvenir de manière secrète le message m0 suivant :
m0 = 'Rendez-vous à 16h place de la liberté. Signé : Alice.'
Si Alice transmet directement ce message m0 sur le réseau, Eve, qui écoute le réseau en permanence, pourra en prendre connaissance.
Partie A : Cryptographie symétrique
On se place dans le cadre d’un chiffrement symétrique avec une seule clé. On suppose disposer d’une fonction code en Python telle que code(m, cle) permet de chiffrer et de déchiffrer un message m à l’aide de la clé cle. Cette fonction prend en paramètres deux chaînes de caractères et renvoie une chaîne de caractères. On suppose que, pour tout message m, on a toujours : code(code(m, cle), cle) égal à m.
Ceci veut dire que l’on peut chiffrer un message à l’aide de la clé, puis le déchiffrer exactement de la même manière à l’aide de cette même clé.
Alice effectue donc l’instruction suivante :
m1 = code(m0, cle)
Elle transmet à Bob le message m1 ainsi que la clé cle sur le réseau.
Donner l’instruction que doit écrire Bob pour déchiffrer le message d’Alice et affecter le résultat dans une variable m2.
Cependant, Eve dispose du message m1 ainsi que de la cle qui ont tous les deux été transmis sur le réseau. Elle peut donc effectuer la même instruction que Bob et prendre connaissance du message secret.
Partie B : Cryptographie asymétrique
On se place maintenant dans le cadre d’un chiffrement asymétrique avec cette fois-ci une paire clé privée/clé publique. Dans ce système, chaque individu possède une paire de clés associées (cle1, cle2). On suppose toujours disposer d’une fonction code telle que code(m, cle) permet de chiffrer ou déchiffrer un message m à l’aide de la clé cle. On suppose cette fois-ci que, pour tout message m et pour toute paire de clés associées (cle1, cle2), on a toujours : code(code(m, cle1), cle2) qui est égal à code(code(m, cle2), cle1) et qui sont tous les deux égaux à m.
Ceci veut dire que lorsque l’on transforme un message à l’aide d’une clé puis de l’autre clé associée on retrouve le message initial. On suppose que la connaissance d’une clé ne permet pas de trouver l’autre. On suppose aussi qu’il est impossible de retrouver un message chiffré par une clé sans connaître l’autre clé.
Alice et Bob ont tous les deux généré une paire de clés associées. On note (cle1_a, cle2_a) la paire de clés d’Alice et (cle1_b, cle2_b) la paire de clés de Bob. Alice diffuse sa clé cle1_a sur Internet mais pas sa clé cle2_a et de même Bob diffuse sa clé cle1_b sur Internet mais pas sa clé cle2_b.
Alice effectue l’instruction suivante, en utilisant la clé cle1_b de Bob qu’elle trouve sur Internet :
m1 = code(m0, cle1_b)
Elle transmet ensuite ce message chiffré m1 sur le réseau.
Donner l’instruction que doit réaliser Bob pour déchiffrer le message d’Alice afin de connaître l’heure et le lieu du rendez-vous.
Justifier qu’il est désormais impossible pour Eve de prendre connaissance du contenu du message secret.
On parle de système de clé privée/clé publique. Dans l’échange précédent, indiquer quelle est la clé privée et quelle est la clé publique.
Bob souhaite accuser bonne réception de ce rendez-vous et transmettre à Alice le message suivant 'Bien reçu. Rendez-vous à 16h donc.', dont Eve ne doit pas pouvoir prendre connaissance. Donner, dans l’ordre, les instructions que doivent réaliser Bob et Alice pour sécuriser ce deuxième envoi.
Expliquer pourquoi il est nécessaire d’avoir les deux clés au lieu de n’avoir que la clé privée.
Partie C : Signature
Dans cette partie et la suivante, Alice et Bob ne cherchent plus à cacher le message et Alice transmet directement m0 sur le réseau sans le chiffrer. Mallory souhaite envoyer le message suivant à Bob, en faisant croire que ce message provient d’Alice :
m3 = 'Rendez-vous à 15h rue de la dictature. Signé : Alice.'
Il intercepte le message m0 transmis par Alice sur le réseau, le supprime, et le remplace par le message m3 qu’il transmet à Bob, qui n’a aucun moyen de savoir que le message ne provient pas d’Alice.
Pour éviter cela, on propose un protocole de signature permettant à Alice de certifier qu’un message a été écrit par elle.
Alice chiffre son message m0 avec sa deuxième clé cle2_a, c’est-à-dire elle calcule m0_s = code(m0, cle2_a) que l’on appelle la signature du message m0. Elle transmet à la fois le message m0 et sa signature m0_s sur le réseau à Bob. De manière générale, on suppose qu’il n’est pas possible de construire m0_s à partir de m0 sans connaître la clé à l’origine de cette transformation.
Expliquer en quoi les informations m0, m0_s et cle1_a connues de Bob permettent de garantir à la fois que le message provient bien d’Alice et que Mallory n’a pas pu envoyer le message m3 à Bob en se faisant passer pour Alice.
Partie D : Signature par empreinte
Un des problèmes de l’approche précédente est qu’Alice doit transmettre à la fois m0 et m0_s, ce qui double globalement la taille de chaque envoi. Pour résoudre ce problème, on va signer en utilisant une empreinte du message plutôt que le message lui-même.
On rappelle qu’un texte est représenté en machine à l’aide d’un encodage, par exemple l’encodage ASCII, que l’on supposera utilisé dans cet exercice. La fonction ord en Python permet d’obtenir le code d’un caractère.
Par exemple :
>>> ord('a')
97
>>> ord('b')
98
>>> ord('c')
99
On rappelle que la valeur absolue d’un nombre x, que l’on note |x| est la valeur de ce nombre sans tenir compte de son signe. On suppose disposer de la fonction abs en Python qui calcule la valeur absolue d’un nombre passé en paramètre.
Par exemple :
>>> abs(4)
4
>>> abs(-6)
6
On considère la fonction de réduction qui prend en paramètre une chaîne de caractères de longueur n et qui renvoie la somme, pour chaque indice i entre 1 et n - 1, du produit de l’indice i et de la valeur absolue de la différence entre le code du caractère d’indice i et celui d’indice i - 1.
On considère par exemple la chaîne de caractères s = 'abca', représentée ci-dessous avec les indices :
| s = 'abca' | ||||
|---|---|---|---|---|
| indice | 0 | 1 | 2 | 3 |
| caractère | a | b | c | a |
Pour cette chaîne de caractères, on obtient donc une réduction :
1 × |98 − 97| + 2 × |99 − 98| + 3 × |97 − 99| = 9
Donner sans justifier la réduction de la chaîne de caractères 'bac'.
Écrire en Python une fonction reduction qui calcule l’entier correspondant à la réduction d’une chaîne de caractères.
Par exemple :
>>> reduction('abca')
9
>>> reduction(m0)
62073
>>> reduction(m3)
53681
Dans la suite, on peut utiliser la fonction str pour transformer l’entier correspondant à une réduction, en chaîne de caractères.
Alice calcule donc m0_r = str(reduction(m0)) puis m0_s = code(m0_r, cle2_a) qui est la nouvelle signature de m0.
Décrire ce que doit désormais réaliser Bob pour vérifier l’authenticité du message, c’est-à-dire qu’il a bien été envoyé par Alice.
Pour réduire davantage encore la taille de la signature, on propose de n’utiliser que les dix premiers indices du message m0 dans le calcul de la réduction plutôt que le message en entier.
Commenter cette approche.
Partie E : Chiffrement et signature
Dans le protocole proposé dans la dernière partie, le message m0 est envoyé sans être chiffré et Eve peut en prendre connaissance.
- Proposer un protocole qui permet à Alice d’envoyer un message à Bob de manière confidentielle en certifiant que ce message provient bien d’elle et de manière à ce que Eve ne puisse pas en prendre connaissance. Détailler également la procédure que doit suivre Bob pour déchiffrer le message et garantir qu’il provient d’Alice.
Nouvelle Calédonie – Bac NSI 2025 – Jour 2 Correction de l'exercice 1
Partie A – Cryptographie symétrique
1. Déchiffrement par Bob
m2 = code(m1, cle)
Partie B – Cryptographie asymétrique
2. Déchiffrement par Bob
m2 = code(m1, cle2_b)
3. Eve ne peut pas lire le message
Eve connaît le message chiffré m1 et la clé cle1_b, diffusée sur Internet. Pour déchiffrer m1, il faut la clé associée cle2_b, que Bob n’a jamais diffusée ; et la connaissance de cle1_b ne permet pas de retrouver cle2_b. Seul Bob peut déchiffrer m1.
4. Clé publique et clé privée
Les clés diffusées sur Internet, cle1_a et cle1_b, sont les clés publiques. Les clés gardées secrètes, cle2_a et cle2_b, sont les clés privées.
5. Réponse de Bob à Alice
Bob chiffre sa réponse avec la clé publique d’Alice :
m4 = code('Bien reçu. Rendez-vous à 16h donc.', cle1_a)
Il transmet m4 sur le réseau ; Alice le déchiffre avec sa clé privée :
m5 = code(m4, cle2_a)
6. Pourquoi deux clés ?
Pour que quelqu’un puisse envoyer un message chiffré à Bob, il doit disposer d’une clé pour chiffrer. Avec une seule clé, il faudrait la transmettre, et elle ne serait plus secrète : tout le monde pourrait déchiffrer les messages.
Avec deux clés, la clé publique, qui sert à chiffrer, peut être diffusée librement, tandis que la clé privée, qui sert à déchiffrer, reste secrète et n’est jamais transmise.
Partie C – Signature
7. Authentification par la signature
Bob calcule code(m0_s, cle1_a) avec la clé publique d’Alice. S’il obtient m0, c’est que m0_s a été obtenu à partir de m0 avec la clé associée cle2_a.
Seule Alice connaît cle2_a : elle seule a pu fabriquer m0_s, le message provient donc bien d’elle.
Mallory ne connaît pas cle2_a : il ne peut pas fabriquer la signature de m3. S’il envoie m3 avec la signature m0_s, Bob obtient m0 ≠ m3 et détecte la fraude.
Partie D – Signature par empreinte
8. Réduction de la chaîne 'bac'
| indice | 0 | 1 | 2 |
|---|---|---|---|
| caractère | b | a | c |
| code | 98 | 97 | 99 |
1 × |97 − 98| + 2 × |99 − 97| = 1 + 4 = 5
9. Fonction reduction
def reduction(chaine):
total = 0
for i in range(1, len(chaine)):
total = total + i * abs(ord(chaine[i]) - ord(chaine[i - 1]))
return total
10. Vérification par Bob
Bob reçoit m0 et m0_s. Il :
– calcule l’empreinte du message reçu : empreinte = str(reduction(m0)) ;
– déchiffre la signature avec la clé publique d’Alice : verif = code(m0_s, cle1_a) ;
– compare : si verif == empreinte, le message provient bien d’Alice et n’a pas été modifié.
11. Réduction limitée aux dix premiers caractères
La signature est un peu plus courte, mais la sécurité diminue fortement : la fin du message n’est plus prise en compte. Mallory peut modifier le message à partir du 11e caractère sans changer l’empreinte, et réutiliser la signature d’Alice.
Partie E – Chiffrement et signature
12. Protocole complet
Côté Alice :
m0_r = str(reduction(m0)) # empreinte
m0_s = code(m0_r, cle2_a) # signature avec sa clé privée
m1 = code(m0, cle1_b) # message chiffré avec la clé publique de Bob
s1 = code(m0_s, cle1_b) # signature chiffrée avec la clé publique de Bob
Alice transmet m1 et s1 sur le réseau.
Côté Bob :
m2 = code(m1, cle2_b) # message en clair
s2 = code(s1, cle2_b) # signature
verif = code(s2, cle1_a) # empreinte calculée par Alice
if verif == str(reduction(m2)):
print('Message authentique')
Eve ne peut rien lire sans cle2_b (confidentialité), et seule Alice a pu produire la signature avec cle2_a (authenticité).
Une erreur, un oubli ? Écrivez-moi : frederic.peuriere@lfcl.pt
🔎 Exercices sur des thèmes similaires
-
Asie 2025 – jour 1 – exercice 3
dictionnaires, sécurisation des communications, programmation. — Difficulté : 🔥🔥🔥🔥🔥 -
Centres étrangers 2026 – jour 1 – exercice 2
sécurisation des communications, programmation. — Difficulté : 🔥🔥🔥🔥🔥 -
Métropole 2025 – jour 2 – exercice 3
programmation, sécurisation des communications , réseaux — Difficulté : 🔥🔥🔥🔥🔥 -
Nouvelle Caldédonie 2023 – jour 2 – exercice 2
programmation Python, récursivité — Difficulté : 🔥🔥🔥🔥🔥 -
Asie 2024 – jour 1 – exercice 1
programmation, POO, algorithmique — Difficulté : 🔥🔥🔥🔥🔥 -
Nouvelle Caldédonie 2023 – jour 1 – exercice 2
programmation, codage binaire — Difficulté : 🔥🔥🔥🔥🔥