From 3f6824cac4e05afff825c1eba2e9183bc5219e7d Mon Sep 17 00:00:00 2001 From: "Vincent N." <vincent.namy@edu.ge.ch> Date: Mon, 17 Mar 2025 00:31:06 +0100 Subject: [PATCH] [Crypto]format & update link --- Cryptographie/0_cesar.ipynb | 108 +++++++++++- .../1_monoalphabetique_correction.ipynb | 157 +++++++++++++++++- Cryptographie/readme.md | 2 +- 3 files changed, 264 insertions(+), 3 deletions(-) diff --git a/Cryptographie/0_cesar.ipynb b/Cryptographie/0_cesar.ipynb index af8bd35..43e2177 100644 --- a/Cryptographie/0_cesar.ipynb +++ b/Cryptographie/0_cesar.ipynb @@ -1 +1,107 @@ -{"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 de César\n\nDans ce chapitre, nous allons voir comment déchiffrer en python un message chiffré grâce au chiffrement de César\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\nOn fournit une fonction `decale_car(car, decal)`qui renvoie le caractère `car` décalé dans l'alphabet d'un décalage `decal`. \n\nTestez-là pour décaler :\n1) la lettre B de 3 caractères\n2) la lettre X de 10 caractères\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"def decale_car(car, decal):\n pos_a = ord(\"a\") # position du 'a' dans la table ASCII\n pos_car = ord(car.lower())# position de car en minuscule dans la table ASCII\n caractere_decale = chr((pos_car - decal - pos_a) % 26 + pos_a)\n return caractere_decale\n\n# Votre code ci-dessous\nprint( decale_car(\"...\", ...) )\n...\n","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\nToujours avec la fonction `decale_car(car, decal)` à disposition, on va maintenant essayer de déchiffrer un message entier.\n\nLe code suivant permet de décaler chaque lettre pour déchiffrer un message entier, malheureusement vous ne connaissez pas la clé. Changez la valeur du décalage à la main pour tester toutes les clés possibles et trouver quelle est la clé et le message déchiffré.\n\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"decalage = 0\n\n\nmsgChiffre = \"un bxunru karuun bda brbvxwmr\"\n\nprint(\"Message chiffré : \", msgChiffre)\n\nmsgDechiffre = ''\n\nfor caractere in msgChiffre: # pour chaque caractère du message\n\n if caractere != ' ': # sauf les espaces\n caractere_decale = decale_car(caractere, decalage) \n msgDechiffre = msgDechiffre + caractere_decale\n \n else:\n msgDechiffre = msgDechiffre + caractere\n\nprint(\"Valeur du décalage:\", decalage)\nprint(\"Message déchiffré : \", msgDechiffre)\n\n","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\nAvec le même code mais un nouveau message, on va maintenant tester toutes les clés possibles automatiquement pour trouver quelle est la clé et le message déchiffré.\n\nModifiez pour cela le code ci-dessous afin qu'il teste tous les décalages possibles automatiquement et affiche tous les résultats."},{"metadata":{"trusted":false,"scrolled":true},"cell_type":"code","source":"msgChiffre = \"et engx xlm iexbgx vxmmx gnbm\"\n\nprint(\"Message chiffré : \", msgChiffre)\n\ndecalage = 0\n\nmsgDechiffre = ''\n\nfor caractere in msgChiffre: # pour chaque caractère du message\n\n if caractere.isalpha(): # sauf les espaces\n caractere_decale = decale_car(caractere, decalage) \n msgDechiffre = msgDechiffre + caractere_decale\n\n else:\n msgDechiffre = msgDechiffre + caractere\n\nprint(\"Valeur du décalage:\", decalage, \"Message déchiffré : \", msgDechiffre)\n","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 4 </h3> \n\nRéutilisez le même code pour déchiffrer le message suivant par force brute : \n```\n\"\"\"qrznva, qrf y'nhor, n y'urher bh oynapuvg yn pnzcntar,\nwr cnegvenv. ibvf-gh, wr fnvf dhr gh z'nggraqf.\nw'venv cne yn sberg, w'venv cne yn zbagntar.\nwr ar chvf qrzrhere ybva qr gbv cyhf ybatgrzcf.\n\nwr znepurenv yrf lrhk svkrf fhe zrf crafrrf,\nfnaf evra ibve nh qrubef, fnaf ragraqer nhpha oehvg,\nfrhy, vapbaah, yr qbf pbheor, yrf znvaf pebvfrrf,\ngevfgr, rg yr wbhe cbhe zbv fren pbzzr yn ahvg.\n\nwr ar ertneqrenv av y'be qh fbve dhv gbzor,\nav yrf ibvyrf nh ybva qrfpraqnag iref unesyrhe,\nrg dhnaq w'neevirenv, wr zrggenv fhe gn gbzor\nha obhdhrg qr ubhk ireg rg qr oehlrer ra syrhe.\"\"\"\n```"},{"metadata":{"trusted":false},"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 +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "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> " + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "# Chiffrement symétrique - Le chiffrement de César\n\nDans ce chapitre, nous allons voir comment déchiffrer en python un message chiffré grâce au chiffrement de César\n" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 1 </h3> \n\nOn fournit une fonction `decale_car(car, decal)`qui renvoie le caractère `car` décalé dans l'alphabet d'un décalage `decal`. \n\nTestez-là pour décaler :\n1) la lettre B de 3 caractères\n2) la lettre X de 10 caractères\n\n" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "trusted": false + }, + "outputs": [], + "source": "def decale_car(car, decal):\n pos_a = ord(\"a\") # position du 'a' dans la table ASCII\n pos_car = ord(car.lower())# position de car en minuscule dans la table ASCII\n caractere_decale = chr((pos_car - decal - pos_a) % 26 + pos_a)\n return caractere_decale\n\n# Votre code ci-dessous\nprint( decale_car(\"...\", ...) )\n...\n" + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "breakpoint" + ] + }, + "source": "#### Ctrl+enter pour continuer ..........." + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 2</h3> \n\nToujours avec la fonction `decale_car(car, decal)` à disposition, on va maintenant essayer de déchiffrer un message entier.\n\nLe code suivant permet de décaler chaque lettre pour déchiffrer un message entier, malheureusement vous ne connaissez pas la clé. Changez la valeur du décalage à la main pour tester toutes les clés possibles et trouver quelle est la clé et le message déchiffré.\n\n" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "trusted": false + }, + "outputs": [], + "source": "decalage = 0\n\n\nmsgChiffre = \"un bxunru karuun bda brbvxwmr\"\n\nprint(\"Message chiffré : \", msgChiffre)\n\nmsgDechiffre = ''\n\nfor caractere in msgChiffre: # pour chaque caractère du message\n\n if caractere != ' ': # sauf les espaces\n caractere_decale = decale_car(caractere, decalage) \n msgDechiffre = msgDechiffre + caractere_decale\n \n else:\n msgDechiffre = msgDechiffre + caractere\n\nprint(\"Valeur du décalage:\", decalage)\nprint(\"Message déchiffré : \", msgDechiffre)\n\n" + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "breakpoint" + ] + }, + "source": "#### Ctrl+enter pour continuer ..........." + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 3</h3> \n\nAvec le même code mais un nouveau message, on va maintenant tester toutes les clés possibles automatiquement pour trouver quelle est la clé et le message déchiffré.\n\nModifiez pour cela le code ci-dessous afin qu'il teste tous les décalages possibles automatiquement et affiche tous les résultats." + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true, + "trusted": false + }, + "outputs": [], + "source": "msgChiffre = \"et engx xlm iexbgx vxmmx gnbm\"\n\nprint(\"Message chiffré : \", msgChiffre)\n\ndecalage = 0\n\nmsgDechiffre = ''\n\nfor caractere in msgChiffre: # pour chaque caractère du message\n\n if caractere.isalpha(): # sauf les espaces\n caractere_decale = decale_car(caractere, decalage) \n msgDechiffre = msgDechiffre + caractere_decale\n\n else:\n msgDechiffre = msgDechiffre + caractere\n\nprint(\"Valeur du décalage:\", decalage, \"Message déchiffré : \", msgDechiffre)\n" + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "breakpoint" + ] + }, + "source": "#### Ctrl+enter pour continuer ..........." + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> Exercice 4 </h3> \n\nRéutilisez le même code pour déchiffrer le message suivant par force brute : \n```\n\"\"\"qrznva, qrf y'nhor, n y'urher bh oynapuvg yn pnzcntar,\nwr cnegvenv. ibvf-gh, wr fnvf dhr gh z'nggraqf.\nw'venv cne yn sberg, w'venv cne yn zbagntar.\nwr ar chvf qrzrhere ybva qr gbv cyhf ybatgrzcf.\n\nwr znepurenv yrf lrhk svkrf fhe zrf crafrrf,\nfnaf evra ibve nh qrubef, fnaf ragraqer nhpha oehvg,\nfrhy, vapbaah, yr qbf pbheor, yrf znvaf pebvfrrf,\ngevfgr, rg yr wbhe cbhe zbv fren pbzzr yn ahvg.\n\nwr ar ertneqrenv av y'be qh fbve dhv gbzor,\nav yrf ibvyrf nh ybva qrfpraqnag iref unesyrhe,\nrg dhnaq w'neevirenv, wr zrggenv fhe gn gbzor\nha obhdhrg qr ubhk ireg rg qr oehlrer ra syrhe.\"\"\"\n```" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "trusted": false + }, + "outputs": [], + "source": "" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Cryptographie/1_monoalphabetique_correction.ipynb b/Cryptographie/1_monoalphabetique_correction.ipynb index fd22ffc..fa81c60 100644 --- a/Cryptographie/1_monoalphabetique_correction.ipynb +++ b/Cryptographie/1_monoalphabetique_correction.ipynb @@ -1 +1,156 @@ -{"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 +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "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> " + }, + { + "cell_type": "markdown", + "metadata": {}, + "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" + }, + { + "cell_type": "markdown", + "metadata": {}, + "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." + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "WI RUWWIAI VXVBUPFX TUOV VUOQSXMI OPI NUPPI SPPII\nLE COLLEGE SISMONDI VOUS SOUHAITE UNE BONNE ANNEE\n" + } + ], + "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" + }, + { + "cell_type": "markdown", + "metadata": {}, + "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." + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "JI KXJIEOI IWIFEIJ TI OIK IKNVOIK XEYXEXK D'IYYFVXI\nLE SILENCE ETERNEL DE CES ESPACES INFINIS M'EFFRAIE\n" + } + ], + "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" + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "breakpoint" + ] + }, + "source": "#### Ctrl+enter pour continuer ..........." + }, + { + "cell_type": "markdown", + "metadata": {}, + "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" + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "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" + } + ], + "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])" + }, + { + "cell_type": "markdown", + "metadata": {}, + "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." + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "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" + } + ], + "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])" + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "breakpoint" + ] + }, + "source": "#### Ctrl+enter pour continuer ..........." + }, + { + "cell_type": "markdown", + "metadata": {}, + "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" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "trusted": true + }, + "outputs": [], + "source": "" + }, + { + "cell_type": "markdown", + "metadata": {}, + "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é." + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "scrolled": true, + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "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" + } + ], + "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)" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Cryptographie/readme.md b/Cryptographie/readme.md index 36ae434..c31b9ff 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 - [É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) +* TP Attaque par occurence - [Énoncé](https://notebook.basthon.fr/?extensions=linenumbers%2Cromd%2Csequenced&ipynb=eJzdWuty28YVfpUtM62kRKJEylZi2nEHEmEEtCBBEkiKDD32ClyKa4MAgotiOc5MXqP_Ov3RVv3Rl-Cb9En6nV2AN8mK7d5mqoQm9uDsuZ-zZ3f5U8UXQZBWGt__VJmIjA95xiuNn37eVPCX2XUsKo3KhCdvhtGPYWWzkkZ54hPsyVBesTS7DsS3g0rMh0MZXjbqO_Hbxxfcf3OZRHk43PKjIEoaMY_5Nf9xLOPHgwp7ygbhk_HubK7G8ccRHngmBpWn7IlkfsDTFG9HnI34lgxHEabyRPKtsRwORYhXWZJr7G35lP0uvEjjx-xUQNYfcsFkmCXRMPczeSXKl59G98n2eFfJGj9lB4KNpD-WImEizTBTZiyGJdj0b1kiWJCzFINAsFRmgj3hbJyIEUiNsyxOG9vbYZSJiyh6U73gaTaOwuoo2SYWcnLJ0sT_du0-RAgssnRbjMRQPKzXvvEf7Xzz9YNHe6PaXjUOL9dmlryIkqFIGmznMRvKNA74dUOGgQzFYwarXMoQr9hDeIiNhbwcZ41duIvUDzLM3tccB5VtqM6fVtmTi-TpIGT4G4Rnkl1FecqCNX4l3rEovxJJxvDsszxkPCcrxEl0mfDJRGwyP8IXa-XxdQaTlUptahqJhIPesaFgiQj9CI4CDkABPim7yC_TkndH5DIIgOsHeg5Z-aOt68MxUoSkDBMZu2b-GFYAL3_uzekfSSUJWYY5u4jyLArZoHKcXyUygWXKyLkVOKMogKnvDUlEznZMj0iUp2TFys-bn5pkX7CDsRyNEjERYcbS68n0JlPmY1vsUECh-ctJFEY8iMf8AjiEMggHIXAu8oxMDZ2zhF9xGcBPXCGoUCbNpzcFoYScORFpyi8FPCIZZyA2vSkY4aH0-L2cmUBIDHmccbwF8iwwiNVrmNwHqelNdRB-hklul45M8OB20eHv8kToenPLezHiTgYfVVDMtyLxJaxXY2VBUGad65Tm8ooUjUUCTe4xaCoCRFdAcyX4xyrm7jXkJlkSGRJyCRLACDg0gRuGS76vaqFkKt5tBcr6xPGaJgAREKRjjFwbJqAY5zJlGVyvkKurHiAj4N2w0hjxIBUrDvGjoViOT0-8RcWDTxeUHoQZQV8WY_YtUor-69rstN3t2obNOued_bb77Jx57eMO67SPT87OHZsduzY7arv49wz_2HoaKfcFM5RhYGDHaLXPDtqHJmxLRlKmU8U4lZM4kCNJEgQSWrzk5SQSwdg_aJrPrO_s1vND5-jYPTk989qd7nmvX_JwiQqqBMVwILIsUaUsSUQaR-EQ_EowG_IQxXCJR8mz0FqrfXZ0-szuGSfnh8-7-267f_Bdxzn2rFbTLHlqUw3FbBpVREnO4srdY44CrhzOE-5n078S9yj0ya9q7tzy05vS8jNype3DQkGe-NAxXSQW82RxGMyLo67ySNNRlJSKy5AtObdBhKm6fYG1NwNtCHuVcAlngLOehESjUkNlY85nuWKs82r13YamJEcFs6pMFdb6RoPN_zRSydIfIz_HgkwVR1h9JVJsXYZD8XZDBT8vBV8O0cKBnC37rDonrmjAfCsICryuaW7MsReFOg5ZnknMo6qbFYRUgKIlIZMuSHVHHC3IoJGWvLmM-70i_mI-4wPy8NdY2nQpWIiiedyodZBTKctUVZoF1utFs6mSXdK9HWirkK9uya9nC9SVxqKAc3OEaxQoMU_vDZYJyiHKbZ5t6faL8hIJ6mc5J_9_jow6PchSI4p-sZBdc-GpbmfrS-G_sQydIW8QQVRK8Vb4OQn1EnkXZpVGmAfBZgXeiPOM2u4Xn74CQsorKE9mQLqHqswvRDYkn604xdL0qmWz5-ct2zy2md21n5l2i3motvZzZj8_6tD3udk7N8-fs-aa3es965zbr-5pAMpl6BUVM13eqKRRsSvL3KsqWeBU0LqDxi1YXDFjEPKnN0Mq3EgQ1SropUtlyaIy_kyZf3Gl-hxfVDJ-SfDKRSL4mziCuSsvPqZrwx87yJLgK2gIJZRWqqyHOYbV-Z_S6QPkloPif97_1OftD6WJnIiEdkEfCMKFtmcldO7qWhc7HpXcWOAyhkoeCt3-TP-uq4IKPDFSsfXllwe0y6DFP4lUOCW3qqyK0t9_-aWSmSqGaoUylSUpi3w_T2gPgud1SBiTEBQgG7rBWugDikItbmuFACZaRJcnekdBDgWoWH54eAkyo4SH079wWhSUkKpDo3WIdkGLEs_aDQ65lKIHqij61JELvfUM7ug_q-zzGsCiCb8jdz6QL_em4EIy_W_bxM_sAA9pEoy2FBwlrTkI1L7f2WT_tv9faO4HC63fSnf3K83dJ7Z2v9bSzVuI_2xbd3cD9Qld3TrKAzInJQSE_QQVNvXzYLE1--L-1u-Otmu59ZshfETrZ4e0tZ3osh-sqYBR8bIk9GKOZ2Kh3VuJsqK7m0ly-81XrFaEvW5bbte11UKWatdL8jpK0qVYr--VftCdzGqH-WITHm8MKpu3hXix8RkLWIfOgNQp0sLaQQ94HVOvcUcDo9YDdXhUrgjYEIPCbE3AtAY88erVq0HoWj3Wsdwjq4mHnu21nF7P6jeZg87GYFafHTmuZXuM8By76eHrxLFd0-ixruMxw-0B6cQ5oTmDsGv2gaKQTyyv7Rj9HtvHwLWbRL-F6ce2xdBTeX3HNSwi1zONJrorRYomYsNn2lqIQbhPxMC-5ZmYzJqW5xlN08Dj4jSrf-R0DD2na7m2wYp59KpvtSGs6Z1YTdMzzkHUajqY2-1Y37El9V2LJGxDLNaCbj2H9R1Qdfpdi1lNDSMBDUzt9ZTotpqlFO_ZrtMkxm3WxmvHdWiSGreMntmHZE3WMdttcFEKKoIuc9qnRtOg92b_me05zDmyuiCJ-X3z1CVOREhb2dESO5ji9JtwCWTwmobH9m2QO-jpyU3T1vqQBQ5Nr4vBIDRcbct9ZTgYiFntFmaDkBbFgggQ4MSiQCAi2iEty27RN9nUUd63lNWViDBB22o2PcdQUWP0rDY9kAQQuUkuZo7mC27kOIhh4eU-hROxbps6SkCvZRl9jU5cvZ7t7MMXStalMEWU0YRCTcjepLCBoTxPj0nQQdh3mjYYqgA0LPscPG0yc9Mq9fU6Rp8dQrojUKO5roM4IXOrEaLu0OzvQwID5HoWZhXxuBCIhVko3PuGpXmoTCmZKKd2AEIoQHLnpE-6Ek2Ep2uBtaWzBta0jm1FBRK4hcIlzaaHpDNg3iUNXEfFigXmahLpZIKBIq8FRtw1SUyvr7wBefumEs8zjwyKbXgE2tquSguVc3pKy-zpyCzSrK8i90i7uq_Eb1r9ffKwzVAS-gSkiILTDp2u4epYUHFyYpNzyqSjuDwidfpEg3WZTkkbHLqoPErIIwOWcQ4PXaOrhABrT_lyEKos6rFTy3UNRAc8q4uE2aIcJOS-2T71LFunDrF3la8KRZwuZhUhu-_0e0siasOCXJkManCI0NYTPOvE8SguuyqXLfJL0yrqnNFWz9q9TmGqfZKwS0_wroeYRyAYbplSZv9E5VuJQK6BX04Q0wtYFJdFyf7MneKHmvnb3bu4tZP8jza8H7ksfmiD-f-9k9xd2knGK0cZs42Uv-JUtX28f2u1yUbUqkpgSF8Wjd4_fvnDGJ1LGVJqv8YyfhEInpcNRsoa-oj0N9-_WC-vlS4lPJ1XxyJFzPjjbbosfJnKFHvWodzmdLUIjHSrLsOtYbS9tZ3wH7dJk-2D5DpWDGM029tygqBLt5UQL0cJ3dn9Xt_LfauiSJ0VvWen0Ia9ZwfzXvq9OpD24Xrqhd4zwmpsLf-x96uQxntWftOEGiaa-NTq1drOb9l7gtUxPsPn62qtVoB2MTzFZ6_68FEBeoChp0El1kMMDQXaLbH2MDxUoJ2vC9DXGNr4PKw-qhegbzBsK9BOCXqE4TE-D6qP9gpQbQfjIwV7UNKvkQJNfHareyWDGilwoGC1b0oYaeDgU6_ulSxqpIKrYHN6pINFBqnWd0sYKbGvYLUHJYy06GhYqX6N1PhuBUZ6PFuG1UmPE3x2qnsPSxjp0VOwB6W-ddLjXMF2Sz3qpEdLw0pZ6qTHcwWrl3rUSY-ugtVKu9RJj76Gab5FkqFkpBnP9BHCfCNC26sATbU-rp7e6CtBpIdJN0_6NPhs_niKx8z_xy9_JqpmyFLBLri6l6J7WR80hd6p6FY9pkONd7eOY2Z3VxTU1LTXquwsT9Qp7khf-BJOzGNsVNUNGOqBukoc5gzrQZoHUEWVgDUxO53aZChLkS9pBblHPzVrdiZQntXchVic96idcXFoAqz69K-0LC3hbqqlSYbYGg9FcYb-Ok9_yNf0qfoEdX0BvcoOBKDKRNjXhMX5dSImUmX9rROgOmZEsVxdG5cNUAPibpW19cXDu-IGng7LCBFuWlI8xHZ5Eg3lSNIpbnEwglVkUHlFm3m9zlDllBQ3v7r3Au8HVfrtRRxwn5jfcXSmT-7UkUQK7tObH6j0BrSyL9wu_DdOoz5jqVz1WHEzsuI40o_H8NBblHz64UmVTX9R0SvVQV8w_eOmMkBGJZ0QUoSLj8UtVc8NtSYiHcy3aHvybMXjOgpVPGjf4f1VlJWckShSnYUUF8WzgxM6zSo2_1VmZMRcg1kW5a_VmdElp1-OUP0oEBnoj6Y3CbUdqQ6tg6LteEdpk03_lKGmlGe6KSTCIkpO1z_xEPNA0SrDfYgOpMeaDDROKiZYg2eo-iKHLItGZyJVLxDlysTDKCfM8kZ2sbjojjCZ2QHhrGK3OCpV6USX7cPli5HFK61_IeBSP4lQPhBx1PBsfnwAvlim80YkoQjSWPg0Kn678zLkE8J2r-k3LVig12V8rTE3IJ5qfqALMGKFAVgxQ493Kz9DgvBiFCWIxkrjwXzwEvaNkkqj_vM_AeZ90jU) - [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 -- GitLab