2017/05/25 16:21 1/6 Chiffrement Chiffrement Solutions Outils Dans ce TP, nous allons manipuler des chaînes de caractères. Le type str (chaînes en Python) est très semblable aux tuples et aux listes : ce sont des séquences itérables (on peut écrire for caractere in chainecarac si chainecarac est une chaîne) on accède à un élément (un caractère) par son indice dans la chaîne (chaine[0] est le premier caractère) la longueur d'une chaîne s est renvoyée par len(s) comme les tuples, les chaînes ne sont pas modifiables on peut concaténer des chaînes avec l'opérateur + on peut transformer des chaînes en listes et inversement (si s est une chaîne de caractères et l une liste de caractères) : l=list(s) s="".join(l) on peut associer une valeur numérique à un caractère : ord("A") donne 65 on peut associer un caractère à une valeur numérique : chr(65) donne "A" on peut mettre une chaîne en capitales avec s.upper() on peut obtenir la liste des capitales avec import string ; string.ascii_uppercase on peut entrer des chaînes de caractères de plusieurs lignes en les encadrant de trois guillemets (simples ou doubles) on peut remplacer une sous chaîne avec string.replace (chercher dans l'aide) il est parfois utile de transformer une chaîne en liste, puis de manipuler des listes en compréhension, pour filtrer certains caractères par exemple (demandez si vous ne savez pas faire) on peut tester la présence d'une sous-chaîne dans une chaîne : l'expression : "quoque" in "tu quoque mi fili" est une valeur booléenne. En plus du code, vous rendrez un rapport dans lequel vous commenterez et détaillerez tout le code que vous avez dû écrire à l'exception des fonctions qui vous sont demandées. Par exemple, pour déchiffrer le premier message secret, vous serez probablement amené à coder une boucle testant plusieurs possibilités. Vous devez détailler et expliquer cela dans le rapport. Quelques tests sont donnés en partie 4. Utilisez les avant d'avoir fini le TP, pour vérifier que ce que vous faites fonctionne correctement. Informatique, Programmation, Python, Enseignement... - https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/ Last update: 2017/01/10 22:59 tp:python:crypto01_python https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/doku.php/tp:python:crypto01_python Une fois terminé, votre fichier contiendra normalement des fonctions cesar, dechiffre_vigenere, transpose, et peut être d'autres), et une partie «script», qui correspondra sans doute aux tests que vous avez fait, aux essais, et au code permettant de déchiffrer les messages du TP. Avant de rendre le fichier, mettez en commentaire (sélection + Ctrl-R) toute la partie script et ne laissez que les fonctions non commentées, comme si vous fournissiez une bibliothèque d'outils. Si vous n'êtes pas sûr d'avoir bien compris cette consigne, demandez à la personne qui encadre le TP ! 1 Chiffre de César Crypter un texte avec le chiffre de César revient à opérer un décalage des lettres. La valeur du décalage peut être considérée comme la clé de chiffrement. Par exemple, crypter le texte : IL FAIT BEAU A POITIERS en utilisant un décalage de 3 donne : LO IDLW EHDX D SRLWLHUV. Un décalage de -3 redonne évidemment le texte d'origine. On considère généralement que l'alphabet est cyclique, c'est à dire qu'en décalant le Z de 2 rangs, on tombe sur le B. Il est aussi habituel de n'utiliser que des lettres majuscule, ce que nous ferons ici. Écrivez une fonction (vous l'appellerez cesar) qui prend en paramètre une chaîne et un entier (positif ou négatif) et chiffre (ou déchiffre puisque c'est la même chose) en utilisant la méthode de César. Par exemple : cesar("BONJOUR",2) doit renvoyer DQPLQWT. Votre fonction doit chiffrer les lettres capitales uniquement. Les autres caractères doivent rester inchangés. Par exemple : cesar("ALEA JACTA est",2) doit renvoyer CNGC LCEVC est Utilisez votre fonction pour tester rapidement plusieurs décalages. Décryptez ainsi ce message : XBHUK IPLUL TKLJL AYPLU UHULH LSSHW SBFKP LTHPZ PAWVP WHUAH ZIHOF SSLXB ULAYV BKVYH HUBYN ZAXBL JLZAV UJAKL NYBLS LAKLT PSHCV BCHKL CLJXB LLASB SHMBL PAWHY ZJYPW LBASL HUKHU PALUC KHUZL LZBUK FTVUZ PSSLK ALSSL ABYL BLSPU AHBKP VFLVB ZJYPW PHTLU AYHSL LWHWP ZBIAP https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/ ZJYPW JATLZ CYPAS ATHPZ ALUAH JHZHX LYLZA SPALX APVUP ZHNPL LZSLA ZLBSL ISLSV BVFWH VPALZ BLSVU SMLBA YSLUV AYLZL TLUAB YZHWW UBYNL JYPWA UFCLV Printed on 2017/05/25 16:21 2017/05/25 16:21 3/6 Chiffrement Qui en est l'auteur ? Vous pouvez utiliser Internet et un moteur de recherche pour répondre à cette question (encore que..) (Et lorsque vous aurez la réponse, gardez la pour vous….) 2 Chiffre de Vigénère Le chiffre de Vigénère est une méthode permettant de crypter un texte, à partir d'une clé (mot de passe). Le texte ne pourra être lisible que par la personne possédant la bonne clé. Le chiffre de Vigénère est basé sur le carré de Trithème : abcd e f gh i j k l m n o pqr s t u v w x y z aabcde f gh i j k l mn o pqr s t u v wx y z bbc de f g hi j kl mn o p qr s t uv w x y z a cc def g h i j k l mn o p q r s t u vwx y z a b …………………………………………….. eef ghi j k l mno p q r s t uvwxy z a b c d …………………………………………….. i i j kl mn o p q r s t u v w x y z a bc d e f g h …………………………………………….. oopqr s t uv w xy z a b c de f g hi j k l mn ppqr s t u v wx yz a b c d e f gh i j k l mn o …………………………………………….. r r s t uv wx y z ab c d e f ghi j kl mn o p q …………………………………………….. yyz abc d e f g hi j k l mno pq r s t u v w x zz a bc d e f g h i j k l mn o pqr s t u v w x y Chaque ligne du tableau représente un alphabet décalé. Le résultat du cryptage du caractère 'O' (voir colonne o) avec le caractère 'Y' (ligne y) est donc : 'M'. Si la clé est plus courte que le texte, on la recopie plusieurs fois. À titre d'exemple, crypter le texte BONJOUR TOUT LE MONDE avec la clé POITIERS donne : QCVCWYI LDIB EM QFFSS (en effet, crypter B avec P donne Q, crypter O avec O donne C etc…). Inversement, donc, déchiffrer QCVCWYI LDIB EM QFFSS avec la clé POITIERS doit redonner BONJOUR TOUT LE MONDE. Vous devez écrire une fonction qui déchiffre. Écrivez une fonctions, permettant de décrypter une chaîne de caractères en utilisant le chiffre de Vigénère. Votre fonction s'appellera dechiffre_vigenere(s,p) où s est la chaîne à déchiffrer et p est le mot de passe (qu'on supposera donné en capitales). Votre fonction doit déchiffrer les lettres capitales uniquement. Les autres caractères doivent rester inchangés. Testez votre programme de décryptage sur le cryptogramme suivant : crypt11b.txt Informatique, Programmation, Python, Enseignement... - https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/ Last update: 2017/01/10 22:59 AZIIV ERMEI CIXIM ZMMYN MZMVP tp:python:crypto01_python https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/doku.php/tp:python:crypto01_python DOWRX KEWQG NZPYG MOVPW UYGQR ZIIRI EQRME MSWJI YZXWM VYRXZ YYZUY CDIMZ PDVZC CXVLX EPIEV PYGII MHPEX ZCVYV RPDSD RTLAH ZVIIX PLBEW JTLAH DKPPT le mot de passe utilisé est : LIEVRE Quel est le titre de ce texte ? 3 Chiffre par transposition Au contraire d'un chiffre par substitution, dans lequel on remplace les lettres par d'autres, un chiffre par transposition conserve les mêmes lettres, mais les mélange. Nous proposons ici, pour une chaîne de caractères de longueur n, et étant donné un nombre p<n, de chiffrer la chaîne d'origine en prenant, dans cet ordre, les caractères en position 0, p, 2p, 3p, etc… Lorsqu'on arrive au bout de la chaîne, on reprend à 0. Ainsi, la chaîne abcdefgh comporte 8 lettres. Choisissons p=3. La transposition obtenue est : adgbehcf En effet, on part de la lettre 0, puis on prend la lettre 3, puis la 6, puis la 1 (6+3=9 et 9%8=1), puis la 4 etc… position 0 1 2 3 4 5 6 7 lettre a b c d e f g h Ce système fonctionne correctement dans la mesure où p et n sont premiers entre eux (pgcd(n,p)=1). Il faudra garder ceci à l'esprit. On peut remettre les lettres dans l'ordre en utilisant une autre valeur de p. La valeur à utiliser est l'inverse de p modulo n, c'est la valeur q telle que (p*q)%n=1. Il existe des algorithme pour calculer cet inverse (algorithme d'Euclide étendu). Nous nous contenterons de le trouver empiriquement. Dans notre exemple, le nombre q vaut 3 aussi. En effet, (3*3)%8=1 Écrivez une fonction qui prend en paramètre une chaîne de caractères et un nombre et qui, après avoir vérifié que le nombre est bien premier avec la longueur de la chaîne (vous disposez de la fonction math.gcd (du module math…) pour ça) transpose la chaîne de caractères comme indiqué. On conservera tous les caractères de la chaîne (lettres, espaces, retours chariots). Attention, car l'ajout d'un simple espace parasite en fin de chaîne modifiera le chiffrement… Vous écrirez la fonction transpose(s,p) qui transpose la chaîne de caractères s en prenant une lettre sur p. Votre fonction devra aussi vérifier que la valeur de p entrée est convenable. Si ce n'est pas le cas, votre fonction devra renvoyer la valeur None. Par exemple, transpose('abcdefgh',3) doit renvoyer adgbehcf et transpose('Tténrumaeo lg',9) doit donner une phrase intelligible. https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/ Printed on 2017/05/25 16:21 2017/05/25 16:21 5/6 Chiffrement Utilisez votre programme pour déchiffrer le cryptogramme suivant (une seule ligne de 111 caractères), sachant qu'il a été chiffré avec la clé 13 : Je el lefiltirtup.lid s nflgehcèl e u ret ipèmcérotliqterendprré csuia nru o a edse fcuseftsis’sp esa iqetfieta Qui en est l'auteur ? Expliquez comment vous avez procédé pour trouver. 4 Tests fonctionnels Voici du code qui permet de tester vos programmes. Ces tests vérifient les réponses pour certaines entrées particulières. Si un test échoue, c'est très probablement que vous n'avez pas suivi les spécifications demandées ou bien que votre code comporte des erreurs. assert cesar("BONJOUR",2)=="DQPLQWT","cesar BONJOUR 2 Failed" assert cesar("ALEA JACTA est",2)=="CNGC LCEVC est","cesar ALEA... 2" assert cesar('Veni\nVIDI\nVICI\n',-12)=='Jeni\nJWRW\nJWQW\n',"cesar VENI... -12" assert dechiffre_vigenere("QCVCWYI LDIB EM QFFSS","POITIERS")=='BONJOUR TOUT LE MONDE', "dechiffre_vigenere " assert transpose('abcdefgh',3)=='adgbehcf', "transpose 1" assert transpose('Çtbfnnc oeneaiion',13)=='Ça fonctionne bien', "transpose 2" assert transpose('Çtbfnnc oeneaiion',12)==None, "transpose 3" 5 Défi Il est bien sûr possible d'appliquer plusieurs de ces méthodes en cascade, pour mieux chiffrer. Saurezvous déchiffrer ce message de 129 signes, sachant qu'il traite de CRYPTOGRAPHIE ? ZGAHRYN RRNYLR HR FTBFINRYUPV EVRNN FAN GD F HCMYFHPVEHCBCTRVRZFGR VVD G PRHA YFG R KNZNERACB RERBV YFAHY CEARBLN BC N GCC PFNEQ 6 Question subsidiaire Que se passe-til, selon vous, si on applique plusieurs algorithmes de chiffrement (parmi ceux que nous venons de voir) ? Si on les compose avec eux-mêmes (plusieurs décalages avec des valeurs de décalages différents, plusieurs transpositions avec des valeurs de p différentes, plusieurs Vigénère avec des mots de passe différents) ? Si on les compose entre eux ? L'ordre dans lequel on les applique a-t-il de l'importance ? La réponse à cette question est-elle liée aux méthodes de chiffrement que l'on compose ? Informatique, Programmation, Python, Enseignement... - https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/ Last update: 2017/01/10 22:59 tp:python:crypto01_python https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/doku.php/tp:python:crypto01_python From: https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/ - Informatique, Programmation, Python, Enseignement... Permanent link: https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/doku.php/tp:python:crypto01_python Last update: 2017/01/10 22:59 https://deptinfo-ensip.univ-poitiers.fr/ENS/doku/ Printed on 2017/05/25 16:21