{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\"Cryptographie" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# TP1. Cryptanalyser des chiffrements historiques\n", "\n", "Dans ce TP nous travaillerons en Python, directement à l'intérieur de ce notebook jupyter.\n", "\n", "### Un mot sur Python\n", "\n", "_Dans ce TP comme dans les suivants, nous avons choisi de travailler avec Python. Au besoin prenez quelques minutes pour [découvrir le langage](https://learnxinyminutes.com/docs/fr-fr/python3-fr/). Si vous faites un blocage complet, vous pouvez faire la fiche dans un autre langage... mais ce serait dommage de passer à côté d'une découverte d'un (chouette) outil supplémentaire._\n", "\n", "### Un mot sur les notebook jupyter\n", "\n", "_Ce document est facile à modifier. Il suffit de cliquer sur un élément (texte ou code source) pour accéder à son source, le modifier, l'exécuter (à l'aide des boutons en haut, des menus ou avec SHIFT + Return). N'hésitez pas à utiliser ce notebook pour prendre des notes en insérant des cellules où vous le souhaitez (Insert ⇒ Cell Above). N'oubliez pas de sauvegarder le notebook avant de quitter si vous souhaitez conserver votre travail. Il suffit ensuite de recopier le fichier ``tp1.ipynb``._" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Chiffre mono-alphabétique\n", "\n", "Le premier exercice consiste à déchiffrer le message chiffré ``c`` suivant :" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "c=\"\"\"иь жвкч сьж сщюнкж рян вкч ьчь ьчвккьж!... пьюянж жн свкучьйюж ря'нсж\n", "гвдщнькч сщ ювбчь пя йвяснк зьбйьь, сьж йябж ьч сщ юсщчь-звбйь ькгщфнж\n", "ющб сьж фьбхьж, нсж щгщнькч знкн ющб ибвнбь ряь сщ бщиь пьж йьякньбж\n", "ьчщнч ьчьнкчь, ьч, чбвягщкч сщ юсщиь хвккь, нсж ьк щгщнькч зщнч ряьсряь\n", "ифвжь ивййь як рящбчньб уькьбщс, як иькчбь п'вюьбщчнвкж жчбщчьунряьж: сь\n", "йвяснк пь мьййщюьж пьж сщюнкж... сщ кянч пь йвк щббнгьь, нс д ьк щгщнч\n", "хньк, жщкж йькчнб, якь гнкучщнкь щжжнж ьк бвкп жяб сщ юсщчь-звбйь, ьк\n", "чбщнк пь жь ифщяззьб сьж ющччьж щ як бщдвк пь сякь... сь чьйюж\n", "п'ькчб'вягбнб якь сяищбкь, зббч! гвнсщ сь хнгвящи ьк пьбвячь, ьч чвяж\n", "иьж юьчнчж пьббньбьж хсщкиж рян пьчщськч, сщ ряьяь ьк с'щнб, пщкж сь\n", "звяббь. м'ьжюьбь хньк ря'нсж бьгнькпбвкч.\n", "\n", "ряьсря'як пь чбьж ьчвккь щяжжн, ьк йь гвдщкч, и'ьжч сь свищчщнбь пя\n", "юбьйньб, як гньяш фнхвя жнкнжчбь, щ чьчь пь юькжьяб, рян фщхнчь сь\n", "йвяснк пьюянж юсяж пь гнкуч щкж. мь с'щн чбвягь пщкж сщ ифщйхбь пя фщяч,\n", "нййвхнсь ьч пбвнч жяб с'щбхбь пь ивяифь, щя йнснья пьж юсщчбщж, пьж\n", "чянсьж чвйхььж. нс й'щ бьущбпь як йвйькч щгьи жвк вьнс бвкп; юянж,\n", "чвяч ьззщбь пь кь ющж йь бьивккщнчбь, нс ж'ьжч йнж щ зщнбь: «фвя! фвя!»\n", "ьч щ жьивяьб юькнхсьйькч жьж щнсьж убнжьж пь ювяжжньбь;--иьж пнщхсьж пь\n", "юькжьябж! ищ кь жь хбвжжь мщйщнж... к'нйювбчь! чьс ря'нс ьжч, щгьи жьж\n", "дьяш иснуквчщкчж ьч жщ йнкь бькзбвукьь, иь свищчщнбь жнськиньяш йь юсщнч\n", "ькивбь йньяш ря'як щячбь, ьч мь йь жянж ьйюбьжжь пь сян бьквягьсьб жвк\n", "хщнс. нс ущбпь ивййь пщкж сь ющжжь чвяч сь фщяч пя йвяснк щгьи якь\n", "ькчбьь ющб сь чвнч; йвн мь йь бьжьбгь сщ юньиь пя хщж, якь юьчнчь юньиь\n", "хсщкифнь щ сщ ифщяш, хщжжь ьч гвячьь ивййь як бьзьичвнбь пь ивягькч.\"\"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hum... Ce message contient un mélange de caractères exotiques (cyrilliques) et de ponctuation. Commençons par isoler uniquement les caractères sur lesquels le chiffrement a été appliqué." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "иьжвкчсьжсщюнкжрянвкчьчььчвккьжпьюянжжнсвкучьйюжрянсжгвдщнькчсщювбчьпяйвяснкзьбйььсьжйябжьчсщюсщчьзвбйьькгщфнжющбсьжфьбхьжнсжщгщнькчзнкнющбибвнбьряьсщбщиьпьжйьякньбжьчщнчьчьнкчььччбвягщкчсщюсщиьхвккьнсжькщгщнькчзщнчряьсряьифвжьивййьякрящбчньбуькьбщсякиькчбьпвюьбщчнвкжжчбщчьунряьжсьйвяснкпьмьййщюьжпьжсщюнкжсщкянчпьйвкщббнгььнсдькщгщнчхнькжщкжйькчнбякьгнкучщнкьщжжнжькбвкпжябсщюсщчьзвбйьькчбщнкпьжьифщяззьбсьжющччьжщякбщдвкпьсякьсьчьйюжпькчбвягбнбякьсяищбкьзббчгвнсщсьхнгвящиькпьбвячььччвяжиьжюьчнчжпьббньбьжхсщкижрянпьчщськчсщряьяььксщнбпщкжсьзвяббьмьжюьбьхнькрянсжбьгнькпбвкчряьсряякпьчбьжьчвккьщяжжнькйьгвдщкчиьжчсьсвищчщнбьпяюбьйньбякгньяшфнхвяжнкнжчбьщчьчьпьюькжьябрянфщхнчьсьйвяснкпьюянжюсяжпьгнкучщкжмьсщнчбвягьпщкжсщифщйхбьпяфщячнййвхнсььчпбвнчжябсщбхбьпьивяифьщяйнсньяпьжюсщчбщжпьжчянсьжчвйхььжнсйщбьущбпьякйвйькчщгьижвквьнсбвкпюянжчвячьззщбьпькьющжйьбьивккщнчбьнсжьжчйнжщзщнбьфвяфвяьчщжьивяьбюькнхсьйькчжьжщнсьжубнжьжпьювяжжньбьиьжпнщхсьжпьюькжьябжищкьжьхбвжжьмщйщнжкнйювбчьчьсрянсьжчщгьижьждьяшиснуквчщкчжьчжщйнкьбькзбвукььиьсвищчщнбьжнськиньяшйьюсщнчькивбьйньяшряякщячбььчмьйьжянжьйюбьжжьпьсянбьквягьсьбжвкхщнснсущбпьивййьпщкжсьющжжьчвячсьфщячпяйвяснкщгьиякьькчбььющбсьчвнчйвнмьйьбьжьбгьсщюньиьпяхщжякьюьчнчьюньиьхсщкифньщсщифщяшхщжжььчгвячььивййьякбьзьичвнбьпьивягькч\n" ] } ], "source": [ "s=''.join([x for x in c if x.isalpha()])\n", "print(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comptons le nombre d'occurence de chaque caractère dans ce texte :" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'и': 37, 'ь': 236, 'ж': 99, 'в': 64, 'к': 94, 'ч': 89, 'с': 72, 'щ': 98, 'ю': 34, 'н': 97, 'р': 15, 'я': 83, 'п': 39, 'у': 10, 'й': 43, 'г': 23, 'д': 5, 'б': 84, 'з': 14, 'ф': 14, 'х': 19, 'м': 6, 'ш': 5}\n" ] } ], "source": [ "freq={}\n", "for x in s:\n", " freq[x]=freq.get(x,0)+1\n", "print(freq)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Q1 Calculez l'indice de coïncidence du texte (modifiez le code de la cellule ci-dessous). Que peut-on déduire de la valeur obtenue ?
" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1280\n" ] } ], "source": [ "def ic(freq):\n", " \"\"\"TODO: écrire ici la fonction qui calcule l'IC à partir du dictionnaire de fréquences freq\n", " pour l'instant cette fonction retourne le nombre total de caractères.\"\"\"\n", " n=0\n", " for x in freq:\n", " nx=freq[x] # nombre d'occurences du caractère x\n", " n=n+nx\n", " return n\n", "\n", "print(ic(freq))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Trions les caractères par fréquence décroissante :" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(236, 'ь'), (99, 'ж'), (98, 'щ'), (97, 'н'), (94, 'к'), (89, 'ч'), (84, 'б'), (83, 'я'), (72, 'с'), (64, 'в'), (43, 'й'), (39, 'п'), (37, 'и'), (34, 'ю'), (23, 'г'), (19, 'х'), (15, 'р'), (14, 'ф'), (14, 'з'), (10, 'у'), (6, 'м'), (5, 'ш'), (5, 'д')]\n" ] } ], "source": [ "l=[(freq[c],c) for c in freq]\n", "l.sort(reverse=True)\n", "print(l)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "D'après [Wikipedia](https://fr.wikipedia.org/wiki/Fréquence_d%27apparition_des_lettres_en_français) les caractères les plus fréquents en français sont ESAIN. Voyons ce que ça donne si on transforme les ь en E et ж en S :" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "иE Sвкч сES сщюнкS рян вкч EчE EчвккES!... пEюянS Sн свкучEйюS ря'нсS\n", "гвдщнEкч сщ ювбчE пя йвяснк зEбйEE, сES йябS Eч сщ юсщчE-звбйE EкгщфнS\n", "ющб сES фEбхES, нсS щгщнEкч знкн ющб ибвнбE ряE сщ бщиE пES йEякнEбS\n", "Eчщнч EчEнкчE, Eч, чбвягщкч сщ юсщиE хвккE, нсS Eк щгщнEкч зщнч ряEсряE\n", "ифвSE ивййE як рящбчнEб уEкEбщс, як иEкчбE п'вюEбщчнвкS SчбщчEунряES: сE\n", "йвяснк пE мEййщюES пES сщюнкS... сщ кянч пE йвк щббнгEE, нс д Eк щгщнч\n", "хнEк, SщкS йEкчнб, якE гнкучщнкE щSSнS Eк бвкп Sяб сщ юсщчE-звбйE, Eк\n", "чбщнк пE SE ифщяззEб сES ющччES щ як бщдвк пE сякE... сE чEйюS\n", "п'Eкчб'вягбнб якE сяищбкE, зббч! гвнсщ сE хнгвящи Eк пEбвячE, Eч чвяS\n", "иES юEчнчS пEббнEбES хсщкиS рян пEчщсEкч, сщ ряEяE Eк с'щнб, пщкS сE\n", "звяббE. м'ESюEбE хнEк ря'нсS бEгнEкпбвкч.\n", "\n", "ряEсря'як пE чбES EчвккE щяSSн, Eк йE гвдщкч, и'ESч сE свищчщнбE пя\n", "юбEйнEб, як гнEяш фнхвя SнкнSчбE, щ чEчE пE юEкSEяб, рян фщхнчE сE\n", "йвяснк пEюянS юсяS пE гнкуч щкS. мE с'щн чбвягE пщкS сщ ифщйхбE пя фщяч,\n", "нййвхнсE Eч пбвнч Sяб с'щбхбE пE ивяифE, щя йнснEя пES юсщчбщS, пES\n", "чянсES чвйхEES. нс й'щ бEущбпE як йвйEкч щгEи Sвк вEнс бвкп; юянS,\n", "чвяч EззщбE пE кE ющS йE бEивккщнчбE, нс S'ESч йнS щ зщнбE: «фвя! фвя!»\n", "Eч щ SEивяEб юEкнхсEйEкч SES щнсES убнSES пE ювяSSнEбE;--иES пнщхсES пE\n", "юEкSEябS! ищ кE SE хбвSSE мщйщнS... к'нйювбчE! чEс ря'нс ESч, щгEи SES\n", "дEяш иснуквчщкчS Eч Sщ йнкE бEкзбвукEE, иE свищчщнбE SнсEкинEяш йE юсщнч\n", "EкивбE йнEяш ря'як щячбE, Eч мE йE SянS EйюбESSE пE сян бEквягEсEб Sвк\n", "хщнс. нс ущбпE ивййE пщкS сE ющSSE чвяч сE фщяч пя йвяснк щгEи якE\n", "EкчбEE ющб сE чвнч; йвн мE йE бESEбгE сщ юнEиE пя хщS, якE юEчнчE юнEиE\n", "хсщкифнE щ сщ ифщяш, хщSSE Eч гвячEE ивййE як бEзEичвнбE пE ивягEкч.\n" ] } ], "source": [ "print(c.translate(str.maketrans('ьж','ES')))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Q2 Terminez de déchiffrer le message en modifiant la cellule ci-dessus.
\n", "
Q2bis C'est un peu laborieux de le faire à la main. Réfléchissez à une méthode plus automatique pour trouver la substitution (on ne vous demande pas de la programmer pendant le TP).
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Chiffre poly-alphabétique\n", "\n", "Le second exercice consiste à déchiffrer le message ``c`` suivant chiffré avec le chiffre de Vigenère :" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "c=\"\"\"\n", "UYOTENOZQWIPZUITCWWZATBCPEYBTIEOCLEROQPPEDZQWEDYWMLAWTXATBGXATMPXBWIPGHPAOEIDBTS\n", "IDRCVDTVKIRDMVEIPVVINEZCMNOMNISAMKRDCMGRRZCIIAWQEISLDCRCLXQYRWMUVERITHECMVEUXWOI\n", "NEWWILWMCTPCWELATBGPLPMPINEMPHIECPUUTLKWATBHEIDLQRCLBVINEQQRCTVSITYMOICWIDSUDAGT\n", "ADIKRSTIXICEIRIIYBWVENMPISEXCWDPUCJAFBGHIEKKRQOCPXOYJQYRCCEISEAGTTBCKQAAWWWSPTGG\n", "OFLGPAOMUWUDAGTTWMXELPAAIUIMVHIEKGWTNMNECTVSNEEMBXOFRQYRDTGFLLUGWUCTGWAFBTISGWWW\n", "FPZKIZMQGRDPDQYSEIKVEGWWWDTBEMNBRCMEYBGRDFTCVETVGHICMRESATWWTLZFUUPPKIRBCGZOFAOI\n", "RTBKIZOMVVEOMEEPTBGTOFZSYOTLQRCNMNEDTBEILFQSYILDCMTAITPEWMRVEXQGVCPTCREGWWWRPOCV\n", "DPXCWDPCZHIEAGTTDQHEIEKGPAWMTIGLZFIDTBEMNBMVNEGIKWLPTWMDTZGGEDBRSUCIXSICIRTOCBGE\n", "LLKWMSTVKIRPLGWOTOPSNDLGXUWQRIAFTKIUOWKKNZVUEMLVIIRDMRXJPBCPADWPTIYKGEUPBUICCQCM\n", "TOMVSUEMUPEDQPNUDBKGEDTQVSBCGWEDZGKACLUXOXJGVEYBRERSIUEROAWVAWQEIQFQTISEIKXLLINI\n", "SCMIEROMTITTTUIRPBKRTEWWXANWWTLPACYTCMUWECMVSUCVGVEYBCYSDQGXTZCUJICMPXUYXTSFZVFW\n", "AWCVZOFLTMEKDQYSLDQMRWIDSNEMFIMPLKVEAWWVQFWKZOFARIIRVGDCPATSSPAFIMLVFEAWQEIUYXGY\n", "TTUKHEXMPXCTVSITDMRXNPLKVEYBTMEYUCMSCMIEROMTINELGYXOMWBCZUOINNICZOTFDESDMNIFLQVI\n", "SEDQCEKDQYSXIFIMZQUILWMSYIWLGZRLQVCAGWKVINQWRRZAKIRLNNIUCATSURMUITYWWWEYIXSNDUKW\n", "UYIHPEFZUFLLVELEDXCVECZGYRDQNERPQPISPVCTECKGZATBPSUDIWVIZVUXOFANETPBGXRLVELEPDQY\n", "SNWOTRPVGDAFAUMMLLGQOTAGPLPDQYSGWAIZBCGROFAHEIDWPWDPVQXRPUKIUIIXENEYWILWMXMEYVGT\n", "OFZCGEXWOINEKKRQBCKEVLQVVERITHEEWWXLPBGQPDIXICTVSYIPBWHEOMNEUEZGGOEMFYJLZFMNDMEV\n", "ILTCVETVGPACMKREPBNISEZQMSZCXVIPZUWEAZGGIAQVIRPVVEUDAKXOETCJANMESNEZGXECZGMLDMHE\n", "IDIKXUYOTENOJTYIELGTADMVELTKGWECMVSUCVCHEDQTIUDMFIVZQTPACMKREOIDSRODGRATMPXDPAUS\n", "LOIVWPZZVENELGWPTYWISTTUITLQGRTEWWWFLQVWCZUOILPALEROQPMECANSNRAGXPWIVWLPAOEIYAGX\n", "LPARMEOACYXNWKRSPVUYIEMXINLQGRTWMUHIIKQYREQUENDKGYXNQGXATMPXTZCUTACMUHENITVELCZH\n", "EOQCQAYBGXMLZELATMPXDPCZEDPCZGOXUGPEDAQPDLBUHECZKIRPMWBVPVCMEYBNISPVHENEAFILLZGM\n", "NPQNCEYIXEIELKBEETGWPPBKXSNPGVUMQPWGLUDEDLQGRTUWAIUDMOINEAGXEYIPXPLZNEMLQPHEFFCH\n", "EFFKPSPBCMEYBVSUDWTREDLGGUCACTRPAGYXGMPEIPVVPEDQPZIEMUHEDZQMSPBFISCMKREDXQYRWIRP\n", "UAITXDLVUPEYWOFRPINMCPZGGOYVWXLPTCTIYJNENNQNEVLQVPATZGQUPBCKIEMGRPLZNENEAQYRTIKX\n", "AEWWXCPYWSNOQUEIEMVTADACWAYAHEICMCXTPVVMOYIGPLPAWMVLQVPEGINITOMEYRAWTXAYBNECZCTS\n", "NYMUYRFVESUDAKRDPDGPOFZUITQMTQAYBEITEMNSNRCGTRZKGWSTWPPECWKITWITIIYMFICFZCPINMPI\n", "SLDCMTAIUEUUCUXEDQGPLPLGZATBUIPCWUXECVGVCZUOILPAVVOTALEROQPMECAOEIDMNPEYMUIRLXRI\n", "LLQVTADIXSICRCQATAGRTPVFYPLZNIROCPIPLZGMLWMHSRXINMTPMVHATTNIUCACUUZQUIRGQTEIPVVP\n", "EDXTSCPAUMOYARINDIVILWMUMLPAIINDIXEIPVVESPUGXTCMNEFLKGGOYBTITPZTIDPNCGOYIPIPLANI\n", "SGWKVEWTGVEDBCHOYKFIBZCVESLXNECPMVETEMPHIEYWENOTCTRZKGWSTWPJUEITVIGMGINQIEIDLTKG\n", "EEWWXLPUQRDPACVRPBCTOFZNERPOCVDPZGXLLZGMNPLKXSPDGVEXMPXQFQGWTNMGPLPACHRPAUEIEIWZ\n", "AWMVHENCTUUTAGGOYBGRTLLGWAWCGVEELGWOFZKVEAWWVTZCVIRPXQRSPQFMOELKXLLZGMNPMPVEUMVE\n", "NETCXEEMGRACZKIRPIXICTURETTMPGEPBUITZCTRAYBXIRDINMCPMNPENWPXIYCCZOEZGROXXGXIEMLI\n", "MPVQQMPINMCPAKPPWIKXAGWVVEXILISEMFMTLTKGEQWTXPZTKQEYBOEIDMNPELRQYTLMPILWMOIMPKGW\n", "GPVUPAYMUSNEIRVEDBQYTBCWRPLYWITOMEEREMUTOFZSYOTMPEUCIKWJPXGYRPBSYIDWPXCPCZGIOQVP\n", "ACMKREXWPXRLVVHUOWKKTWMUXRZQUNACLKRIPZUITPVFYSLCVSUCLWVODQGVCLZXSUDKQQPCMPIZBCGG\n", "OXUGMLDIXEIPVVPAQIEICZVVVEEMTVEPBSYEWMFISDQPUUTTUEVLQGRTDCTPEOWUITLQVPEXMOIQFMEI\n", "LFQFISLCVVEDKCVTPAFYPLYWITPTNINPXQYVLQVWAGWKVSTTUITLQGRTOMUNACLKRIPZUHEDAQPDLBUH\n", "EDKQYREQUENDWWFIPVVVOTAFISPARVOAZGWEYNCRTDKQQMPVVZOFTGDVZCUUUPRGPEDIELEOQVELTKGE\n", "VPKWRCZCTEGPYWMLLAWVPCQVILWMOIMPKGPAYMUXPLAOSNLNHEICMCQOTTCVETVGHEGQPXPZCTTRPLGG\n", "OWMTIEEIRVEDTCZOTZESNDQFIRPMWRMZUGRTLDGGDPAAIUINNEMMWAENEAESMXMEIUILWREMMVIFLCXI\n", "EWTGWEXQVECCQGVQFWPPUTKQYPPTCXEEMSYEWTGMDPMFMTLTKGEEZGWHLCVITOCPXOYLGGIOMNERPQPI\n", "SPBWXLPZQMLFQRSSLTCQATVUYRWMDVADMVPUTLKXTTUKHEXMPXCZVUMDPZGDDZVEQANPGVELUKIQFMEI\n", "NPAVUUFVGINQIPXLLZGMNPTWMTZCTRAWMFSSLDGGCZTGVEPBFMTLCXELPBTITZCTREKTGWCPYWIFTBNI\n", "VLTGXTCMUWOTOPIUDMOINELWFOFBFYPTMFHEMWWXDTBNERPQPIDFVGZOTFHSREMGXSEZKHEYBGPEDBTS\n", "IDRCVDTVKIRDAGVEWMXIRPVVELTVUXAYBGXSPUKVEYBCWAWCGVLPZQMLLZGMNPTGWJPCPISAZKRCPAGX\n", "TZCVPEXWPHEQQPMSDMBGRTINERPQPIVZCUQEEWWVDTAUIZLTQVSDMVSUCVCRTGMTWLPZQWIPZGPLPKQR\n", "TTVWEQFMUXCPYWIVZCUJATBGWDZVEPALDGGLPJQRPWIKWICLGZOEZGQAUMUXEOQVHEFFFYNEWPXRPAJY\n", "MMTGQEEBCRTFVIINZCGRTPZTINZCUXANPKSNDRGPEGWKWBTMPHIETCVETVGUUTIXEIEXGRDLVVGEEMOT\n", "SPFCQIYMNISCWUISBCQRLPCTGOFXGPAEMVI\n", "\"\"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Voici quelques fonctions qui devraient vous aider :" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def tolet(x):\n", " \"transforme l'entier [x] en la [x]ième lettre majuscule (modulo 26)\"\n", " return chr(65+x%26)\n", " \n", "def toint(c):\n", " \"tranforme la lettre majuscule [c] en sa position dans l'alphabet (de 0 à 25)\"\n", " return ord(c)-65\n", "\n", "def shift(c,d):\n", " \"\"\"décale la lettre [c] de k positions dans l'alphabet (modulo 26)\n", " où [k] est la position de la lettre [d] dans l'alphabet\"\"\"\n", " return tolet(toint(c)+toint(d))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "from unicodedata import normalize\n", "\n", "def nettoie(m):\n", " \"nettoie la chaîne [m] en ne gardant que les lettres débarassées de leurs accents et passées en majuscules\"\n", " return ''.join([c for c in normalize('NFKD',m).upper().strip() if ord(c)>64 and ord(c)<91])" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "POULE\n", "LAPIN\n", "-----\n", "AOJTR\n" ] } ], "source": [ "sx=nettoie(\"poule\")\n", "print(sx)\n", "sy=nettoie(\"lapin\")\n", "print(sy)\n", "print(\"-----\")\n", "# décale le mot [sx] en utilisant les lettres successives de [sy] comme valeurs de décalage\n", "print(''.join([shift(sx[i],sy[i]) for i in range(len(sx))]))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "UYOTENOZQWIPZUITCWWZATBCPEYBTIEOCLEROQPPEDZQWEDYWMLAWTXATBGXATMPXBWIPGHPAOEIDBTSIDRCVDTVKIRDMVEIPVVINEZCMNOMNISAMKRDCMGRRZCIIAWQEISLDCRCLXQYRWMUVERITHECMVEUXWOINEWWILWMCTPCWELATBGPLPMPINEMPHIECPUUTLKWATBHEIDLQRCLBVINEQQRCTVSITYMOICWIDSUDAGTADIKRSTIXICEIRIIYBWVENMPISEXCWDPUCJAFBGHIEKKRQOCPXOYJQYRCCEISEAGTTBCKQAAWWWSPTGGOFLGPAOMUWUDAGTTWMXELPAAIUIMVHIEKGWTNMNECTVSNEEMBXOFRQYRDTGFLLUGWUCTGWAFBTISGWWWFPZKIZMQGRDPDQYSEIKVEGWWWDTBEMNBRCMEYBGRDFTCVETVGHICMRESATWWTLZFUUPPKIRBCGZOFAOIRTBKIZOMVVEOMEEPTBGTOFZSYOTLQRCNMNEDTBEILFQSYILDCMTAITPEWMRVEXQGVCPTCREGWWWRPOCVDPXCWDPCZHIEAGTTDQHEIEKGPAWMTIGLZFIDTBEMNBMVNEGIKWLPTWMDTZGGEDBRSUCIXSICIRTOCBGELLKWMSTVKIRPLGWOTOPSNDLGXUWQRIAFTKIUOWKKNZVUEMLVIIRDMRXJPBCPADWPTIYKGEUPBUICCQCMTOMVSUEMUPEDQPNUDBKGEDTQVSBCGWEDZGKACLUXOXJGVEYBRERSIUEROAWVAWQEIQFQTISEIKXLLINISCMIEROMTITTTUIRPBKRTEWWXANWWTLPACYTCMUWECMVSUCVGVEYBCYSDQGXTZCUJICMPXUYXTSFZVFWAWCVZOFLTMEKDQYSLDQMRWIDSNEMFIMPLKVEAWWVQFWKZOFARIIRVGDCPATSSPAFIMLVFEAWQEIUYXGYTTUKHEXMPXCTVSITDMRXNPLKVEYBTMEYUCMSCMIEROMTINELGYXOMWBCZUOINNICZOTFDESDMNIFLQVISEDQCEKDQYSXIFIMZQUILWMSYIWLGZRLQVCAGWKVINQWRRZAKIRLNNIUCATSURMUITYWWWEYIXSNDUKWUYIHPEFZUFLLVELEDXCVECZGYRDQNERPQPISPVCTECKGZATBPSUDIWVIZVUXOFANETPBGXRLVELEPDQYSNWOTRPVGDAFAUMMLLGQOTAGPLPDQYSGWAIZBCGROFAHEIDWPWDPVQXRPUKIUIIXENEYWILWMXMEYVGTOFZCGEXWOINEKKRQBCKEVLQVVERITHEEWWXLPBGQPDIXICTVSYIPBWHEOMNEUEZGGOEMFYJLZFMNDMEVILTCVETVGPACMKREPBNISEZQMSZCXVIPZUWEAZGGIAQVIRPVVEUDAKXOETCJANMESNEZGXECZGMLDMHEIDIKXUYOTENOJTYIELGTADMVELTKGWECMVSUCVCHEDQTIUDMFIVZQTPACMKREOIDSRODGRATMPXDPAUSLOIVWPZZVENELGWPTYWISTTUITLQGRTEWWWFLQVWCZUOILPALEROQPMECANSNRAGXPWIVWLPAOEIYAGXLPARMEOACYXNWKRSPVUYIEMXINLQGRTWMUHIIKQYREQUENDKGYXNQGXATMPXTZCUTACMUHENITVELCZHEOQCQAYBGXMLZELATMPXDPCZEDPCZGOXUGPEDAQPDLBUHECZKIRPMWBVPVCMEYBNISPVHENEAFILLZGMNPQNCEYIXEIELKBEETGWPPBKXSNPGVUMQPWGLUDEDLQGRTUWAIUDMOINEAGXEYIPXPLZNEMLQPHEFFCHEFFKPSPBCMEYBVSUDWTREDLGGUCACTRPAGYXGMPEIPVVPEDQPZIEMUHEDZQMSPBFISCMKREDXQYRWIRPUAITXDLVUPEYWOFRPINMCPZGGOYVWXLPTCTIYJNENNQNEVLQVPATZGQUPBCKIEMGRPLZNENEAQYRTIKXAEWWXCPYWSNOQUEIEMVTADACWAYAHEICMCXTPVVMOYIGPLPAWMVLQVPEGINITOMEYRAWTXAYBNECZCTSNYMUYRFVESUDAKRDPDGPOFZUITQMTQAYBEITEMNSNRCGTRZKGWSTWPPECWKITWITIIYMFICFZCPINMPISLDCMTAIUEUUCUXEDQGPLPLGZATBUIPCWUXECVGVCZUOILPAVVOTALEROQPMECAOEIDMNPEYMUIRLXRILLQVTADIXSICRCQATAGRTPVFYPLZNIROCPIPLZGMLWMHSRXINMTPMVHATTNIUCACUUZQUIRGQTEIPVVPEDXTSCPAUMOYARINDIVILWMUMLPAIINDIXEIPVVESPUGXTCMNEFLKGGOYBTITPZTIDPNCGOYIPIPLANISGWKVEWTGVEDBCHOYKFIBZCVESLXNECPMVETEMPHIEYWENOTCTRZKGWSTWPJUEITVIGMGINQIEIDLTKGEEWWXLPUQRDPACVRPBCTOFZNERPOCVDPZGXLLZGMNPLKXSPDGVEXMPXQFQGWTNMGPLPACHRPAUEIEIWZAWMVHENCTUUTAGGOYBGRTLLGWAWCGVEELGWOFZKVEAWWVTZCVIRPXQRSPQFMOELKXLLZGMNPMPVEUMVENETCXEEMGRACZKIRPIXICTURETTMPGEPBUITZCTRAYBXIRDINMCPMNPENWPXIYCCZOEZGROXXGXIEMLIMPVQQMPINMCPAKPPWIKXAGWVVEXILISEMFMTLTKGEQWTXPZTKQEYBOEIDMNPELRQYTLMPILWMOIMPKGWGPVUPAYMUSNEIRVEDBQYTBCWRPLYWITOMEEREMUTOFZSYOTMPEUCIKWJPXGYRPBSYIDWPXCPCZGIOQVPACMKREXWPXRLVVHUOWKKTWMUXRZQUNACLKRIPZUITPVFYSLCVSUCLWVODQGVCLZXSUDKQQPCMPIZBCGGOXUGMLDIXEIPVVPAQIEICZVVVEEMTVEPBSYEWMFISDQPUUTTUEVLQGRTDCTPEOWUITLQVPEXMOIQFMEILFQFISLCVVEDKCVTPAFYPLYWITPTNINPXQYVLQVWAGWKVSTTUITLQGRTOMUNACLKRIPZUHEDAQPDLBUHEDKQYREQUENDWWFIPVVVOTAFISPARVOAZGWEYNCRTDKQQMPVVZOFTGDVZCUUUPRGPEDIELEOQVELTKGEVPKWRCZCTEGPYWMLLAWVPCQVILWMOIMPKGPAYMUXPLAOSNLNHEICMCQOTTCVETVGHEGQPXPZCTTRPLGGOWMTIEEIRVEDTCZOTZESNDQFIRPMWRMZUGRTLDGGDPAAIUINNEMMWAENEAESMXMEIUILWREMMVIFLCXIEWTGWEXQVECCQGVQFWPPUTKQYPPTCXEEMSYEWTGMDPMFMTLTKGEEZGWHLCVITOCPXOYLGGIOMNERPQPISPBWXLPZQMLFQRSSLTCQATVUYRWMDVADMVPUTLKXTTUKHEXMPXCZVUMDPZGDDZVEQANPGVELUKIQFMEINPAVUUFVGINQIPXLLZGMNPTWMTZCTRAWMFSSLDGGCZTGVEPBFMTLCXELPBTITZCTREKTGWCPYWIFTBNIVLTGXTCMUWOTOPIUDMOINELWFOFBFYPTMFHEMWWXDTBNERPQPIDFVGZOTFHSREMGXSEZKHEYBGPEDBTSIDRCVDTVKIRDAGVEWMXIRPVVELTVUXAYBGXSPUKVEYBCWAWCGVLPZQMLLZGMNPTGWJPCPISAZKRCPAGXTZCVPEXWPHEQQPMSDMBGRTINERPQPIVZCUQEEWWVDTAUIZLTQVSDMVSUCVCRTGMTWLPZQWIPZGPLPKQRTTVWEQFMUXCPYWIVZCUJATBGWDZVEPALDGGLPJQRPWIKWICLGZOEZGQAUMUXEOQVHEFFFYNEWPXRPAJYMMTGQEEBCRTFVIINZCGRTPZTINZCUXANPKSNDRGPEGWKWBTMPHIETCVETVGUUTIXEIEXGRDLVVGEEMOTSPFCQIYMNISCWUISBCQRLPCTGOFXGPAEMVI\n" ] } ], "source": [ "m=nettoie(c)\n", "print(m)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Q3 Définir une fonction permettant d'extraire à partir d'un message m les k sous-textes pour une taille de clé k.
" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "def extraireSousTextes(m,k):\n", " lesTextes = []\n", " \"\"\"TO DO\"\"\"\n", " return lesTextes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Q4 Définir une fonction calculICMoyen permettant de calculer l'IC moyen d'une liste de n textes.
" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def calculICMoyen(textes):\n", " resultat = 0.0\n", " \"\"\"TO DO\"\"\"\n", " return resultat" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dans le chiffre de Vigenère, chaque sous-texte est chiffré par un simple décalage alphabétique (comme pour le chiffre de César). Pour retrouver le décalage d'un sous-texte suffisamment long, il suffit de chercher la lettre la plus fréquente, qui devrait correspondre à la lettre E.\n", "\n", "
Q5 Écrire une fonction trouveLeE qui retourne la lettre la plus fréquente d'un texte. Définir une fonction calculeDecalage qui calcule, à l'aide de trouveLeE le décalage alphabétique le plus probable pour un sous-texte.
\n", "\n", "Ainsi, si la lettre la plus fréquente de texte est la lettre P alors trouveLeE(texte) retourne P et calculerDecalage(texte) retourne 11." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def trouveLeE(texte):\n", " \"TODO\"\n", " pass\n", "\n", "def calculerDecalage(texte):\n", " resultat = 0\n", " \"\"\"TO DO\"\"\"\n", " return resultat" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Q6 Définir une fonction calculerDecalages\n", " qui, à partir d'une liste de textes, retourne les décalages pour chacun des textes.
" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "def calculerDecalages(textes):\n", " resultat = [] \n", " \"\"\"TO DO\"\"\"\n", " return resultat" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Q7 Définir une fonction constructionCle qui à partir d'une liste de décalages entre 0 et 25 reconstruit la clé (chaîne de caractère). Par exemple : constructionCle([0, 2, 4]) retourne \"ACE\"
" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def constructionCle(decallages):\n", " cle=''\n", " \"\"\"TO DO\"\"\"\n", " return cle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Q8 Définir une fonction constructionCleDechiffrement qui à partir d'une clé de chiffrement calcule la clé de déchiffrement. Par exemple, si la clé de chiffrement est 'ABC', la clé de déchifrement est 'AZY'." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "def constructionCleDechiffrement(cle):\n", " cleResultat=''\n", " \"\"\"TO DO\"\"\"\n", " return cleResultat" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Q9 Définir la fonction chiffrementVigenere qui à partir d'un texte et d'une clé chiffre le texte en fonction de cette clé.
" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "def chiffrementVigenere(texteClair,cle):\n", " chiffre =''\n", " \"\"\"TO DO\"\"\"\n", " return chiffre" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Q10\n", "En utilisant la clé de déchiffrement que vous pouvez calculer et en appliquant l'algorithme de chiffrement vous pouvez alors déchiffrer le message m.
" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "# TODO\n", "clair = \"There is no cake\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Masque jetable (bonus)\n", "\n", "Dans le cadre de chiffrement de messages alphabétiques, on peut voir le chiffrement du masque jetable comme un cas particulier du chiffrement de Vigenère dans lequel la clé est aléatoire, à usage unique et de même longueur que le message.\n", "\n", "Déchiffrer le message suivant à l'aide de son masque." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "c = \"UYEXOFSCKAGMDKLYJWQSZSNIBI\"\n", "otp = \"THECAKEISALIETHEREISNOCAKE\"\n", "## TODO : calculer m !" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bien utilisé, le masque jetable assure le secret parfait. Cependant, le simple fait de réutiliser le même masque pour plusieurs messages différents permet parfois de déchiffrer les messages à partir des chiffrés et d'un extrait connu d'un des messages !\n", "\n", "À vous de jouer avec les trois messages ci-dessous qui ont été chiffrés avec une même clé. Il est fort probable que le mot BONJOUR apparaisse au début d'un des messages en clair." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "ca = \"JZLJILRENTAMQPXJIXINSGDGUYSNOLVWUAAUPASVWFQRRXXOEWMRHQAVRVELRXILWPFAPDS\"\n", "cb = \"OZMDGFRNCFYTDXBAGTVPKTNWLHQGBZICFOZWZNQFEDLCFYGAZKNVDHELFWTKUZXRRGNWDKY\"\n", "cc = \"OFREHKAGGWAVHXTISGCZHWEURHRJSUDCLCUWYWXCPWWQDICAEUWVGOPZECPWSRYJWPRAWGM\"\n", "### TODO : calculer ma, mb et mc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Chiffre autoclave (bonus)\n", "\n", "Ce dernier exercice est un exercice _bonus_ pour ceux que César et Vigenère auront laissé un peu sur leur faim.\n", "\n", "Le message ``c`` suivant a été chiffré en utilisant le chiffre autoclave. \n", "\n", "Pour éviter une cryptanalyse sur le modèle du deuxième exercice, le chiffre autoclave décale le message en clair ``m`` non pas en répétant la clé secrète ``k`` autant de fois que nécessaire mais plutôt en décalant le message ``m`` à l'aide de la concaténation de ``k`` et de ``m``. Ainsi, le chiffrement de ``COPTERE`` avec la clé ``ELI`` revient à décaler ``COPTERE`` avec la suite de décalage ``ELICOPTERE`` (4, 11, 8, 2, ...) ce qui donne ``GZXVSGX``." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "c=nettoie(\"\"\"\n", "VOMDHTZILNIMMIYQGYPRQZSAXWGKHRFXLBKVWBWIIKMKVWZSZWLVOMHKGHVXVERSTXUQXAVBATNCIMFG\n", "UGIJVCVRUGEIQQADEWKATULPFQWSNTIYEWSRBSTTUJUFHKSLOZOCKUDPLHYHXQJIDGXZAVBEJAKSAUFX\n", "XTKFLXLUSJIFFSUVLARIFTMEKJZVPQDWKYWMQHUTYQHENYHHXXVNWAZKGTLUNZFLCOKISQUDSFPDDLEF\n", "FBLRUGOIGUHURXSQRLSUZDISUZEKXGHRFHXNUJDVHWPTAVDLVAZHICPSEQGPIXVJXMHRBTRBVLIZHVGV\n", "STSAVTUSJMEKKYXEWCLORBPLJYTAFCOHYMYYNPVOEDRHRDBBLYHNUPLRGFSRRPXHFTUIVSHIRFXZRRZX\n", "CVVUTDITCXVXQENVKSAXBYIYTNYRCECKUYUBULWRNTIKWUKWWDAHHMMOGNMZBFUHBRGAIVMFXHCNQTLO\n", "RDKXANEKYTJJUFEQSYLYLJIRRRQXFJPYMOBFVXRAPVEJMYKOFBVSSFHQYKDOLUMZTECXBXENYVRNHMIY\n", "VHMEESBUKLDMYKSNRPHFFEXKJDVHWPTAVDLVAZHICPSEQGPGZICIGRAUHLHAIHXIIOLURSBKXEONHGKS\n", "XXRRWFLIBMZSGEIKOSMPDWHODTURRFSQPGRXSSWPIMVYXPWPYNLYDONPSCDTELWTZACKKWHJVKJHTJHF\n", "NVGHNLYEYGFESATRMAUGBIILOKWSHLXDAQLSFACVRGGIFWXCWCTEASCTBXPLTTVTGGHRMAZDLVRLZGZI\n", "FUGBSQQAASQWHVSXWFHHRSLXBAQROMLYEQPSPMSYOWGAHWOCSRXZVMJTRKAFSENFMVVLRBZVVWMSIGZX\n", "OSGKHBFSQHUIDRHWPTAVDLVAZHICPSEQGPAYLWILVHWIXMMVQEXQLXSEQGPIXLJMVSVQQRTUGIRQKQSG\n", "LTXSEQGPIQMZPNFRXLXTVVAFWQOSGLTXSEQGPWSQGIUVCCIBMCEKLJTOKAETMPSEQGPAYLRLEABKBVRB\n", "SUUMZMLOJAAETMPSEQGPSEQGPSEQGPSEQGPSEQGP\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Qbonus Déchiffrez le message c. On pourra par exemple proposer une technique astucieuse qui combine les caractères du message c pour transformer un chiffre autoclave de clé de longueur n en un chiffre de vigenère de clé de longueur 2n et utiliser les techniques vues précédemment.
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# TODO\n", "pass" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9" } }, "nbformat": 4, "nbformat_minor": 1 }