diff --git a/Cryptographie/1_monoalphabetique.ipynb b/Cryptographie/1_monoalphabetique.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..24e6e16cdfa7d370607a8ed538d4b9ffec7c634a --- /dev/null +++ b/Cryptographie/1_monoalphabetique.ipynb @@ -0,0 +1 @@ +{"cells":[{"metadata":{},"cell_type":"markdown","source":"<div style=\"padding:20px;background-color:papayawhip;\" > \n<h3 style=\"color:chocolate\"> <i class=\"fa fa-info\" aria-hidden=\"true\"> </i> Remarque introductive <i class=\"fa fa-info\" aria-hidden=\"true\"></h3> \n<p> Ce fichier est fait pour être lu sur le site <a href=\"https://notebook.basthon.fr/\"><img src='https://notebook.basthon.fr/assets/efede5218c9087496f16.png' style=\"border: 0; display:inline; margin: 0 5px; height:30px\" alt=\"Basthon\"/></a>. <br>\n \nSi vous l'avez ouvert avec un autre programme, comme Jupyter notebook, vous riquez de rencontrer quelques bugs. <br>\nVeuillez cliquez sur <a href=\"https://notebook.basthon.fr/\">ce lien</a> et y charger ce fichier à l'aide du bouton \"Ouvrir\" <i class=\"fa fa-folder\" aria-hidden=\"true\"> </i>\n</p> </div> "},{"metadata":{},"cell_type":"markdown","source":"# Chiffrement symétrique - Le chiffrement monoalphabétique\n\nLe but de ce travail pratique est de déchiffrer un message qui a été chiffré avec un chiffrement monoalphabétique en adaptant un programme déjà créé.\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 1 </h3> \n\nLe programme suivant permet de déchiffrer un message codé selon le principe monoalphabétique, en connaissant la clé de chiffrement. \n\nLisez-le en essayant de le comprendre, puis testez-le."},{"metadata":{"trusted":true},"cell_type":"code","source":"# Texte à déchiffrer\ntexte_chiffre = \"\"\"WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\"\"\"\n\n# Alphabet MAJUSCULE uniquement pour simplifier\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Pour chaque lettre, correspond une lettre dans liste_alphabet\nliste_chiffree = \"SNRFIYAQXLKWBPUZCHVMOTGJDE\"\n\n# texte_dechiffree contiendra la chaine de caractère donc le texte déchiffré\ntexte_dechiffre = \"\"\n\n\n# Parcours caractère par caractère le fichier ouvert.\nfor lettre in texte_chiffre:\n\n # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n if lettre.isalpha(): \n # Recherche la position (index) de la lettre à décoder dans la liste_chiffree.\n index = liste_chiffree.index(lettre)\n \n # On utilise cet index pour trouver la lettre dans liste_alphabet.\n lettre_decodee = liste_alphabet[index]\n \n # On ajoute le caractère déchiffré à la suite du texte déjà déchiffré.\n texte_dechiffre = texte_dechiffre + lettre_decodee\n else:\n # la lettre n'est pas un caractère alphabétique mais peut-être une ponctuation\n texte_dechiffre = texte_dechiffre + lettre\n\n# On affiche le texte decodé\nprint(texte_chiffre)\nprint(texte_dechiffre)\n\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"On veut maintenant déchiffrer le message suivant `JI KXJIEOI IWIFEIJ TI OIK IKNVOIK XEYXEXK D'IYYFVXI` qui a été codé avec la clé `VMOTIYAQXLGJDESNRFKWBPUZCH`.\n\nReprenez le code précédent et adaptez-le pour décoder ce message."},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"tags":["breakpoint"]},"cell_type":"markdown","source":"#### Ctrl+enter pour continuer ..........."},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 2</h3> \n\nOn aimerait maintenant déchiffrer un message chiffré avec le chiffrement monoalhabétique, mais dont on ne connaît pas la clef.\n\n**Comment procéder pour trouver la clé ?**\nOn peut compter les occurrences (répétition) de chaque lettre dans le message chiffré et les comparer à celles de la langue française pour essayer de retrouver la correspondance.\n\nC'est ce que fait le code suivant. Lisez-le en essayant de le comprendre, puis testez-le.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Texte à déchiffrer\ntexte_chiffre = \"\"\"WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\"\"\"\n\n# Alphabet\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Liste des occurrences\nliste_occurrence = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n\n# Contiendra le texte déchifré\ntexte_dechiffre = \"\"\n\n# Parcours caractère par caractère le fichier\nfor lettre in texte_chiffre:\n \n # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n if lettre.isalpha():\n \n # Recherche la position (index) de la lettre (conversion en minuscule)\n # à décoder dans la liste_alphabet.\n index = liste_alphabet.index(lettre)\n \n # Incrémenter l'occurence de la lettre correspondante\n liste_occurrence[index] = liste_occurrence[index] + 1\n\n# Afficher les occurrences de chaque lettres\nfor i in range(26):\n print(liste_alphabet[i], \":\",liste_occurrence[i])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Vous avez maintenant intercepté le message suivant dont vous ne connaissez pas la clé : \n```\nPGY VGPNGDGY YITJMYYGZD MIYYA GZ NMPGIT PGY MIDTGY QMIPEAY WMT APY GZQMQGZD \nWEZDTG PGY QGTUMAZY BGY PIDDGY JTGYOIG FEITZMPAGTGY YEAD OI APY PGY TGJEIYYGZD \nBG PGIT JTEJTG DGTTADEATG YEAD OI APY GZNMVAYYGZD WGPIA BG PGITY GZZGUAY ETQGDETAX \nGDMAD WVGH PGY VGPNGDGY PG JTGUAGT JMT YM ZMAYYMZWG GD JMT YGY TAWVGYYGY YEIY PG \nWEZYIPMD BG U UGYYMPM GD BG U JAYEZ WGD VEUUG JEIYYG JMT P MURADAEZ WEZFITM MNGW \nPM ZERPGYYG GD GZQMQGM PGY VMRADMZDY M YETDAT BI JMCY MNGW DEIDGY PGITY LETWGY \nAP PGIT BAD OIG P GUJETDMZD JMT PG WEITMQG YIT DEIY PGY JGIJPGY BG PM QMIPG APY \nPM YEIUGDDTMAGZD MAYGUGZD DEID GZDAGTG M PGIT GUJATG AP GID B MIDMZD UEAZY BG \nJGAZG M PGY JGTYIMBGT OIG PGY VGPNGDGY YEZD BG DEIDGY JMTDY TGYYGTTGY JMT PM \nZMDITG BGY PAGIX B IZ WEDG JMT PG TVAZ LPGING DTGY PMTQG GD DTGY JTELEZB OIA \nYGJMTG PGIT DGTTADEATG BG PM QGTUMZAG B IZ MIDTG JMT PG FITM VMIDG UEZDMQZG \nOIA Y GPGNG GZDTG PM YGOIMZAG GD P VGPNGDAG B IZ DTEAYAGUG WEDG JMT PG PMW \nPGUMZ GD PG TVEZG OIA YGJMTG WGDDG BGTZAGTG BG ZEDTG JTENAZWG AP TGYIPDMAD \nBG WGDDG JEYADAEZ OI APY ZG JEINMAGZD ZA Y GDGZBTG MI PEAZ ZA JETDGT LMWAPGUGZD \nPM QIGTTG WVGH PGITY NEAYAZY GD W GDMAD IZG WMIYG BG NANG MLLPAWDAEZ JEIT BGY \nVEUUGY RGPPAOIGIX PGIT JEJIPMDAEZ ZEURTGIYG GD PM QPEATG OI APY MWOIGTMAGZD BMZY \nPM QIGTTG JMT PGIT WEITMQG PGIT LMAYMAGZD TGQMTBGT WEUUG GDTEADGY BGY PAUADGY \nOIA MNMAGZD BGIX WGZD OIMTMZDG UAPPGY BG PEZQ YIT WGZD OIMDTG NAZQDY UAPPGY BG PMTQG\n```\n\nReprenez le code précédent et adaptez-le pour compter les occurrences de chaque lettre de ce message."},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"tags":["breakpoint"]},"cell_type":"markdown","source":"#### Ctrl+enter pour continuer ..........."},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 3</h3> \n\nOn peut maintenant comparer ces occurrences avec celles de la langue française, fournies ici dans l’histogramme et le tableau suivants :\n\n\n\n\n| Rang | Caractère | Pourcentage | \n| :--------------- |:---------------:| -----:| \n| 1 | E | 12.10% |\n| 2 | S | 7.11% |\n| 3 | R | 6.59% |\n| 4 | T | 6.51% |\n| 5 | A | 6.39% |\n| 6 | L | 6.07% |\n| 7 | I | 5.92% |\n| 8 | U | 5.02% |\n| 9 | O | 4.96% |\n| 10 | N | 4.49% |\n| 11 | D | 3.67% |\n| 12 | C | 3.18% |\n| 13 | M | 2.62% |\n| 14 | P | 2.49% |\n| 15 | G | 1.23% |\n| 16 | B | 1.14% |\n| 17 | V | 1.11% |\n| 18 | H | 1.11% |\n| 19 | F | 1.11% |\n| 20 | Q | 0.65% |\n| 21 | Y | 0.46% |\n| 22 | X | 0.38% |\n| 23 | J | 0.34% |\n| 24 | K | 0.29% |\n| 25 | W | 0.17% |\n| 26 | Z | 0.15% |\n\n\nOn constate que la lettre la plus utilisée est le E, ensuite S, ensuite R, etc…\n\nEn se basant sur cette liste vous pouvez trouver la clé de chiffrage : \n1. Sur une feuille de papier, en partant du résultat de l'exercice 2, associez la lettre la plus utilisée de l'alphabet à celle la plus utilisée dans le texte, puis la 2ème plus utilisée, et ainsi de suite jusqu'à la moins utilisée. Cela vous donne une première correspondance.\n2. Copiez le code de l'exercice 1.\n3. Utilisez comme clef de base l'alphabet non modifié `\"ABCDE...\"` car pour l’instant vous ne connaissez pas la clé.\n4. Remplacez chaque lettre dans la clef par son équivalent chiffré.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Cela vous donne déjà une première clef approximative. À partir de là, par tentatives successives : \n\n1. Exécutez le code, puis\n2. modifiez votre clef en inversant la position des lettres. Attention de toujours garder 26 lettres différentes.\n3. Continuez à tâtons avec les mots que vous reconnaissez, par exemple s'il vous semble reconnaitre un déterminant ou une double lettre, vous pouvez adapter votre clé pour que faire coincider le message déchiffré."},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"}},"nbformat":4,"nbformat_minor":2} \ No newline at end of file diff --git a/Cryptographie/1_monoalphabetique_correction.ipynb b/Cryptographie/1_monoalphabetique_correction.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..fd22ffc8f543e0119aa5ea50584b28d59ef785f1 --- /dev/null +++ b/Cryptographie/1_monoalphabetique_correction.ipynb @@ -0,0 +1 @@ +{"cells":[{"metadata":{},"cell_type":"markdown","source":"<div style=\"padding:20px;background-color:papayawhip;\" > \n<h3 style=\"color:chocolate\"> <i class=\"fa fa-info\" aria-hidden=\"true\"> </i> Remarque introductive <i class=\"fa fa-info\" aria-hidden=\"true\"></h3> \n<p> Ce fichier est fait pour être lu sur le site <a href=\"https://notebook.basthon.fr/\"><img src='https://notebook.basthon.fr/assets/efede5218c9087496f16.png' style=\"border: 0; display:inline; margin: 0 5px; height:30px\" alt=\"Basthon\"/></a>. <br>\n \nSi vous l'avez ouvert avec un autre programme, comme Jupyter notebook, vous riquez de rencontrer quelques bugs. <br>\nVeuillez cliquez sur <a href=\"https://notebook.basthon.fr/\">ce lien</a> et y charger ce fichier à l'aide du bouton \"Ouvrir\" <i class=\"fa fa-folder\" aria-hidden=\"true\"> </i>\n</p> </div> "},{"metadata":{},"cell_type":"markdown","source":"# Chiffrement symétrique - Le chiffrement monoalphabétique - Correction\n\nLe but de ce travail pratique est de déchiffrer un message qui a été chiffré avec un chiffrement monoalphabétique en adaptant un programme déjà créé.\n"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 1 </h3> \n\nLe programme suivant permet de déchiffrer un message codé selon le principe monoalphabétique, en connaissant la clé de chiffrement. \n\nLisez-le en essayant de le comprendre, puis testez-le."},{"metadata":{"trusted":true},"cell_type":"code","source":"# Texte à déchiffrer\ntexte_chiffre = \"\"\"WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\"\"\"\n\n# Alphabet MAJUSCULE uniquement pour simplifier\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Pour chaque lettre, correspond une lettre dans liste_alphabet\nliste_chiffree = \"SNRFIYAQXLKWBPUZCHVMOTGJDE\"\n\n# texte_dechiffree contiendra la chaine de caractère donc le texte déchiffré\ntexte_dechiffre = \"\"\n\n\n# Parcours caractère par caractère le fichier ouvert.\nfor lettre in texte_chiffre:\n\n # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n if lettre.isalpha(): \n # Recherche la position (index) de la lettre à décoder dans la liste_chiffree.\n index = liste_chiffree.index(lettre)\n \n # On utilise cet index pour trouver la lettre dans liste_alphabet.\n lettre_decodee = liste_alphabet[index]\n \n # On ajoute le caractère déchiffré à la suite du texte déjà déchiffré.\n texte_dechiffre = texte_dechiffre + lettre_decodee\n else:\n # la lettre n'est pas un caractère alphabétique mais peut-être une ponctuation\n texte_dechiffre = texte_dechiffre + lettre\n\n# On affiche le texte decodé\nprint(texte_chiffre)\nprint(texte_dechiffre)\n\n","execution_count":32,"outputs":[{"output_type":"stream","text":"WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\nLE COLLEGE SISMONDI VOUS SOUHAITE UNE BONNE ANNEE\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"On veut maintenant déchiffrer le message suivant `JI KXJIEOI IWIFEIJ TI OIK IKNVOIK XEYXEXK D'IYYFVXI` qui a été codé avec la clé `VMOTIYAQXLGJDESNRFKWBPUZCH`.\n\nReprenez le code précédent et adaptez-le pour décoder ce message."},{"metadata":{"trusted":true},"cell_type":"code","source":"############ Correction ################\n# Texte à déchiffrer\ntexte_chiffre = \"\"\"JI KXJIEOI IWIFEIJ TI OIK IKNVOIK XEYXEXK D'IYYFVXI\"\"\"\n\n# Alphabet MAJUSCULE uniquement pour simplifier\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Pour chaque lettre, correspond une lettre dans liste_alphabet\nliste_chiffree = \"SNRFIYAQXLKWBPUZCHVMOTGJDE\"\n\n# texte_dechiffree contiendra la chaine de caractère donc le texte déchiffré\ntexte_dechiffre = \"\"\n\n\n# Parcours caractère par caractère le fichier ouvert.\nfor lettre in texte_chiffre:\n\n # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n if lettre.isalpha(): \n # Recherche la position (index) de la lettre à décoder dans la liste_chiffree.\n index = liste_chiffree.index(lettre)\n \n # On utilise cet index pour trouver la lettre dans liste_alphabet.\n lettre_decodee = liste_alphabet[index]\n \n # On ajoute le caractère déchiffré à la suite du texte déjà déchiffré.\n texte_dechiffre = texte_dechiffre + lettre_decodee\n else:\n # la lettre n'est pas un caractère alphabétique mais peut-être une ponctuation\n texte_dechiffre = texte_dechiffre + lettre\n\n# On affiche le texte decodé\nprint(texte_chiffre)\nprint(texte_dechiffre)\n","execution_count":4,"outputs":[{"output_type":"stream","text":"JI KXJIEOI IWIFEIJ TI OIK IKNVOIK XEYXEXK D'IYYFVXI\nLE SILENCE ETERNEL DE CES ESPACES INFINIS M'EFFRAIE\n","name":"stdout"}]},{"metadata":{"tags":["breakpoint"]},"cell_type":"markdown","source":"#### Ctrl+enter pour continuer ..........."},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 2</h3> \n\nOn aimerait maintenant déchiffrer un message chiffré avec le chiffrement monoalhabétique, mais dont on ne connaît pas la clef.\n\n**Comment procéder pour trouver la clé ?**\nOn peut compter les occurrences (répétition) de chaque lettre dans le message chiffré et les comparer à celles de la langue française pour essayer de retrouver la correspondance.\n\nC'est ce que fait le code suivant. Lisez-le en essayant de le comprendre, puis testez-le.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Texte à déchiffrer\ntexte_chiffre = \"\"\"WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\"\"\"\n\n# Alphabet\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Liste des occurrences\nliste_occurrence = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n\n# Contiendra le texte déchifré\ntexte_dechiffre = \"\"\n\n# Parcours caractère par caractère le fichier\nfor lettre in texte_chiffre:\n \n # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n if lettre.isalpha():\n \n # Recherche la position (index) de la lettre (conversion en minuscule)\n # à décoder dans la liste_alphabet.\n index = liste_alphabet.index(lettre)\n \n # Incrémenter l'occurence de la lettre correspondante\n liste_occurrence[index] = liste_occurrence[index] + 1\n\n# Afficher les occurrences de chaque lettres\nfor i in range(26):\n print(liste_alphabet[i], \":\",liste_occurrence[i])","execution_count":8,"outputs":[{"output_type":"stream","text":"A : 1\nB : 1\nC : 0\nD : 0\nE : 0\nF : 1\nG : 0\nH : 0\nI : 8\nJ : 0\nK : 0\nL : 0\nM : 1\nN : 1\nO : 3\nP : 6\nQ : 1\nR : 1\nS : 2\nT : 1\nU : 5\nV : 4\nW : 3\nX : 3\nY : 0\nZ : 0\n","name":"stdout"}]},{"metadata":{},"cell_type":"markdown","source":"Vous avez maintenant intercepté le message suivant dont vous ne connaissez pas la clé : \n```\nPGY VGPNGDGY YITJMYYGZD MIYYA GZ NMPGIT PGY MIDTGY QMIPEAY WMT APY GZQMQGZD \nWEZDTG PGY QGTUMAZY BGY PIDDGY JTGYOIG FEITZMPAGTGY YEAD OI APY PGY TGJEIYYGZD \nBG PGIT JTEJTG DGTTADEATG YEAD OI APY GZNMVAYYGZD WGPIA BG PGITY GZZGUAY ETQGDETAX \nGDMAD WVGH PGY VGPNGDGY PG JTGUAGT JMT YM ZMAYYMZWG GD JMT YGY TAWVGYYGY YEIY PG \nWEZYIPMD BG U UGYYMPM GD BG U JAYEZ WGD VEUUG JEIYYG JMT P MURADAEZ WEZFITM MNGW \nPM ZERPGYYG GD GZQMQGM PGY VMRADMZDY M YETDAT BI JMCY MNGW DEIDGY PGITY LETWGY \nAP PGIT BAD OIG P GUJETDMZD JMT PG WEITMQG YIT DEIY PGY JGIJPGY BG PM QMIPG APY \nPM YEIUGDDTMAGZD MAYGUGZD DEID GZDAGTG M PGIT GUJATG AP GID B MIDMZD UEAZY BG \nJGAZG M PGY JGTYIMBGT OIG PGY VGPNGDGY YEZD BG DEIDGY JMTDY TGYYGTTGY JMT PM \nZMDITG BGY PAGIX B IZ WEDG JMT PG TVAZ LPGING DTGY PMTQG GD DTGY JTELEZB OIA \nYGJMTG PGIT DGTTADEATG BG PM QGTUMZAG B IZ MIDTG JMT PG FITM VMIDG UEZDMQZG \nOIA Y GPGNG GZDTG PM YGOIMZAG GD P VGPNGDAG B IZ DTEAYAGUG WEDG JMT PG PMW \nPGUMZ GD PG TVEZG OIA YGJMTG WGDDG BGTZAGTG BG ZEDTG JTENAZWG AP TGYIPDMAD \nBG WGDDG JEYADAEZ OI APY ZG JEINMAGZD ZA Y GDGZBTG MI PEAZ ZA JETDGT LMWAPGUGZD \nPM QIGTTG WVGH PGITY NEAYAZY GD W GDMAD IZG WMIYG BG NANG MLLPAWDAEZ JEIT BGY \nVEUUGY RGPPAOIGIX PGIT JEJIPMDAEZ ZEURTGIYG GD PM QPEATG OI APY MWOIGTMAGZD BMZY \nPM QIGTTG JMT PGIT WEITMQG PGIT LMAYMAGZD TGQMTBGT WEUUG GDTEADGY BGY PAUADGY \nOIA MNMAGZD BGIX WGZD OIMTMZDG UAPPGY BG PEZQ YIT WGZD OIMDTG NAZQDY UAPPGY BG PMTQG\n```\n\nReprenez le code précédent et adaptez-le pour compter les occurrences de chaque lettre de ce message."},{"metadata":{"trusted":true},"cell_type":"code","source":"############ Correction ################\n# Texte à déchiffrer\ntexte_chiffre = \"\"\"PGY VGPNGDGY YITJMYYGZD MIYYA GZ NMPGIT PGY MIDTGY QMIPEAY WMT APY GZQMQGZD \nWEZDTG PGY QGTUMAZY BGY PIDDGY JTGYOIG FEITZMPAGTGY YEAD OI APY PGY TGJEIYYGZD \nBG PGIT JTEJTG DGTTADEATG YEAD OI APY GZNMVAYYGZD WGPIA BG PGITY GZZGUAY ETQGDETAX \nGDMAD WVGH PGY VGPNGDGY PG JTGUAGT JMT YM ZMAYYMZWG GD JMT YGY TAWVGYYGY YEIY PG \nWEZYIPMD BG U UGYYMPM GD BG U JAYEZ WGD VEUUG JEIYYG JMT P MURADAEZ WEZFITM MNGW \nPM ZERPGYYG GD GZQMQGM PGY VMRADMZDY M YETDAT BI JMCY MNGW DEIDGY PGITY LETWGY \nAP PGIT BAD OIG P GUJETDMZD JMT PG WEITMQG YIT DEIY PGY JGIJPGY BG PM QMIPG APY \nPM YEIUGDDTMAGZD MAYGUGZD DEID GZDAGTG M PGIT GUJATG AP GID B MIDMZD UEAZY BG \nJGAZG M PGY JGTYIMBGT OIG PGY VGPNGDGY YEZD BG DEIDGY JMTDY TGYYGTTGY JMT PM \nZMDITG BGY PAGIX B IZ WEDG JMT PG TVAZ LPGING DTGY PMTQG GD DTGY JTELEZB OIA \nYGJMTG PGIT DGTTADEATG BG PM QGTUMZAG B IZ MIDTG JMT PG FITM VMIDG UEZDMQZG \nOIA Y GPGNG GZDTG PM YGOIMZAG GD P VGPNGDAG B IZ DTEAYAGUG WEDG JMT PG PMW \nPGUMZ GD PG TVEZG OIA YGJMTG WGDDG BGTZAGTG BG ZEDTG JTENAZWG AP TGYIPDMAD \nBG WGDDG JEYADAEZ OI APY ZG JEINMAGZD ZA Y GDGZBTG MI PEAZ ZA JETDGT LMWAPGUGZD \nPM QIGTTG WVGH PGITY NEAYAZY GD W GDMAD IZG WMIYG BG NANG MLLPAWDAEZ JEIT BGY \nVEUUGY RGPPAOIGIX PGIT JEJIPMDAEZ ZEURTGIYG GD PM QPEATG OI APY MWOIGTMAGZD BMZY \nPM QIGTTG JMT PGIT WEITMQG PGIT LMAYMAGZD TGQMTBGT WEUUG GDTEADGY BGY PAUADGY \nOIA MNMAGZD BGIX WGZD OIMTMZDG UAPPGY BG PEZQ YIT WGZD OIMDTG NAZQDY UAPPGY BG PMTQG\"\"\"\n\n# Alphabet\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Liste des occurrences\nliste_occurrence = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n\n# Contiendra le texte déchifré\ntexte_dechiffre = \"\"\n\n# Parcours caractère par caractère le fichier\nfor lettre in texte_chiffre:\n \n # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n if lettre.isalpha():\n \n # Recherche la position (index) de la lettre (conversion en minuscule)\n # à décoder dans la liste_alphabet.\n index = liste_alphabet.index(lettre)\n \n # Incrémenter l'occurence de la lettre correspondante\n liste_occurrence[index] = liste_occurrence[index] + 1\n\n# Afficher les occurrences de chaque lettres\nfor i in range(26):\n print(liste_alphabet[i], \":\",liste_occurrence[i])","execution_count":44,"outputs":[{"output_type":"stream","text":"A : 79\nB : 30\nC : 1\nD : 92\nE : 56\nF : 3\nG : 215\nH : 2\nI : 75\nJ : 35\nK : 0\nL : 7\nM : 89\nN : 17\nO : 16\nP : 82\nQ : 20\nR : 5\nS : 0\nT : 97\nU : 27\nV : 14\nW : 29\nX : 4\nY : 102\nZ : 67\n","name":"stdout"}]},{"metadata":{"tags":["breakpoint"]},"cell_type":"markdown","source":"#### Ctrl+enter pour continuer ..........."},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 3</h3> \n\nOn peut maintenant comparer ces occurrences avec celles de la langue française, fournies ici dans l’histogramme et le tableau suivants :\n\n\n\n\n| Rang | Caractère | Pourcentage | \n| :--------------- |:---------------:| -----:| \n| 1 | E | 12.10% |\n| 2 | S | 7.11% |\n| 3 | R | 6.59% |\n| 4 | T | 6.51% |\n| 5 | A | 6.39% |\n| 6 | L | 6.07% |\n| 7 | I | 5.92% |\n| 8 | U | 5.02% |\n| 9 | O | 4.96% |\n| 10 | N | 4.49% |\n| 11 | D | 3.67% |\n| 12 | C | 3.18% |\n| 13 | M | 2.62% |\n| 14 | P | 2.49% |\n| 15 | G | 1.23% |\n| 16 | B | 1.14% |\n| 17 | V | 1.11% |\n| 18 | H | 1.11% |\n| 19 | F | 1.11% |\n| 20 | Q | 0.65% |\n| 21 | Y | 0.46% |\n| 22 | X | 0.38% |\n| 23 | J | 0.34% |\n| 24 | K | 0.29% |\n| 25 | W | 0.17% |\n| 26 | Z | 0.15% |\n\n\nOn constate que la lettre la plus utilisée est le E, ensuite S, ensuite R, etc…\n\nEn se basant sur cette liste vous pouvez trouver la clé de chiffrage : \n1. Sur une feuille de papier, en partant du résultat de l'exercice 2, associez la lettre la plus utilisée de l'alphabet à celle la plus utilisée dans le texte, puis la 2ème plus utilisée, et ainsi de suite jusqu'à la moins utilisée. Cela vous donne une première correspondance.\n2. Copiez le code de l'exercice 1.\n3. Utilisez comme clef de base l'alphabet non modifié `\"ABCDE...\"` car pour l’instant vous ne connaissez pas la clé.\n4. Remplacez chaque lettre dans la clef par son équivalent chiffré.\n\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Cela vous donne déjà une première clef approximative. À partir de là, par tentatives successives : \n\n1. Exécutez le code, puis\n2. modifiez votre clef en inversant la position des lettres. Attention de toujours garder 26 lettres différentes.\n3. Continuez à tâtons avec les mots que vous reconnaissez, par exemple s'il vous semble reconnaitre un déterminant ou une double lettre, vous pouvez adapter votre clé pour que faire coincider le message déchiffré."},{"metadata":{"trusted":true,"scrolled":true},"cell_type":"code","source":"############ Correction ################\n\n# Texte à déchiffrer\ntexte_chiffre = \"\"\"PGY VGPNGDGY YITJMYYGZD MIYYA GZ NMPGIT PGY MIDTGY QMIPEAY WMT APY GZQMQGZD \nWEZDTG PGY QGTUMAZY BGY PIDDGY JTGYOIG FEITZMPAGTGY YEAD OI APY PGY TGJEIYYGZD \nBG PGIT JTEJTG DGTTADEATG YEAD OI APY GZNMVAYYGZD WGPIA BG PGITY GZZGUAY ETQGDETAX \nGDMAD WVGH PGY VGPNGDGY PG JTGUAGT JMT YM ZMAYYMZWG GD JMT YGY TAWVGYYGY YEIY PG \nWEZYIPMD BG U UGYYMPM GD BG U JAYEZ WGD VEUUG JEIYYG JMT P MURADAEZ WEZFITM MNGW \nPM ZERPGYYG GD GZQMQGM PGY VMRADMZDY M YETDAT BI JMCY MNGW DEIDGY PGITY LETWGY \nAP PGIT BAD OIG P GUJETDMZD JMT PG WEITMQG YIT DEIY PGY JGIJPGY BG PM QMIPG APY \nPM YEIUGDDTMAGZD MAYGUGZD DEID GZDAGTG M PGIT GUJATG AP GID B MIDMZD UEAZY BG \nJGAZG M PGY JGTYIMBGT OIG PGY VGPNGDGY YEZD BG DEIDGY JMTDY TGYYGTTGY JMT PM \nZMDITG BGY PAGIX B IZ WEDG JMT PG TVAZ LPGING DTGY PMTQG GD DTGY JTELEZB OIA \nYGJMTG PGIT DGTTADEATG BG PM QGTUMZAG B IZ MIDTG JMT PG FITM VMIDG UEZDMQZG \nOIA Y GPGNG GZDTG PM YGOIMZAG GD P VGPNGDAG B IZ DTEAYAGUG WEDG JMT PG PMW \nPGUMZ GD PG TVEZG OIA YGJMTG WGDDG BGTZAGTG BG ZEDTG JTENAZWG AP TGYIPDMAD \nBG WGDDG JEYADAEZ OI APY ZG JEINMAGZD ZA Y GDGZBTG MI PEAZ ZA JETDGT LMWAPGUGZD \nPM QIGTTG WVGH PGITY NEAYAZY GD W GDMAD IZG WMIYG BG NANG MLLPAWDAEZ JEIT BGY \nVEUUGY RGPPAOIGIX PGIT JEJIPMDAEZ ZEURTGIYG GD PM QPEATG OI APY MWOIGTMAGZD BMZY \nPM QIGTTG JMT PGIT WEITMQG PGIT LMAYMAGZD TGQMTBGT WEUUG GDTEADGY BGY PAUADGY \nOIA MNMAGZD BGIX WGZD OIMTMZDG UAPPGY BG PEZQ YIT WGZD OIMDTG NAZQDY UAPPGY BG PMTQG\"\"\"\n\n# Alphabet MAJUSCULE uniquement pour simplifier\nliste_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\n# Pour chaque lettre, correspond une lettre dans liste_alphabet\nliste_chiffree = \"MRWBGLQVAFSPUZEJOTYDINKXCH\"\n\n# texte_dechiffree contiendra la chaine de caractère donc le texte déchiffré\ntexte_dechiffre = \"\"\n\n\n# Parcours caractère par caractère le fichier ouvert.\nfor lettre in texte_chiffre:\n\n # Retourne vrai si \"lettre\" est un caractère alphabétique (a..z)\n if lettre.isalpha(): \n # Recherche la position (index) de la lettre à décoder dans la liste_chiffree.\n index = liste_chiffree.index(lettre)\n \n # On utilise cet index pour trouver la lettre dans liste_alphabet.\n lettre_decodee = liste_alphabet[index]\n \n # On ajoute le caractère déchiffré à la suite du texte déjà déchiffré.\n texte_dechiffre = texte_dechiffre + lettre_decodee\n else:\n # la lettre n'est pas un caractère alphabétique mais peut-être une ponctuation\n texte_dechiffre = texte_dechiffre + lettre\n\n# On affiche le texte decodé\nprint(texte_dechiffre)","execution_count":43,"outputs":[{"output_type":"stream","text":"LES HELVETES SURPASSENT AUSSI EN VALEUR LES AUTRES GAULOIS CAR ILS ENGAGENT \nCONTRE LES GERMAINS DES LUTTES PRESQUE JOURNALIERES SOIT QU ILS LES REPOUSSENT \nDE LEUR PROPRE TERRITOIRE SOIT QU ILS ENVAHISSENT CELUI DE LEURS ENNEMIS ORGETORIX \nETAIT CHEZ LES HELVETES LE PREMIER PAR SA NAISSANCE ET PAR SES RICHESSES SOUS LE \nCONSULAT DE M MESSALA ET DE M PISON CET HOMME POUSSE PAR L AMBITION CONJURA AVEC \nLA NOBLESSE ET ENGAGEA LES HABITANTS A SORTIR DU PAYS AVEC TOUTES LEURS FORCES \nIL LEUR DIT QUE L EMPORTANT PAR LE COURAGE SUR TOUS LES PEUPLES DE LA GAULE ILS \nLA SOUMETTRAIENT AISEMENT TOUT ENTIERE A LEUR EMPIRE IL EUT D AUTANT MOINS DE \nPEINE A LES PERSUADER QUE LES HELVETES SONT DE TOUTES PARTS RESSERRES PAR LA \nNATURE DES LIEUX D UN COTE PAR LE RHIN FLEUVE TRES LARGE ET TRES PROFOND QUI \nSEPARE LEUR TERRITOIRE DE LA GERMANIE D UN AUTRE PAR LE JURA HAUTE MONTAGNE \nQUI S ELEVE ENTRE LA SEQUANIE ET L HELVETIE D UN TROISIEME COTE PAR LE LAC \nLEMAN ET LE RHONE QUI SEPARE CETTE DERNIERE DE NOTRE PROVINCE IL RESULTAIT \nDE CETTE POSITION QU ILS NE POUVAIENT NI S ETENDRE AU LOIN NI PORTER FACILEMENT \nLA GUERRE CHEZ LEURS VOISINS ET C ETAIT UNE CAUSE DE VIVE AFFLICTION POUR DES \nHOMMES BELLIQUEUX LEUR POPULATION NOMBREUSE ET LA GLOIRE QU ILS ACQUERAIENT DANS \nLA GUERRE PAR LEUR COURAGE LEUR FAISAIENT REGARDER COMME ETROITES DES LIMITES \nQUI AVAIENT DEUX CENT QUARANTE MILLES DE LONG SUR CENT QUATRE VINGTS MILLES DE LARGE\n","name":"stdout"}]}],"metadata":{"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"}},"nbformat":4,"nbformat_minor":2} \ No newline at end of file diff --git a/Cryptographie/readme.md b/Cryptographie/readme.md index a158951a0eb842b6f3bc54fcf1902ac562d3cf41..36ae4349d34c540e7cfa9fafd0edcd8610390ff3 100644 --- a/Cryptographie/readme.md +++ b/Cryptographie/readme.md @@ -14,7 +14,7 @@ ### Cours 2 - TP Attaque par occurence + Vigenère -* TP Attaque par occurence... à venir +* TP Attaque par occurence - [Énoncé](https://notebook.basthon.fr/?extensions=linenumbers,romd,sequenced&ipynb=eJztWmty20YSvsosXbuSHYkSKVu2accpSIRh0IIESSApMnTZI3Aojg0CCB6K5dhVucb-S-2P3Wh_7CV4k5xkv54B-JAcJXaSqmzVKqGJafT0u3t6ZvhdxRdBkFYaX39XmYiMD3nGK43vPqwp-MvsIhaVRmXCkzfD6NuwslZJozzxCfZ4KM9Zml0E4stBJebDoQzPGvXN-O2jU-6_OUuiPByu-1EQJY2Yx_yCfzuW8aNBhT1hg_DxeGs2V-P44wgPPBODyhP2WDI_4GmKtyPORnxdhqMIU3ki-fpYDocixKssyTX2hnzC_haepvEjdiQg6ze5YDLMkmiY-5k8F-XLT6P7eGO8pWSNn7BdwUbSH0uRMJFmmCkzFsMSbPrvLBEsyFmKQSBYKjPBHnM2TsQIpMZZFqeNjY0wysRpFL2pnvI0G0dhdZRsEAs5OWNp4n-5chMiBBZZuiFGYiju1WsP_IebD-7ffbg9qm1X4_BsZWbJ0ygZiqTBNh-xoUzjgF80ZBjIUDxisMqZDPGK3YOH2FjIs3HW2IK7SP0gw-wdzXFQ2YDq_EmVPT5NngxChr9BeCzZeZSnLFjh5-Idi_JzkWQMzz7LQ8ZzskKcRGcJn0zEGvMjfLFWHl9kMFmp1JqmkUg46B0bCpaI0I_gKOAAFOCTstP8LC15d0QugwC4fqDnkJV_tXV9OEaKkJRhImMXzB_DCuDlz705_YFUkpBlmLPTKM-ikA0qB_l5IhNYpoyca4EzigKY-saQRORsxPSIRHlCVqx8WPvUJLvFdsdyNErERIQZSy8m08tMmY-tsz0BheYvJ1EY8SAe81PgEMogHITAOc0zMjV0zhJ-zmUAP3GFoEKZNJ9eFoQScuZEpCk_E_CIZJyB2PSyYISH0uM3cmYCITHkccbxFsizwCBWr2FyH6Sml9VB-BkmuV46MsGD60WHv8sToevNNe_FiDsZ_KqCYr4ViS9hvRorC4Iy61ynNJfnpGgsEmhyg0H9CC9YKgLEWEAUJKSIxXX7rZEBkRghl5gJ0gGHApg7XHJ5VcsiU_FuPVBGJ0YXNAGIATGcxEixYQKKcS5TlsHjCrl61fCkO94NKw0ywhU3QHCxHJWeeIs6B08uqDoIM4K-LMbsSyQS_de12VG727UNm3VOOjtt9-kJ89oHHdZpHxwenzg2O3Bttt928e8x_rH1NNLtFjOUXWBWx2i1j3fbeyYsSjZSkadKcConcSBHkiQIJJR4yctJJIKxs9s0n1rP7NbzPWf_wD08Ovbane5Jr1_ycIkKagNFbiCyLFEFLElEGkfhEPxKMBvyECVwiUfJs9Baq328f_TU7hmHJ3vPuztuu7_7rOMceFaraZY8tamGYjaN6qAkX3Hl7TFH2Vb-5gn3s-mPxD0KfXKrmju3_PSytPyMXGn7sFCQJz50TBeJxTxZHAbzkqhrO5JzFCWl4jJkS85tEGGqabew4magDWHPEy7hDHDWk5BeVGCoWMz5LNeJVV6tvrutKclRwawqU4W1ervB5n8aqWTpj5GVY0GmiiOsuRIptSrDoXh7W8U-LwUvQhQBnBTe42zZYdU5ZUUAtruCoMCrmuDtOfaiRAchyzOJeVRos4KQik50IWTPBZE-EkQLMmgkciVkFjNhSsyvFekXc_yfkYa_xlqmi8BCAM1DRi18nGpXppa-WUy9XkxqVaNLutdj7CrkiyvS67kiSCle5uLNTRGuUITEPL0xSiYog6iuebauuy1KSGSmn-WcHP85Euq8IDuNKOzFQloJVaYHIZXnbHUp6m8vQ2dkbxM5FEjxVvg5ifQS6RZmlUaYB8FaBZ6I84x67BefvtxBxnOoTkZAloequC8sL5C7XF7KdehVy2bPT1q2eWAzu2s_Ne0W81Bk7efMfr7foe8Ts3dinjxnzRW713vaObFfLa_2aqFSS3258ryiAqZLGpUxKnBlaXtVJfWPBC01aNHUujOk5Q1iTi-HVKeREqof0AuVyotZVvozDX7bovQ59q9k_IzgldNE8DdxBBNXXvyatgx_bDdLgi-gHXRQGqkKHuYYVud__0MNTn3e31BiyIlIaJvzM4G32NcsNYfBx9rSxd5GpTPWsoyhaIdCNzrT_-g6oOJNjFRI3bmzS9sIWueTSIVScq2mquD86s4dJTPVCNX0ZCozUhb5fp7QJgPPq5AwJiEoQG7rVmphyS_KsriuFYKXaBFdnugtA7kQoGKl4eEZyIwSHk7_xWkJUEKqXoxWHdrmLEo86yw45FKK7qoy6FPLLfTeskyiIqer7PO6vOsN9p-9z_vMFm6PJsEeSy4vac1BoPb15hr73f5_obnvLvRuV9qzX-jOPrE3-6WebN4I_LF92ceboE9oy1aR9MiHlBAQ0RPUzdTPg8X26tYNvdtH-qbl3m2G8Ct6Nzuk7ehEV_JgRUWLCpYliRfTNhML_dqVECsatJkk1998wWpFzOve43qpulqbUu13SS5HlTkTq_Xt0gm6IbnaJL5Yg7sbg8radSFe3P6DOpUOne2o06GFJYMe8DqmtuIjvYpaBtShULkQYMcLCrOlANMa8NarV68GoWv1WMdy960mHnq213J6PavfZA6aGINZfbbvuJbtMcJz7KaHr0PHdk2jx7qOxwy3B6RD55DmDMKu2QeKQj60vLZj9HtsBwPXbhL9FqYf2BZD--T1HdewiFzPNJpopBQpmogtnWlrIQbhDhED-5ZnYjJrWp5nNE0Dj4vTrP6-0zH0nK7l2gYr5tGrvtWGsKZ3aDVNzzgBUavpYG63Yz1jS-q7FknYhlisBd16Dus7oOr0uxazmhpGAhqY2usp0W01Synes12nSYzbrI3XjuvQJDVuGT2zD8marGO22-CiFFQEXea0j4ymQe_N_lPbc5izb3VBEvP75pFLnIiQtrKjJXYwxek34RLI4DUNj-3YILfb05Obpq31IQvsmV4Xg0FouNqWO8pwMBCz2i3MBiEtigURIMChRYFARLRDWpbdom-yqaO8bymrKxFhgrbVbHqOoaLG6FlteiAJIHKTXMwczRfcyHEQw8LLHQonYt02dZSAXssy-hqduHo929mBL5SsS2GKKKMJhZqQvUlhA0N5nh6ToIOw7zRtMFQBaFj2CXjaZOamVerrdYw-24N0-6BGc10HcULmViNE3Z7Z34EEBsj1LMwq4nEhEAuzULj3DUvzUJlSMlFO7QCEUIDkzmGfdCWaCE_XAmtLZw2saR3YigokcAuFS5pND0lnwLxLGriOihULzNUk0skEA0VeC4y4a5KYXl95A_L2TSWeZ-4bFNvwCLS1XZUWKuf0lJbZ05FZpFlfRe6-dnVfid-0-jvkYZuhJPQJSBEFp-05XcPVsaDi5NAm55RJR3G5T-r0iQbrMp2SNjh0UXmUkPsGLOPs7blGVwkB1p7y5SBUWdRjR5brGogOeFYXCbNFOUjIfbN95Fm2Th1i7ypfFYo4XcwqQnbH6feWRNSGBbkyGdRgD6GtJ3jWoeNRXHZVLlvkl6ZV1DmjrZ61e53CVDskYZee4F0PMY9AMNwypcz-ocq3EoFcA78cIqYXsCgui5L96fvCn2vfr_fr4v9bxz_L1nFraesYXzmvmO2c_Cs-VfvFm_dSa2xEXawEhvRl0Qb-9P3fx-hrygN4tUFjGT8NBM_L1iJlDX38-ZevX6yWF0VnEiGRV8ciRcj44w26_nuZyhSb1KHc4HRZCIx0vS7D9WG0sb6R8G83SJON3eQiVgxj9OEbcoKYSzeUEC9HCd3CfaVv2r4c8SDVB0Lv2RG0Ye_Z7rzNfq8Om324nrqg94ywGuvLf-z9VUjjPSu_aUINE018avVqbfOv7D3B6hgf43O_WqsVoC0Mj_DZrt57WIDuYuhpUIl1D0NDgbZKrG0M9xRo834Buo-hjc-96sN6AXqAYVuBNkvQQwwP8LlbfbhdgGqbGO8r2N2Sfo0UaOKzVd0uGdRIgV0Fqz0oYaSBg0-9ul2yqJEKroLN6ZEOFhmkWt8qYaTEjoLV7pYw0qKjYaX6NVLj2RUY6fF0GVYnPQ7x2axu3ythpEdPwe6W-tZJjxMF2yr1qJMeLQ0rZamTHs8VrF7qUSc9ugpWK-1SJz36Gqb5FkmGkpFmPNNnBvNtCu28ArTT-jR6eqkv-ZAeJl0q6ePe4_njER4z_6fv_0lUzZClgp1ydeVEN60-aAq9j9FNekynGO-unb_MrqUoqKldr1XZcZ6og9qRvsIlnJjH2MOqyy3UA3U5OMwZloM0D6CKKgErYnYctcZQliJf0tpxg35q1uy4oDyc-RhiccCjNs3FUQmw6tMfUUOWcdfUyiRD7Jr1IQwM8DpPv8lX9LH5BOV-Ab3KdgWgykTY0YTFEXUiJlJl_bUjnzpmRLFcWBWXda8BZ6vK2vpK4V1xnU4HY4QIDy3pHGITPYmGciTpoLY4LsECMqi8oi2-XmKoaEoKmV_ccIH33Sr9kCIOuE_MP3JMpk_p1EFFCu7Ty2-o6ga0pi_cHPzG46c_aJ961VfFpccVl5F6PI6T6C2KPf2IpMqm36u4lepML5j-sKb0z6iYE0KKQPGxrKXquaFWQySC-Rb9Tp7Nfa1DTwWB9hpenUdZyRTZIdXZSHHxOztIodOt4jygyoyM-Gowy6L8tTpDOuP0AxAqGgUiA_3R9DKhXiPVQbVb9BrvKFey6T8yFJLy5DaFRFg5yd36lxpiHiJaWzgEcYGcWJGBxknFBAvvDFVf0JBR0d1MpGoAolxZdxjlhFlesS5WFN0FJjM7IJBV1BYHoiqH6LZ8uHzlsXhRdXOowf9-EqEw_J6h92JtieEbkYQiSGPh06j4Bc7LkE-IontBv0zBorwq4wuNSQcxquGBKsCIFQZgxQw93qp8gKzh6ShKEIeVxt354CXMGyWVRv3DfwH6qbvT) - [Corrigé](https://notebook.basthon.fr/?ipynb=eJztXOty20aWfpVepmZtJzIlUjeLcTwFERAEGjeBACkydNkQCUpIQAABQMVy7Kq8xv6bmh-74_2xL6E3mSfZ73QDIikpTuTJViW1lE0BaPS5X_rgoKmfauMgivJa69ufarOg8Cd-4ddaP33Y4OOvi6s0qLVqMz_7fpL8GNc2ankyz8Y09nwSXrK8uIqCb0a11J9Mwvi81dxK33595o-_P8-SeTx5Ok6iJGulfupf-T9ehOnXoxp7wUbx84vtG1gxZ3yR4MQvglHtBXsesnHk5znuTn029Z-G8TQBqJ-F_tOLcDIJYtwqsrmYvRm-YP8en-Xp18wJwOsP84CFcZElk_m4CC-D6ubD8D7fvNjmvKYvWDtg03B8EQYZC_ICkGHBUmiCXf93kQUsmrMcF1HA8rAI2HOfXWTBFKguiiLNW5ubcVIEZ0nyff3Mz4uLJK5Ps00iEc7OWZ6Nv3n0qYlgOCjyzWAaTILdZuPZ-GDr2f7Owd60sVdP4_NHN5o8S7JJkLXY1tdsEuZp5F-1wjgK4-BrBq2chzFusV1YiF0E4flF0dqGuUj8qAD0oaA4qm1CdP9FnT0_y16MYoafUdwN2WUyz1n0yL8M3rFkfhlkBcP5mM1j5s9JC2mWnGf-bBZssHGCA-vM06sCKquE2hA4shAGescmAcuCeJzAUJiDoQifnJ3Nz_OKdi-Yh1GEueNIwJCWf7N2xzBMGMQkDAsKdsXGF9ACaI0X1rz-G4kUgpfJnJ0l8yKJ2ahmzS-zMINmKs-54zjTJIKqP-mS8JzNlE4RKC9Ii7UPGw8Nsi9Y-yKcTrNgFsQFy69m1x8Lrj72lOkBBFrcnCVx4kfphX-GOeWUdpJlAUIAVsU_AJzNC9I7FFBk_qUfRjCaL2aTX5Marj-WWDOy7CzIc_88gHlC5jNgvv5YUsVJZf5PsxHAPyZ-Wvi4i8k3XkKkvoP-x0B1_bE-ij9DP3fzSBH40d0M5L-bZ4FIPndMmcIJw-g3ZRflbZCNQ2ivwarswNW6kCmfh5ckaBpkkOQTCh0nuMHyIILDRYQhBBdpcFd_G6RAREnsh4AE6siHAICdrNi_LngJ8-Dd04grnQhdEQAmRkRwliLeJhkwpvMwZwUszifXbyueZMe9Sa019aM8uGUHcB6s-qgbvEXWgymXZB3FBY2-Lq_ZNwgr-tfXmOP1-5qksd5p79Czj06Z61k91vOsk-6poTHL1pjp2fjdxS9NgJFwXzCJKwZ6NaSO1217ugKVkpK46_GEnIezNAqnIXEQhZDitV8BEQvSYVtWjtRjrfNSN0zLPnG6rtfrnw6GFQ2bsCBTkOtGQVFkPJ0hjvI0iSegVw2ziR8jIa7QqGiWUguxu6ZzpA2kk1P9Zf_Q9obt455huWpHViqaQlWT4AaMsmJIxvK5uS98JHFucD_zx8X1P4h6Eo_Jrhx2ofnrj5Xmb9BVuo9LAf1sDBnzZWSpny1fRosEKTI9onOaZJXgYcxWjNsixJThvsD6WwA3mL3M_BDGAGUBhPiiDEPZYkFnNVE89uv1d08EpnBaEquHOZ_1-EmLLX7EpIrk-AJheRGQqtIEKzDyHXscxpPg7RPu_H7FeOmicOCstJ7PVg1WX2DmCKC7WxP48GOB8Mli9jJHVszmRQg4yrRFiYh7J2oS0ucSS_c40RIPYhKZEjwHN8xUM7_lqF8t5v8CN_53WNlEFlhyoIXL8GXQp-RV8IXwxqe-Ww5qnqQrvHd97PbIV7e4F7ABEkprmb2FKuJH5CGpn3_SS2bIg0iv8-KpqL0oIBGZ42Lui4Xu4RyKuCA9Tcntg6WwCnieHsWUn4vHK17_ZHX0Bu0TQocEGbwNxnNi6TXCLS5qre3mRg12SOeFqLfFeZVWczDizwBH6HD98EQZIx22LV1XVIV1ta5hmTJgLa_LupZ3LGmuwjxTYYeWid8Sfimcz9ifCfoTMFT78OrhqzA0dwmDkGmQe2K-5iytetBmtepVy-ObjsZennY0xdKY1teOFK3DXEikvWTaS7NHx1NlcKqcvmTyI20wOOqdam9WixC-fvIKpFoQ31BaFYmWkiul3SrhvqmTUZyAVkCUkXw5nNCqCzavP05o9UCg8jJFrJ88Wm9yxfhGgn91rVz6WarO2Be3fsgfH7KqfoY61-vqel1dr6vrdfXPtK7et6ruPGRR_Zw8SctqV9MVs60wxVUcU9GZjJVW6TKla0t01MwjzdS6zHikHB05kvabFtZa4Z8Tz7Uz8Ph9mkDk2qvf0hPga0eRRV8hOcPneQDwxBbPcVlf_PyJHqibi-dp8pdwFmTUY_uFimL5OXqlGRHd1xNZfpbmXo4UXzDksjgQD9bX_yPCgxcSwZTXCl9-2aYeFi1_WcJrhOxOquFVx1-__JLzTKHDH7ILXvLkLBmP5xl1uHD-GBymxAR57hPx6L60EpbZKrgrFdIc4SK8fib6VWRCDJUJ2I_PgWaa-fH1f_mUGTmT_NmfkjH12JY5vllwffDFBW3z7DCmFk8gGptVdVQWa3X2eV2Fuw2dP3xf4TNLG52AoJAVm1e4FkPA9u3WBvvd_r8S1NtLNc2tsuVXqpYH1iy_VqssFsj_23rl_uLgAeXKY0Q9AiKnCXDpGRJnPp5Hy2XHF5-oae6pJ1ZrmpsJv6Gm0WLqf85EKo8ecW_hzrLC8XLcFsFSHXPLxcrC5YaTu3e-Yo3S58WafDdX3U5OubB7SCZHmjkPHjf3KiOIhfp28fRqA-ZujWobd5l49eS-NfzZQ9ZwibVIhkNxaOOwNYplcVDE4UjcU8XVsThoODwbxR1x9VIcdHEwBIApDhYO26PYxmFvFJ-IQUccujg0R7ErrjwcdkdxD4edUdwXcKfiMBCoh-Lwuzxo9-j1CX8Bs7Qw0glup_RUfM-jNl_s-HuXarkLc6TzxYIHsBZc8s2bNxBZHbCeapuqjJOB5naMwUAdysxAMSQxdchMw1Y1l9E8Q5NdHE4MzVakAesbLpPsASadGCcEA30oQ0zhk09U1zOk4YAd4sLWZMLfAbilqQxlmDs0bEkldANFklGQcVQEiOc5RRNMwOaEDOQ7rgJgJquuK8mKhNNlMHVoGj1JwPRVW5NYCUe3hqoHZhX3RJUVVzoFUlU2ANvvqcdsRXxbJQ49sMU6kG1gsKEBrMawrzJVFmPEoATQwYCzrnEoLvhAsw2ZCHvMw23DNgiIX3ekgTIEZzLrKZ4HKlxAjtBmhudIskT3leGR5hrMMNU-UAJ-qDg2USJEQsuG4NgAiDGUYRLw4MqSyw41oGsPBLCsaEIe0oCuuH1cjGLJFro85IqDgpjqdQANRIIVFSyAgROVHIGQCIN0VK1DR9Kpwa2vcq1zFqECT5Vl15C410gD1aMT4gAsy2RiZgi6oEaGAxsqbh6SOxFpTxFeAnwdVRqK6UTVHWjGIWzBeV1xU3gZAZRigneZ3AaKcl1xTYwiEA1ZA0HugJKqnYKmRmqW1UpetycNmQ7uTGAjWNuAn5C6-RW8TleGh-BAArqBCqjSH5ccsVQLuftQUgUNHikVEW7UHobgCuDcOBmSrIQT7mmrIK2KqIE2VUvjWMCBXQpc4ZRdBJ0E9a5IYBvcV1QQ50AkkwICHL1gGH4nE5vukFsD_A4Vzp6rmBL5NiwCaTWbhwWPOQHSUQbCM8swG3LPNYWph5x9WR0ekoU1hpQwpEHyKBhNN_qSLXyB-8mJRsapgo780iRxhoSD9ZkISQ0U-sg8nElTgmYMXbelPmcCpF1uS2RfiqIBc1TbluAdsKxIEkqHYpAmDxXPcVVNhA6Rt7mtSkGMPqBKlz00hoMVFoViga4KBn6hw7UFgKueGC75ZZ_Hskp2kdUyz0kePxfmNUpVHRKHfTqDdV34PBxBsquQUoYnPN6qCWQa2OUEPr00i_yyTNkPb2v-0kPK3aeS4I_f-VyvWOsVa71irVes9Yr1J1ix1i2Xdctl3XL5Q7Rcdh703oR6LvsHoumyvSW6Lg3RdTloirbL7p7ou2yLvkuzsSs6L03RednfFa2X7d2V3su-6L08OyibL_ui-9LYE-2XZ03Rf2luiQbMrmjAbIkGzMG-6MA090ULplH2YJoHogmzI5owja2maMPs7a_fyzzwvcz2ynuZ9NYuj5vXEuNbDs1fxnz6RcUGm1K6CjEjHIdlvP_z5_-4gANXuyn52w9W-GdR4M-rjlbOWuKV-799--pxtQX4PMSTyLx-EeR4UhlfbNLG7td5mM8Qv-GmT9vAMSN_2gzjp5Nk8-lm5v-4SZJstrOrlBNMkXA3wxkedfJNzsTraUb7q_8q9lB_w59y-Oae98yBNOw9ay_y6Xu-wWEM01Pz7T2jWa2nqz_s_e2R1ntWHQmgAUAFn0az3tj6C3tPY01cd_HZrzca5dA2Lh189uq7B-XQDi5dMVTN2sWlxIe2q1l7uNT50NZ-ObSPSw2f3fpBsxx6hkuPD21VQwe4tPDZqR_slUONLVybfGynwt8gAWR8tut7FYEGCdDmY41n1RhJYODTrO9VJBokgs3HFvhIBpUUUm9uV2MkxCEfa-xUYyRFT4xV4jdIjONbYyTH0epYk-Q4wWervrdbjZEcAz62U8nbJDlO-dh2JUeT5OiIsYqXJsnxko81KzmaJEefjzUqvTRJjqEYE3TLIEPKyAu_EC_kFusRLbHRPC93QFx_FDu2ER4K7RAWWwy6i1MHp8X4nz__J2FVYpYH7Mzn-4dpD_0YOAOxYInecEqvCN_debl5s8eYnJq6xI06684zvjlgKjbn05zUT1Gs8J3KyAd8p_dkzrDI5vMIovAU8Ci4ede7wZCWknFILYtPyMehburC6s3nfRPLt6e8OirfQ2JW8_ofyCGrczd4QySMUR6JN5xQwHfz_If5I7FVY4Z0vzS9ztoBRrmKJkkcl9sismAW8qi_8z61CYgkDZeaMauyNzBnu848sY3lXflFCXrrTBNhoRWZY1RLs2QSTkPa3lbWxVhARrU3VMuJJYaSZkgu86t9ftDeqdNXZNLIHxPxe95Bi1fgvCLNQf364w-UdSNqJS3tVvlX3-3eV5HE8yharkk-4_3IbWOVO21u2Yzk89M0S94i29P3g-rs-mfuuCF_Yx5d_22DK6CgbE4TcnjKGOtazs9bfDlEJChvUa3Oi4Wxhe9xLxBmw63LpKiIIjxCXgWX2_hvSmZ6jikrvzqTCqIrhhlK-u_408K5T9_toaxRTmTAP73-mFGxkQuvapfFxjsKluL67wUySbUvIgdHWDrJ3uJLOMHCR4S0MAgcA0HxKIzEnDyYYeW9mSp2BZFSUd6ggicpkjnXLiopmlnt61tOKaL7mN3oAZ7M3bbcbsCDiL77MFndKbq8O-pXfA0OMM4SpAYMUDHzu3Ui173IdS9y3Ytc9yLXvcj_H73IP9f2d8PpH6r6SU866treUOlY7kDWzJen7eP19vf19vf19vc_2_b3xUb3e_u12w_p1-pKlx0rek9xcdL1HFvqdhUTJabX7WpMMVlP0pHVGc2TPNfBQZU83dK6rC05TNO7mKRKKsGM4rZlYgqfrCqOIWlmF_VCl-meS_htgJ94CutYnmNKuqYQuq6FNHzicVQE6Ci25QkmRrFMyEDediwAM1dxHM21NJwugylmTzrWBExb0T2NlXB0y1QMMGs5quJajkaVKApSwLaPsWKtiI9sDiIG2MKS4rCuhBUBWCWxn1-MEYMaQLtdzrrHobjgXU-XqH5DJWXgtqRLBMSvba1rmeDMZceWYYAKF5Aj1JlkHGquRvcts4OqlEk9pQ2UgDetQ50oESKhZUlwLAFEMl2YBDw4ruYw2QO6QVcAu5Yn5CENHFkOffNgFGu60KXMFQcFMcWwAQ1EghX6UiAYoC8FYporhIPVFM-mI-lU4tZXuNY5i1CBobgufZWBvEbrKgadEAdg2SUTM0nQBTUyHNhQcFMmdyLShiW8hMoB1DliOlF1uljWYQvO64qbwssIoBQTvLvkNlCU44hrYnQUm5LrgSB3QE3xTkHTIzW7SiWvc6yZ7Ajc9YCNYHUJfkLq5lfwuiPLlMGBRn_ZQgFU6Y9Ljliqhdzd1BRBg0dKRYQb9RhDcAVwLqkmyUo44Z66AtKKiBpoUznxOBZwoJcCVzhdB0GnQb0rEugS9xUFxDkQyWSBAEcvGIbfucSmY3JrgF_T4uw5Vk8j34ZFIK2n87DgMSdAbKsrPLMMM5N7bk-Y2uTso5iVycIeQ0owaZA8CkY7ktqaLnyB-4nqkXGqoCO_7JE4JuFgbSZCkr502kbm4Uz2NGhGOjrStTZnAqQdbstRzKOoyw4VXdfgHbCsSBKWTTFIk03LOHQUT4QOkde5rUpBpDagSpeVJbO7wqJQLNBVwcAvjuDaAsBRVMkhv2zzWFbILq5S5jnN4OfCvFKpKpk4bNMZrOvA5-EIml6FlIWCm-KtmkCmgV1U-PTSLPLL-99JvdpY6Xh8H6D6ifI0GNNV-dddXpdQ9hX91RO2jeokvRIzaQ3hr1z8c5qR8hkLOuJ6u_bhA4bOUIPNfPFVquri9SyMk6zWan74X9sNENY) * Présentation Vigenère ## Cryptographie asymétrique