La cryptographie
But
Cette séquence de cryptographie vous propose de programmer (dans l’environnement Scratch)
le chiffrement de César (chiffrer/déchiffrer) et l’analyse fréquentielle (trouver les fréquences de chaque lettre dans
un texte et afficher ce résultat sous la forme d’un graphique).
Cette séquence permet une appropriation de tous
les concepts de programmation utiles au collège : séquence, boucle, test, variable (variables simples et tableaux),
fonction…


Vous allez devoir expliciter l’algorithme et lister les étapes qui vont structurer votre projet de programmation du chiffrement de César. Vous programmerez, dans l’environnement Scratch, une première fonction permettant de trouver la lettre correspondant à un rang dans l’alphabet.
On va commencer par le plus simple : le chiffrement de César. Dans un premier temps, faisons la liste des éléments qui seront nécessaires pour que le programme produise ce que l’on attend de lui :
- Chaque lettre figurant dans le message clair est remplacée par une lettre qui est décalée d’un certain nombre de rangs (la « clé ») dans l’alphabet.
- Le programme doit donc :
- Permettre à l’utilisateur de saisir le message à chiffrer (qui doit être enregistré dans une variable, nommée par exemple « message_clair »)
- Permettre à l’utilisateur de saisir la valeur de la clé (qui doit également être stockée dans une variable, nommée « clé »)
- Stocker l’alphabet dans une variable (que nous nommerons simplement « alphabet »)
- Chiffrer le message, et enregistrer résultat dans une nouvelle variable (nommée, par exemple « message_chiffré »), qui doit être affichée à l’écran.
Les étapes
Il s’agit maintenant de découper le projet (une tâche complexe) en plusieurs sous-projets (tâches plus élémentaires). À titre d’exemple, voici comment on peut « découper » un tel projet :
- Dans un premier temps, on va chercher à ne traiter qu’une seule lettre, et pas un message complet
- Pour savoir comment décaler une lettre d’un certain rang, on doit être capable de trouver quel est le rang d’une lettre donnée dans l’alphabet (par exemple, la lettre n° 3 est C) et, réciproquement, quelle est la lettre qui correspond à un rang donné (la lettre F occupe le rang n° 6). Le professeur conseille de réaliser une tâche après l’autre et de commencer par la tâche la plus facile : trouver la lettre qui correspond à un certain rang.
- On doit savoir décaler les lettres d’un certain rang mais, quand on dépasse 26 (lettre Z), on doit revenir à 1 (lettre A).
- Créer une variable "alphabet"
- Lui mettre toutes les lettres de l'alphabet dans l'ordre
- Demander le rang, puis afficher la lettre correspondante à ce rang (utiliser la fonction "lettre ___ de ____).
Étape 1 : obtenir la lettre d’un certain rang dans l’alphabet
Étape 2 : Introduction du bloc "fonction"
- Faire les exercices de cette fiche
- transformer votre programme créé à l'étape précédente pour introduire une fonction, appelée « Lettre_de_rang ». La variable associée à cette fonction est nommée « Var_lettre_ de_rang ».
- « Rang_de_lettre », qui est notre résultat final ;
- « Rang_actuel », qui sert à se repérer dans la boucle.
- 13 modulo 3 vaut 1, car 13 = 4 x 3 + 1 (en français : le reste de la division de 13 par 3 vaut 1)
- 1 modulo 26 vaut 1
- 26 modulo 26 vaut 0
- 27 modulo 26 vaut 1
- 28 modulo 26 vaut 2
- etc.
Étape 3 : obtenir le rang d'une certaine lettre
Trouver quel est le rang d’une lettre donnée nécessite de parcourir tout l’alphabet et de tester, pour chaque rang, si la lettre de ce rang est bien la lettre considérée. Il faut donc utiliser une boucle.
Ce programme nécessite la création de 2 variables :
Étape 4 : chiffrer une lettre
Au cours de cette étape, vous allez devoir utiliser les deux fonctions que vous avez définies
précédemment afin de trouver le rang d’une lettre, lui ajouter un certain nombre (la clé), et renvoyer la lettre correspondant à ce nouveau rang décalé.
La difficulté tient dans l’utilisation de la fonction « modulo ».
- La fonction modulo (n) renvoie une valeur qui correspond au reste de la division euclidienne d’un nombre par n.
Ainsi :
Étape 5 : chiffrer un message entier
Cette étape ne présente pas de difficulté majeure. Tout comme à l’étape 3, il faut introduire une boucle car on ne chiffre pas une seule lettre, mais toutes les lettres du message. Le programme introduit deux nouvelles variables : « Message_clair » (qui est le message que l’on veut chiffrer), et « Position_lettre », qui indique quelle lettre nous sommes en train de chiffrer dans ce message.
Le message chiffré est obtenu en regroupant les lettres chiffrées à chaque étape de la boucle.
Étape 6 : prendre en compte les espaces et la ponctuation
Modifier le programme pour qu’il ne chiffre pas les espaces ni les caractères de ponctuation, qui doivent être recopiés tels quels.
À ce stade, notre programme ne fonctionne pas si le message clair contient autre chose qu’une lettre
spécifiée dans notre alphabet simplifié (espace, signe de ponctuation…).
Pour résoudre le problème, il suffit de spécifier au programme de ne pas chiffrer les caractères qui
ne font pas partie de l’alphabet. On introduit une variable (nommée par exemple « lettre_dans_
alphabet »). Si cette variable vaut « oui », alors le programme fonctionne normalement (on chiffre la
lettre). Si cette variable vaut « non », le programme se contente de recopier le caractère non chiffré.
Étape 7 : gérer les caractères accentués
Créer une fonction qui remplace les caractères accentués du message clair par leur équivalent sans accent.
Modifier le programme principal de façon à ce qu’il chiffre le message sans accent.
Le programme, dans son état actuel, ne prend pas en compte les caractères accentués. Bien que cela ne soit pas indispensable, la classe peut décider de consacrer 20 minutes supplémentaires pour pallier ce défaut. On pourra par exemple remplacer tous les « à » et les « â » du message clair par des « a », etc. Ce travail nécessite d’imbriquer plusieurs tests les uns dans les autres ; ce qui ne présente pas de difficulté particulière et peut être réalisé en autonomie par les élèves. Cela se fait à travers une nouvelle fonction nommée « Message_clair_sans_accent ». Cette fonction recopie tous les caractères non accentués tels quels, mais remplace les caractères accentués par leurs équivalents sans accents.