Exercice 2 Centres étrangers – Bac NSI 2026 – Jour 1

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

mots clés: sécurisation des communications, programmation.

🔎 Voir les exercices similaires ↓

💻 Test de la fonction dechiffrer : aller à la console

📘 Sujet PDF

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

2

3

4

5

6

1

Q

7

A

X

2

J

2

9

E

H

0

R

M

3

L

Z

4

W

D

O

4

6

V

N

B

8

K

5

P

Y

1

S

T

F

6

G

C

3

I

U

5

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

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

2

3

4

5

6

1

2

0

4

8

A

L

2

G

O

R

I

T

H

3

M

E

S

B

C

D

4

F

J

K

N

P

Q

5

U

V

W

X

Y

Z

6

1

3

5

6

7

9

  1. Chiffrer le message BAC avec la clé SECURITY1024.

  2. 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
  1. Quel sera le résultat de l’appel generer_ordre('AXU7') ?

  2. 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
  1. 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.

  2. 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) ... }
  1. Écrire la fonction generer_dico prenant en paramètre la clé et renvoyant le dictionnaire associé.

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

  1. Expliquer la différence entre un algorithme de chiffrement symétrique et un algorithme de chiffrement asymétrique.

▶✅ Correction (cliquer pour afficher) PDF

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

💻 Console Python (cliquer pour afficher)

🔎 Exercices sur des thèmes similaires