Chiffres monoalphabétiques

Skip to content

Ceci est un texte traduit automatiquement qui peut contenir des erreurs !

Om les tâches de cryptographie

Ces tâches sont structurées un peu différemment des autres tâches sur Piggy, je me demande ce que vous préférez ! 😎

Il y aura d’abord pas mal d’informations sur les thèmes, puis quelques tâches par la suite !

Les « niveaux » dans cette tâche ne sont pas tout à fait comme les niveaux précédents, ici les choses sont davantage divisées en thèmes.

Aller directement aux exercices

Qu’est-ce qu’un “Cipher” ?

Avez-vous déjà eu envie d’écrire un message secret à un ami, de sorte que personne d’autre ne puisse le comprendre ? Alors, vous avez besoin d’un Cipher, ou chiffrage en norvégien ! Un chiffrage est simplement une méthode qui transforme le texte ordinaire en “code” en remplaçant les caractères (souvent des lettres) par d’autres caractères. Le résultat ressemble à du charabia pour ceux qui ne connaissent pas le fonctionnement du code. L’idée est que seules les personnes qui connaissent la clé (la règle pour remplacer les lettres) peuvent rendre le code compréhensible à nouveau. En d’autres termes : les chiffrements rendent possibles les messages secrets, qu’il s’agisse des jeux d’enfance avec un langage secret ou de vrais espions envoyant des messages cryptés. 😄

Visste du?

Le mot « chiffrer » provient en fait d’un mot arabe : le mot sifr, qui signifie « zéro ». Peut-être parce que le code secret ressemblait à rien (aucun sens !) lorsque les gens ne pouvaient pas le résoudre !

Il existe de nombreux types de chiffrements – certains utilisent des chiffres, d’autres des symboles, et le chiffrement informatique moderne utilise des algorithmes très complexes. Ces algorithmes complexes nécessitent des mathématiques très complexes, alors regardons d’abord quelques algorithmes plus simples !

Chiffres Monoalphabétiques

Voyons maintenant quelques-unes des méthodes de codage les plus simples (et les plus anciennes) qui existent : les chiffres monoalphabétiques.

Monoalphabétique peut sembler un mot difficile, mais nous pouvons le décomposer : mono signifie “un”, et alphabétique concerne l’alphabet.

Ainsi, les chiffres monoalphabétiques sont des codes dans lesquels on utilise un seul “alphabet de chiffrement” pour l’ensemble du message. Cela signifie que chaque lettre du texte original est toujours remplacée par la même lettre tout au long du message chiffré.

Par exemple, si vous avez décidé que A doit être remplacé par X, alors tous les A dans le texte seront transformés en X.

Chiffre de César

L’exemple classique d’un chiffre monoalphabétique est le chiffre de César (nommé d’après Jules César). Il s’agit essentiellement d’une règle consistant à “décaler” toutes les lettres d’un certain nombre de positions dans l’alphabet. On dit que César lui-même utilisait un décalage de 3 lettres dans ses messages secrets. Cela fonctionne de telle manière que A devient D, B devient E, C devient F, et ainsi de suite dans l’alphabet. (Lorsque l’on dépasse Z, on recommence à A.) Un message comme ABC deviendrait donc DEF si nous utilisons la méthode de César.

Personne ne s’attend à un message en chiffrement de César ?

Ceasar Cipher Meme

Comment fonctionne le chiffrement de César en pratique :

  • Choisissez une clé : Déterminez un nombre secret (par exemple 3) qui indique de combien de places vous devez décaler chaque lettre.
  • Remplacez chaque lettre : Pour chaque lettre du message original, trouvez la lettre qui se trouve autant de places après elle dans l’alphabet (pour une clé de 3, A devient D, B devient E, etc. – n’oubliez pas de revenir à A après Z si nécessaire). Vous pouvez également inclure Æ, Ø et Å, mais cela devient un peu plus compliqué.
  • Message chiffré : Remplacez les lettres et écrivez le nouveau message avec les lettres « décalées ». Et voilà – vous avez un texte illisible et secret que seuls ceux qui connaissent la clé peuvent comprendre !
  • Pour déchiffrer (c’est-à-dire le remettre sous forme de texte lisible), il suffit de faire le décalage inverse. Si vous connaissez la clé (par exemple 3), il est tout aussi facile de lire le message en décalant les lettres de 3 places en arrière dans l’alphabet.

Sécurité ?

Ces codes ne sont pas très sûrs à long terme. Étant donné que le schéma (la substitution) est fixe, une personne avec suffisamment de patience ou quelques astuces intelligentes peut facilement révéler le secret. Par exemple, il n’y a que quelques décalages possibles dans le chiffrement de César, autant que l’alphabet, donc n’importe qui peut essayer tous jusqu’à ce que le message ait un sens – ou utiliser les fréquences des lettres pour deviner. En d’autres termes, peut-être ne pas utiliser le chiffrement de César pour des notes de journal super secrètes ou des secrets d’État 😉.

Les chiffres monoalphabétiques sont un excellent moyen d’apprendre le principe derrière le chiffrement. Ils sont simples et montrent comment nous pouvons utiliser une règle simple (une clé) pour transformer un texte compréhensible en quelque chose de mystérieux et incompréhensible – et vice versa. Alors, la prochaine fois que vous voudrez envoyer un message secret à un ami, vous pouvez utiliser le chiffre de César ! Peut-être pourriez-vous créer votre propre variante de l’alphabet secret de César ? 🔐✨


Tâches

Langages de programmation ?

Comme précédemment, n’hésitez pas à utiliser le langage de programmation que vous souhaitez ! Les exemples ici seront en Python.

Medium Exercice 1.1 - Chiffre de César - Cryptage

Maintenant, nous allons réellement écrire du code ! Nous allons commencer simplement en créant le cryptage, basé sur la théorie, cela devrait être assez simple.

Implémentez le cryptage avec le Chiffre de César en utilisant une fonction qui prend en entrée un texte et un nombre qui est la “clé”, c’est-à-dire de combien l’alphabet doit être tourné.

Conseils pour la méthode.
  1. Créez une fonction nommée caesar qui prend en entrée le texte à chiffrer et un “décalage”, c’est-à-dire, de combien de positions dans l’alphabet le texte doit être décalé.
  2. Parcourez le texte lettre par lettre.
  3. Nous ne voulons pas “décaler” d’autres caractères que les lettres : découvrez comment vérifier si un caractère dans le texte est une lettre.
  4. Nous devons “faire pivoter” la lettre de n positions, c’est-à-dire que nous devons ajouter la rotation : découvrez comment convertir le texte en nombres afin de pouvoir ajouter le décalage. Indice : la fonction ord().
  5. N’oubliez pas ! Vous obtiendrez différentes valeurs en fonction de si vous avez des lettres minuscules ou majuscules. Référez-vous au Tableau ASCII.
  6. Après avoir une valeur, il est aussi simple que d’ajouter la valeur n. Mais que se passe-t-il si vous êtes à la fin de l’alphabet ? Nous n’obtenons que des bêtises après la lettre Z. Comment cela peut-il être corrigé ? Cela demande un peu de réflexion.
Corriger le chiffrement.

Pour corriger complètement le chiffrement, il faut un peu de réflexion.

  • La première étape à considérer est l’utilisation de l’opérateur modulo, %.
  • Puisque l’alphabet (en anglais) se compose de 26 lettres, nous pouvons prendre le modulo 26.
  • Mais cela ne fonctionne pas tout à fait, voyez-vous pourquoi ?
  • Essayez d’afficher la valeur d’un caractère avec ord(), qu’obtenez-vous ?
  • Pour a, vous obtenez 97. Si vous prenez le modulo 26 avec cela, vous obtenez 19. N’oubliez pas que le modulo donnera toujours une réponse entre 0 et le nombre.
  • Cela peut être corrigé en stockant la valeur de départ des lettres majuscules et minuscules, en soustrayant celle-ci de la lettre, puis en prenant le modulo. Cela devient : (ord(lettre) - ord('a')) % 26
  • Pour récupérer la bonne lettre, il suffit d’ajouter la valeur de départ à nouveau.
  1. Après tout cela, vous pouvez enfin reconvertir le nombre en une lettre. Vous pouvez utiliser la fonction chr() ici.
  2. Maintenant, vous pouvez enfin ajouter la lettre à un résultat et renvoyer le texte chiffré !

Løsning:
def caesar_cipher(text, shift):
    result = ""
    for char in text:
        if char.isalpha():
        # Déterminez le point de départ en fonction des majuscules et des minuscules
        start = ord('A') if char.isupper() else ord('a')
        # Le calcul de décalage difficile
        result += chr((ord(char) - start + shift) % 26 + start)
    else:
        result += char
    return result

Easy Exercice 1.2 - Déchiffrement du Chiffre de César

Le déchiffrement consiste simplement à effectuer le calcul inverse de l’encryption. On soustrait le décalage au lieu de l’ajouter.

Conseils sur la méthode à suivre.

Utilisez la fonction que vous avez créée dans l’exercice 1 pour cela. Prenez simplement la même fonction, mais en sens inverse. Vous pouvez le faire en décalant en utilisant 26 - shift.

Løsning:
def caesar_decrypt(text, shift):
    return caesar_cipher(text, 26 - shift)

Solution :

def caesar_decrypt(text, shift):
    return caesar_cipher(text, 26 - shift)

Autres Chiffres Monoalphabétiques (ex. Atbash)

Il existe d’autres chiffres monoalphabétiques aussi ! L’un des plus simples est celui qui s’appelle le Chiffre “Atbash”.

Comment fonctionne Atbash ?

C’est très simple, au lieu d’une rotation, les lettres sont mappées à l’alphabet inverse. Voici un tableau montrant le mappage :

a b c d e f g h i j k l m n o p q r s t u v w x y z
z y x w v u t s r q p o n m l k j i h g f e d c b a

Medium Exercice 1.3 - Chiffrement et Déchiffrement d’Atbash

Le bon côté d’Atbash est que, comme le chiffrement est une transformation un à un, il fonctionne directement en sens inverse. Autrement dit, si vous avez créé le chiffrement, vous avez également, automatiquement créé le déchiffrement.

Comment cela peut-il être fait en pratique ?

Vous pouvez soit soustraire la lettre par rapport à Z, soit créer une table de “recherche”. C’est-à-dire, une table ou un dictionnaire qui contient toutes les lettres de a à z et ce qu’elles doivent devenir. Cela peut être une bonne solution si vous souhaitez créer un autre type de cryptage.

Implémentation de la table de correspondance.
letters = {
    'a': 'z'
    'b': 'y'
    'c': 'x'
    'd': 'w'
    # ... ajoutez le reste des lettres vers le bas
}

À l’aide de ce tableau, vous pouvez parcourir lettre par lettre, puis extraire la valeur par lettre du tableau de correspondance, puis l’afficher. Que devez-vous faire pour les majuscules et les minuscules ?


Partie 2 - Cryptoanalyse des Chiffres Monoalphabétiques

Dans cette partie, vous devez essayer de créer un algorithme pour “casser” un chiffrement de César, c’est-à-dire prendre un texte chiffré, puis en extraire le texte original sans connaître la clé.

Cela peut être fait manuellement dans une certaine mesure, ou vous pouvez essayer d’utiliser une simple “cryptanalyse”. Il s’agit d’un concept que nous examinerons plus en profondeur ultérieurement, mais pour l’instant, nous allons simplement examiner l’une des méthodes les plus simples : l’analyse de fréquence (frequency analysis). Vous pouvez en savoir plus sur ce concept ici : Frequency Analysis ou ici Wikipedia - frequency analysis.

Cette méthode peut être utilisée dans plus que de simples chiffrements de César, elle peut être utilisée dans des algorithmes plus complexes également, mais le chiffrement de César est si simple que l’analyse de fréquence est triviale.

Comment fonctionne l’analyse de fréquence ?

L’analyse de fréquence, comme son nom l’indique, est une manière de vérifier la fréquence des lettres dans un texte. Pourquoi cela peut-il être utile ? Imaginez que vous ayez un long texte, imaginons un texte anglais, extrait de Wikipedia - frequency analysis :

In cryptanalysis, frequency analysis is the study of the frequency of letters or groups of letters in a ciphertext. The method is used as an aid to breaking classical ciphers.

Frequency analysis is based on the fact that, in any given stretch of written language, certain letters and combinations of letters occur with varying frequencies. Moreover, there is a characteristic distribution of letters that is roughly the same for almost all samples of that language. For instance, given a section of English language, E, T, A and O are the most common, while Z, Q, X and J are rare. Likewise, TH, ER, ON, and AN are the most common pairs of letters termed bigrams or digraphs), and SS, EE, TT, and FF are the most common repeats. The nonsense phrase ETAOIN SHRDLU represents the 12 most frequent letters in typical English language text.

In some ciphers, such properties of the natural language plaintext are preserved in the ciphertext, and these patterns have the potential to be exploited in a ciphertext-only attack.

Si nous prenons ce texte et que nous le transformons avec le chiffrement de César (et que nous supprimons les virgules, les espaces et autres caractères spéciaux), nous obtenons le texte chiffré suivant :

xcrgneipcpanhxhugtfjtcrnpcpanhxhxhiwthijsnduiwtugtfjtcrnduatiitghdgvgdjehduatiitghxcprxewtgitmiiwtbtiwdsxhjhtsphpcpxsidqgtpzxcvraphhxrparxewtghugtfjtcrnpcpanhxhxhqphtsdciwtupriiwpixcpcnvxktchigtirwdulgxiitcapcvjpvtrtgipxcatiitghpcsrdbqxcpixdchduatiitghdrrjglxiwkpgnxcvugtfjtcrxthbdgtdktgiwtgtxhprwpgpritgxhixrsxhigxqjixdcduatiitghiwpixhgdjvwaniwthpbtudgpabdhipaahpbeathduiwpiapcvjpvtudgxchipcrtvxktcphtrixdcdutcvaxhwapcvjpvttippcsdpgtiwtbdhirdbbdclwxatofmpcsypgtgpgtaxztlxhtiwtgdcpcspcpgtiwtbdhirdbbdcepxghduatiitghitgbtsqxvgpbhdgsxvgpewhpcshhttiipcsuupgtiwtbdhirdbbdcgtetpihiwtcdchtchtewgphttipdxchwgsajgtegthtcihiwtbdhiugtfjtciatiitghxcinexrpatcvaxhwapcvjpvtitmixchdbtrxewtghhjrwegdetgixthduiwtcpijgpaapcvjpvteapxcitmipgtegthtgktsxciwtrxewtgitmipcsiwthtepiitgchwpktiwteditcixpaidqttmeadxitsxcprxewtgitmidcanpiiprz

Ce texte semble impossible à “craquer”, mais grâce à l‘“analyse de fréquence”, ce n’est pas seulement possible, mais facile.

Regardez la figure suivante :
English frequency distribution

Il s’agit d’une figure montrant la distribution des lettres en anglais. Nous pouvons voir que la lettre E est la lettre la plus fréquente, suivie de T, A et O.

Cela peut être transformé en un tableau et ensuite utilisé pour compter et analyser un texte chiffré donné afin de le “craquer”. Dans les exercices ci-dessous, vous devrez créer un programme capable de “craquer” le chiffrement de César par lui-même. Il est vrai que le chiffrement de César est si simple que vous pouvez simplement vérifier manuellement les 26 possibilités, mais ici, nous allons trouver la solution, entièrement automatiquement.

Easy Exercice 2.1 - Créer un tableau de fréquences

Dans un fichier python, créez un tableau de fréquences des lettres de la langue anglaise. Vous pouvez essayer de le trouver vous-même, mais si vous n’en avez pas envie, nous comprenons !

Si vous souhaitez absolument le trouver vous-même, vous pouvez faire comme dans l’Exercice 2.2, mais sur un très grand texte.

English Letter Frequency (Svaret)
english_letter_frequency = {
    'E': 12.70, 
    'T': 9.06, 
    'A': 8.17, 
    'O': 7.51, 
    'I': 6.97, 
    'N': 6.75, 
    'S': 6.33, 
    'H': 6.09, 
    'R': 5.99, 
    'D': 4.25, 
    'L': 4.03, 
    'C': 2.78, 
    'U': 2.76, 
    'M': 2.41, 
    'W': 2.36, 
    'F': 2.23, 
    'G': 2.02, 
    'Y': 1.97, 
    'P': 1.93, 
    'B': 1.29, 
    'V': 0.98, 
    'K': 0.77, 
    'J': 0.15, 
    'X': 0.15, 
    'Q': 0.10, 
    'Z': 0.07
}

Medium Exercice 2.2 - Compter la fréquence des lettres dans un texte

Maintenant, nous allons créer un algorithme qui trouvera la fréquence des lettres dans un texte donné.

Tips til framgangsmåte
  1. Commencez par une fonction qui prend en entrée un texte (peu importe lequel).
  2. Dans la fonction, créez un “dictionnaire” (Dictionnaires Python), avec des entrées pour chaque lettre de l’alphabet, initialisées à 0. ({'A' = 0, 'B' = 0, 'C' = 0, ..., 'Z' = 0})
  3. Parcourez tout le texte et comptez chaque lettre (incrémentez de 1 l’entrée correspondante dans le dictionnaire). Vous devriez probablement ignorer les caractères qui ne sont pas des lettres, et tenez également compte des majuscules et des minuscules.
  4. Gardez une trace du nombre total de lettres comptées.
  5. Une fois que vous avez fini de compter, divisez / chaque valeur du tableau par la longueur du texte, puis multipliez par 100, cela vous donnera une fréquence en pourcentage. (Vous pouvez bien sûr également laisser votre tableau avec des valeurs entre 0 et 1).
  6. Vous devriez maintenant avoir un tableau de fréquences pour le texte.

Medium Exercice 2.3 - Comparer la fréquence d’un texte avec la fréquence réelle

Une fois que vous avez trouvé la fréquence de toutes les lettres dans le texte, vous pouvez créer une fonction qui trouve la “distance”. Hein ? Qu’est-ce que cela signifie ?

Vous pouvez imaginer que la fréquence de, par exemple, E dans le texte sera un nombre. Vous pouvez trouver la “distance” qu’elle a avec la fréquence réelle, qui est 12.70. Exemple : La fréquence est 9.63, quelle est la distance ? La distance sera la valeur absolue (les nombres négatifs deviennent positifs) entre ces deux valeurs : \(12.70 - 9.63 = 3.07\).

Créez une fonction qui parcourt chaque lettre et trouve la distance. Additionnez ensuite toutes les distances pour obtenir une “distance” totale.

Fonction mathématique ?

Si vous vous demandez à quoi ressemble la fonction mathématique pour celle-ci, elle est la suivante :

\(\sum_{n=0}^{N} \lvert a - b\rvert\)

Tips til framgangsmåte
  1. Utilisez une boucle for pour parcourir l’intégralité du tableau de fréquences.
  2. Pour chaque lettre du tableau de fréquences, trouvez la valeur absolue par rapport à la fréquence réelle. Utilisez la fonction abs() de Python pour cela.
  3. Additionnez toutes les valeurs, et vous obtiendrez un résultat final.

Hard Exercice 2.4 - “Casser” le Chiffre de César

Maintenant, nous allons enfin assembler tout ce que nous avons fait jusqu’à présent ! Nous allons maintenant “casser” un chiffrement de César.

Créez un programme qui “casse” un chiffrement de César ! Sans intervention de l’utilisateur, vous devez pouvoir entrer un texte chiffré et récupérer le texte déchiffré sans avoir besoin d’une clé.

Test data

Voici quelques données de test que vous pouvez utiliser, que pensez-vous de celles-ci ?

Test-data
cqrbvnbbjpnrbjenahbnlancxwnqxynoduuhhxdjanjkuncxmnlxmnrclxvyuncnuhjwmqnanjanbxvnfxamboaxvxdaojexarcnsnmrqnuuxcqnanrcbxenajwjtrwrqjencqnqrpqpaxdwmhxdfnanarpqccqnwnpxcrjcrxwbfnanbqxac
lsaizivxlmwqiwwekimwuymxiwlsvxwsmxqmklxrsxasvoewibtigxihlsaizivmjmxhsiwksshnsf
bmtxymjwjsfdfsxbjwrjxyfsifsizsktqidtzwxjqkqtslqnajymjpnslgfwsfwitmjdtzhtrjrtxyhfwjkzqqdzutsdtzwmtzwynxstbxywzhpybjqajljyymjjytgjikwfshnxhtktwymnxwjqnjkrzhmymfspxynxgnyyjwhtqifsinfrxnhpfymjfwymfajdtzmfivznjylzfwistyfrtzxjxynwwnslbjqqlttisnlmynkdtzitrjjymtwfyntfsirfwhjqqzxymjwnafqxtkrdbfyhmgniymjrrfpjmfxyj
zwkyvivrivrepzuzfkjzekyviffdnzcckyvpgcvrjvjkreulgjrzukyvjritrjkztkvrtyvirwkvircfexjzcvetvfevwivjydreifjvkfyzjwvvkefnkyvedzjkvinypufpfltfejzuvipflijvcwrezuzfkzehlzivukyvkvrtyvinzkyrjevvinvccrtklrccpzufekjrzukyvjkluvekslkzyrkvkfjvvpfljkreuzexlgkyvivrccsppflijvcw
uwwilxchaniuffehiqhfuqmizupcuncihnbylycmhiqusuvyymbiofxvyuvfynizfscnmqchamulyniimguffniayncnmzunfcnnfyvixsizznbyaliohxnbyvyyizwiolmyzfcymuhsqusvywuomyvyymxihnwulyqbunboguhmnbchecmcgjimmcvfysyffiqvfuwesyffiqvfuwesyffiqvfuwesyffiqvfuweiibvfuweuhxsyffiqfynmmbueycnojufcnnfyvullsvlyuezumncmlyuxswigcha

Conseils sur la méthode
  1. Commencez par créer une fonction qui prend en entrée du texte.
  2. Utilisez la fonction de déchiffrement du chiffrement de César avec une rotation N sur le texte, N commençant à 0.
  3. Créez un tableau de fréquences du résultat
  4. Déterminez la distance du résultat par rapport au tableau de fréquences réel
  5. Soit : a) gardez la trace de la distance dans une liste, ou b) gardez la trace de la valeur minimale et de la rotation (cela devient la clé)
  6. Augmentez la rotation de 1 et répétez les étapes 2 à 6 jusqu’à ce que N atteigne 26 (rotation complète).
  7. Retournez le texte déchiffré, c’est-à-dire que la distance minimale est la bonne clé.