Exercice 2 Centres étrangers – Bac NSI 2026 – Jour 1
mots clés: sécurisation des communications, programmation.
🔎 Voir les exercices similaires ↓
💻 Test de la fonction dechiffrer :
aller à la console
Centres étrangers – Bac NSI 2026 – Jour 1 Énoncé de l'exercice 2
Cet exercice porte sur la sécurisation des communications et la programmation.
Le chiffrement de Polybe est un algorithme de chiffrement par substitution qui utilise un tableau dans lequel sont réparties les 26 lettres de l’alphabet et les 10 chiffres.
Exemple de tableau :
| 1 |
|
|
|
5 |
|
|
|---|---|---|---|---|---|---|
|
Q |
|
|
|
2 |
|
|
9 |
|
|
|
R |
|
|
L |
|
|
|
D |
|
|
6 |
|
|
|
8 |
|
|
P |
|
|
|
T |
|
|
G |
|
|
|
U |
|
Chaque caractère est alors associé à un couple d’entiers construit à partir de sa position dans le tableau. Dans l’exemple ci-dessus, la lettre N située ligne 4, colonne 3 est associée au couple d’entier (4,3).
Avec la répartition donnée dans le tableau ci-dessus, le message NSI sera chiffré sous la forme (4,3) (5,4) (6,4).
Déchiffrer le message (6,2) (3,6) (3,5) (2,2) en utilisant la grille ci-dessus.
Une façon simple de construire un tableau consiste à choisir un mot qu’on appellera clé, à écrire cette clé dans le tableau puis à compléter avec les autres lettres dans l’ordre alphabétique, et enfin avec les chiffres de 0 à 9 par ordre croissant. Dans tout l’exercice, la clé utilisée sera toujours composée de lettres différentes, sans aucune répétition.
Exemple : Avec la clé 2048ALGORITHMES, l’ordre d’insertion des caractères dans le tableau est 2048ALGORITHMESBCDFJKNPQUVWXYZ135679, la grille obtenue est donc :
| 1 |
|
|
|
5 |
|
|
|---|---|---|---|---|---|---|
|
2 |
|
|
|
A |
|
|
G |
|
|
|
T |
|
|
M |
|
|
|
C |
|
|
F |
|
|
|
P |
|
|
U |
|
|
|
Y |
|
|
1 |
|
|
|
7 |
|
Chiffrer le message BAC avec la clé SECURITY1024.
Expliquer pourquoi le chiffrement de Polybe peut être qualifié de symétrique.
Le code de la fonction generer_ordre est fourni ci-dessous :
def generer_ordre(cle):
ordre_insertion = cle
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
for lettre in alphabet:
if lettre not in ordre_insertion:
ordre_insertion = ordre_insertion + lettre
return ordre_insertion
Quel sera le résultat de l’appel generer_ordre('AXU7') ?
Coder la fonction grille_vide(n) qui renvoie un tableau de n lignes constituées chacune de n chaînes de caractères vides. Par exemple, l’appel grille_vide(3) renvoie [['','',''],['','',''],['','','']].
Le code de la fonction generer_grille est fourni ci-dessous :
def generer_grille(cle):
ordre_insertion = generer_ordre(cle)
grille = grille_vide(6)
indice = 0
for i in range(...): # ligne 5
for j in range(...): # ligne 6
grille[i][j] = ... # ligne 7
indice = indice + 1
return grille
Recopier et compléter les lignes 5, 6 et 7 de la fonction generer_grille qui prend en paramètre la clé et renvoie un tableau représentant la grille.
Recopier et compléter la ligne 5 de la fonction dechiffrer qui prend en paramètres une clé et le message chiffré sous la forme d’un tableau de tuples puis renvoie le message déchiffré sous la forme d’une chaîne de caractères. Par exemple, comme NSI se chiffre en (4,4) (3,3) (2,4) avec la clé 2048ALGORITHMES, l’appel dechiffrer('2048ALGORITHMES',[(4,4),(3,3),(2,4)]) renvoie 'NSI'.
def dechiffrer(cle, message):
resultat = ''
grille = generer_grille(cle)
for t in message:
resultat = resultat + grille[...][...] # ligne 5
return resultat
On souhaite maintenant écrire une fonction chiffrer. Pour éviter d’avoir à parcourir la grille pour chaque lettre du message à chiffrer, on va construire un dictionnaire dont les clés sont les lettres de l’alphabet et les 10 chiffres et dont les valeurs sont les positions associées dans la grille sous forme de tuples.
Par exemple, le début du dictionnaire associé à la grille qui correspond à la clé
2048ALGORITHMES est :
{'2': (1, 1), '0': (1, 2), '4': (1, 3), '8': (1, 4), 'A': (1, 5) ... }
Écrire la fonction generer_dico prenant en paramètre la clé et renvoyant le dictionnaire associé.
Écrire la fonction chiffrer qui prend en paramètre la clé et le message puis renvoie le message chiffré sous forme de liste de tuples.
Alice souhaite envoyer des informations secrètes à Bob chaque jour. Pour cela, ils décident d’utiliser le chiffrement de Polybe et pour plus de sécurité, ils changeront de clé quotidiennement. Alice propose à Bob d’utiliser des méthodes de chiffrements asymétriques pour s’échanger la clé.
Expliquer la différence entre un algorithme de chiffrement symétrique et un algorithme de chiffrement asymétrique.
Centres étrangers – Bac NSI 2026 – Jour 1 Correction de l'exercice 2
1. Déchiffrer le message
Grille donnée :

(6,2) → C
(3,6) → O
(3,5) → D
(2,2) → E
Réponse : CODE
2. Chiffrer le message BAC avec la clé SECURITY1024
Ordre d'insertion :
SECURITY1024ABDFGHJKLMNOPQVWXZ356789
Grille obtenue :
| 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|
| 1 | S | E | C | U | R | I |
| 2 | T | Y | 1 | 0 | 2 | 4 |
| 3 | A | B | D | F | G | H |
| 4 | J | K | L | M | N | O |
| 5 | P | Q | V | W | X | Z |
| 6 | 3 | 5 | 6 | 7 | 8 | 9 |
Donc :
B → (3,2)
A → (3,1)
C → (1,3)
Réponse :
(3,2) (3,1) (1,3)
3. Pourquoi ce chiffrement est-il symétrique ?
Réponse :
Le chiffrement de Polybe est symétrique car la même clé est utilisée pour chiffrer et déchiffrer le message.
4. Résultat de l'appel generer_ordre('AXU7')
Les caractères déjà présents sont : AXU7
On ajoute ensuite les autres caractères de : ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
qui ne figurent pas encore dans la clé.
Réponse :
'AXU7BCDEFGHIJKLMNOPQRSTVWYZ012345689'
5. Fonction grille_vide
def grille_vide(n):
grille = []
for i in range(n):
ligne = []
for j in range(n):
ligne.append('')
grille.append(ligne)
return grille
6. Compléter la fonction generer_grille
def generer_grille(cle):
ordre_insertion = generer_ordre(cle)
grille = grille_vide(6)
indice = 0
for i in range(6): # ligne 5
for j in range(6): # ligne 6
grille[i][j] = ordre_insertion[indice] # ligne 7
indice = indice + 1
return grille
7. Compléter la fonction dechiffrer
def dechiffrer(cle, message):
resultat = ''
grille = generer_grille(cle)
for t in message:
resultat = resultat + grille[t[0]-1][t[1]-1] # ligne 5
return resultat
8. Fonction generer_dico
def generer_dico(cle):
grille = generer_grille(cle)
dico = {}
for i in range(6):
for j in range(6):
dico[grille[i][j]] = (i+1, j+1) # à partir de 1
return dico
9. Fonction chiffrer
def chiffrer(cle, message):
dico = generer_dico(cle)
resultat = []
for caractere in message:
resultat.append(dico[caractere])
return resultat
10. Différence entre chiffrement symétrique et asymétrique
Chiffrement symétrique
Une seule clé est utilisée.
Cette clé sert à la fois pour chiffrer et déchiffrer.
Chiffrement asymétrique
Deux clés différentes sont utilisées :
une clé publique ;
une clé privée.
Ce qui est chiffré avec l'une ne peut être déchiffré qu'avec l'autre.
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é : 🔥🔥🔥🔥🔥 -
Nouvelle Calédonie 2025 – jour 2 – exercice 1
sécurisation des communications, représentation des données, programmation — Difficulté : 🔥🔥🔥🔥🔥 -
Polynésie 2025 – jour 1 – exercice 3
SQL, systèmes d'exploitation, sécurisation des communications — Difficulté : 🔥🔥🔥🔥🔥 -
Métropole 2025 – jour 2 – exercice 3
programmation, sécurisation des communications , réseaux — Difficulté : 🔥🔥🔥🔥🔥