Chiffrement

publicité
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
Téléchargement