Exercice 3 - Mise au point des programmes · Bac Numérique et Sciences Informatiques Polynésie 2025 (jour 1)
Thème : Mise au point des programmes : bugs, assertions et tests · Tiré du sujet Jour 1 (2025)
Énoncé
Partie C
Dans cette partie, on s'intéresse à la sécurité du gestionnaire de mots de passe d'Alice. Alice utilise un système d'exploitation multi-utilisateurs basé sur Linux et elle a les droits de lecture, d'écriture et d'exécution dans son répertoire personnel /home.
La base de données est stockée dans un fichier gestionnaire.db. Alice décide de chiffrer ce fichier. Elle crée un fichier chiffrement.py dans lequel elle écrit le code d'une fonction Python chiffrement dont la documentation est donnée ci-après.
def chiffrement(f_source, f_dest, f_cle):
'''Crée un fichier f_dest contenant les données
du fichier f_source chiffrées selon la clé
contenue dans le fichier f_cle.
f_source (str): chemin vers le fichier à chiffrer
f_dest (str): chemin vers le fichier chiffré
f_cle (str): chemin vers le fichier contenant la clé
''' On donne l'arborescence de fichiers utilisée par Alice sur la Figure 2.
Alice ouvre un interpréteur Python dans le répertoire Documents, qui est ainsi le répertoire courant (ou répertoire de travail) et exécute le contenu du fichier chiffrement.py.
L'algorithme de chiffrement consiste à appliquer l'opération OU-exclusif bit à bit entre le fichier source et le fichier contenant la clé de chiffrement.
Le premier bit du fichier chiffré est le résultat du OU-exclusif entre le premier bit du fichier source et le premier bit du fichier clé. De même, le deuxième bit est obtenu par le OU-exclusif entre les deuxièmes bits de ces deux fichiers et ainsi de suite.
On suppose, pour simplifier, que le fichier contenant la clé est de la même taille que le fichier source, qui est donc aussi la taille du fichier chiffré.
On rappelle ci-après la table de vérité du OU-exclusif, noté XOR.
Table de vérité du XOR a · b · a XOR b
0 · 0 · 0
0 · 1 · 1
1 · 0 · 1
1 · 1 · 0
On rappelle que l'hexadécimal correspond à l'écriture des entiers dans la base 16. Les chiffres de cette base sont notés 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.
Partie D
On donne ci-dessous quatre bonnes pratiques proposées par le gouvernement en matière de gestion des mots de passe.
P1: Utilisez un mot de passe différent pour chaque accès (messagerie, banque en ligne, comptes de réseaux sociaux, etc.): en cas de compromission de l'un de vos comptes, cela évitera l'effet boule de neige.
P2: Créez un mot de passe suffisamment long, complexe et inattendu, de 8 caractères minimum, contenant des minuscules, des majuscules, des chiffres et des caractères spéciaux.
P3: Ne communiquez jamais votre mot de passe à un tiers: aucune organisation ou personne de confiance ne vous demandera de lui communiquer votre mot de passe.
P4: Utilisez un gestionnaire de mots de passe: pas simple de retenir tous ses codes de connexion ! Heureusement des outils de type « coffres forts de mots de passe » existent. Ces derniers mémorisent tous vos mots de passe et vous permettent d'en générer de manière aléatoire.
Source: d'après https://cyber.gouv.fr/bonnes-pratiques-protegez-vous
Exercice 3 — Partie A: Création de mots de passe
Pour simplifier la gestion de ses mots de passe, Alice décide de créer un gestionnaire de mots de passe regroupant les informations de connexion de chaque site qu'elle utilise. Dans cette partie, on s'intéresse à la création des mots de passe d'Alice. On s'aidera de la table ASCII ci-dessous donnant le code ASCII en décimal et en hexadécimal des différents caractères utilisés (lettres minuscules, lettres majuscules et les caractères spéciaux encadrés).
Alice souhaite créer une fonction Python gen_mdp lui permettant de créer aléatoirement un mot de passe. Cette fonction:
prend en paramètres:
longueur (de type int): le nombre de caractères du mot de passe;
cont_min (de type bool): un booléen indiquant si le mot de passe peut contenir des minuscules ( True) ou non ( False);
cont_maj (de type bool): un booléen indiquant si le mot de passe peut contenir des majuscules ( True) ou non ( False);
cont_spe (de type bool): un booléen indiquant si le mot de passe peut contenir des caractères spéciaux ( True) ou non ( False);
et renvoie un mot de passe (de type str) respectant les conditions définies par les paramètres.
On donne ci-dessous le code de la fonction gen_mdp qui sera à compléter au fur et à mesure des questions:
1 from random import randint
2
3 def gen_mdp(longueur, cont_min, cont_maj, cont_spe):
4 # Pour qu'un mot de passe soit non vide, il doit
5 # pouvoir contenir des minuscules ou des majuscules
6 # ou des caractères spéciaux.
7 assert (cont_min or cont_maj or cont_spe)
8 minuscules = [chr(i) for i in...]
9 majuscules = [...]
10 caracteres_speciaux =... +...
11 jeu_caracteres = []
12 if cont_min:
13...
14...
15...
16...
17...
18 mot_de_passe = ''
19 n = len(jeu_caracteres)
20 for i in range(longueur):
21 mot_de_passe =...
22 return mot_de_passe
On rappelle que l'opérateur + permet en Python d'additionner deux éléments de type int, mais aussi de concaténer deux éléments de type list, ou encore deux éléments de type str.
On rappelle également que chr(i) renvoie la chaîne représentant un caractère dont le code ASCII est le nombre entier i (ex.: chr(97) renvoie 'a', chr(33) renvoie '!').
1.
Alice s'inscrit sur un nouveau site lui demandant de créer un mot de passe de 8 caractères minimum, composé uniquement de majuscules et de minuscules. Écrire un appel à la fonction gen_mdp qui permet de répondre aux exigences de ce site.
2.
On admet que les caractères spéciaux sont uniquement ceux encadrés à la Figure 1. Compléter les lignes 8 à 10 du code de la fonction gen_mdp permettant d'initialiser les trois variables minuscules, majuscules et caracteres_speciaux en utilisant obligatoirement la syntaxe de tableaux par compréhension.
3.
La variable jeu_caracteres est une liste contenant tous les caractères autorisés pour fabriquer un nouveau mot de passe. Compléter la ligne 13 et écrire les autres lignes de code (lignes 13 à 17) afin de construire jeu_caracteres.
4.
La documentation de la fonction randint indique que randint(a, b) renvoie un entier aléatoire compris entre les entiers a et b incluant les deux extrémités a et b. Compléter la ligne 21 du code de la fonction gen_mdp.
5.
Un site demande de créer un mot de passe possédant obligatoirement au moins 12 caractères, au moins un caractère spécial et au moins une lettre minuscule. Expliquer en quoi le code de la fonction gen_mdp peut renvoyer un mot de passe qui ne répond pas aux exigences du site.

Corrigé
Corrigé proposé par AprenAI (non officiel)
1. Écrire un appel à la fonction gen_mdp qui permet de répondre aux exigences de ce site (au moins 8 caractères, majuscules et minuscules uniquement).
Réponse : ```python gen_mdp(8, True, True, False) ```
2. Ligne 8 : initialisation de la variable minuscules par compréhension.
Réponse : ```python [chr(i) for i in range(97, 123)] ```
2. Ligne 9 : initialisation de la variable majuscules par compréhension.
Réponse : ```python [chr(i) for i in range(65, 91)] ```
2. Ligne 10 : initialisation de la variable caracteres_speciaux par compréhension.
Réponse : ```python [chr(i) for i in range(33, 48)] + [chr(i) for i in range(58, 65)] ```
Les réponses des 3 questions restantes et l’explication pas à pas sont réservées aux membres Premium. Premium
Résous-le ici : correction automatique, indices et corrigé détaillé.
Exercice 3 - Partie C · Polynésie 2024 (jour 2) ›