{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "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": [ "