Ter S ISN NOVEMBRE 2013 TP Méthode de César/Vigenère Avertissement : Il faut garder une trace écrite de votre travail. Pour cela, il faut compléter cette feuille mais aussi prendre des notes sur les méthodes, les formules utilisées, les manipulations etc. pour pouvoir réviser et travailler de manière autonome. Appeler le professeur pour vérifier vos programmes, les enregistrer dans un fichier sur votre clé. Le But du TP : sur 2 séances Travailler sur deux nouveaux types : les listes et les chaines sous Python. Programmer la méthode de César et de Vigénère qui permet de coder un texte, c’est le début de la cryptographie. 1. Travail sur les listes et les chaines. A) Le type str (string : chaîne de caractères) ▪ Tapez sur la console les lignes suivantes : >>> Nom = 'Dupont' >>> print(Nom) Dupont >>> print type(Nom)) <type 'str'> >>> Prenom = "Pierre" >>> print(Prenom) Pierre >>> print(Nom,Prenom) Dupont Pierre # entre apostrophes # on peut aussi utiliser les guillemets # ne pas oublier la virgule La concaténation désigne la mise bout à bout de plusieurs chaînes de caractères. La concaténation utilise l'opérateur + ▪ >>> chaine = Nom + Prenom # concaténation de deux chaînes de caractères >>> print chaine DupontPierre >>> chaine = Prenom + Nom # concaténation de deux chaînes de caractères >>> print(chaine) PierreDupont >>> chaine = Prenom + ' ' + Nom >>> print(chaine) Pierre Dupont >>> chaine = chaine + ' 18 ans ' # en plus court : chaine += ' 18 ans' >>> print(chaine) Pierre Dupont 18 ans ▪La fonction len() retourne la longueur (length) de la chaîne de caractères : >>> print len(chaine) 20 >>> print(chaine[0]) P >>> print(chaine[1]) i >>> print(chaine[1:4]) ier # premier caractère (indice 0) # deuxième caractère (indice 1) >>> print(chaine[2:]) ierre Dupont 18 ans On ne peut pas mélanger les serviettes et les torchons (ici type str et type int) : >>> chaine = '17.45' >>> print(type(chaine)) <type 'str'> >>> chaine = chaine + 2 TypeError: cannot concatenate 'str' and 'int' objects Exercice python : Ecrire un programme qui demande à l’utilisateur de taper son nom et son prénom puis affiches les initiales correspondantes. Exemple : Pour ‘Lionel Messi’, le programme doit donner ‘L M’. Exercice python : Ecrire une fonction qui donne le nombre de voyelle d’une chaine de caractère. Exemple : Pour la chaine ‘Allez le Barca’ , la fonction doit retourner 5. B) Le type list (liste) Une liste est une structure de données. Le premier élément d'une liste possède l'indice (l'index) 0. Dans une liste, on peut mélanger les types. ▪ Tapez sur la console les lignes suivantes : >>> maliste = ['Pierre','Dupont',18,72.5] # types str, str, int et float >>> print (type(maliste)) <type 'list'> >>> print (maliste) ['Pierre', 'Dupont', 18, 72.5] >>> print(maliste[0]) # premier élément (indice 0) Pierre >>> print(maliste[2]) # le troisième élément a l'indice 2 18 >>> print(maliste[3]) # le quatrième élément a l'indice 3 72.5 La fonction range() crée une liste d'entiers régulièrement espacés : >>> liste = range(10) >>> print(liste) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> print type(liste) <type 'list'> >>> >>> [1, >>> liste = range(1,10,2) print(liste) 3, 5, 7, 9] print(liste[2]) # range(début,fin,intervalle) 5 On peut créer une liste de listes, qui s'apparente à un tableau à 2 dimensions (ligne, colonne) : 0 1 2 10 11 12 20 21 22 >>> liste = [[0,1,2],[10,11,12],[20,21,22]] >>> print(liste[0]) [0, 1, 2] >>> print(liste[0][0]) 0 >>> print(liste[2][1]) # élément à la troisième ligne et deuxième colonne 21 >>> liste[2][1] = 69 # nouvelle affectation >>> print(liste) [[0, 1, 2], [10, 11, 12], [20, 69, 22]] D’autres méthodes (fonctions) à découvrir: >>> a = [66.25, 333, 333, 1, 1234.5] >>> print(a.count(333), a.count(66.25), a.count('x')) 2 1 0 >>> a.insert(2, -1) >>> a [66.25, 333, -1, 333, 1, 1234.5] >>> a.append(333) >>> a [66.25, 333, -1, 333, 1, 1234.5, 333] >>> a.index(333) 1 >>> a.remove(333) >>> a [66.25, -1,333, 1, 1234.5, 333] >>> del a[333] >>> a [1234.5, 1,-1, 66.25] >>> a.sort() >>> a [-1, 1, 66.25, 1234.5] >>> a.reverse() >>> a [1234.5,66.25,1,-1] Exercice Python : Proposer un programme qui compte le nombre d’éléments supérieurs ou égales à 6 dans une liste d’entiers. Exemple : pour la liste s = [3 5 7 8 12 2] le programme doit renvoyer 3 (il y a 3 entiers supérieurs à 6 dans la liste s). Exercice Python : Proposer une fonction base qui à partir d’un chiffre b et d’un entier envoie la décomposition de cet entier en base b sous forme de liste. Exemple : b = 5 n = 37 ; base(5,37) = [ 1 2 2]. En effet, 37 = 5² + 2x5 + 2. 2. Codage d’un texte Principe : Les algorithmes de cryptographie fonctionnent souvent sur le modèle : Prendre une lettre Lui associer un nombre Transformer ce nombre Afficher la lettre correspondant à cette image. En Python comme dans tous les langages, il existe déjà les fonctions qui associent à chaque caractère un nombre et inversement. Ce nombre est appelé le code ASCII (American Standard Code for Information Interchange), dont voici quelques correspondances : Lettre espace A B ... Z 0 1 ... 9 a b ... z Code ASCII 32 65 66 ... 90 48 49 ... 57 97 98 ... 122 a) Le code ASCII En informatique, chaque caractère imprimable est représenté par un nombre entier. En particulier les lettres minuscules sont représentés par les nombres allant de 97 (code ASCII de ‘a’ à 122 (code ASCII de ‘b’). On utilise le code ASCII qui donne en hexadécimal le code ASCII des caractères du clavier. Exemple : A = 41 en hexadécimal = 65 en décimal. Pour coder le caractère A, on va donc coder en binaire le nombre 65 : 1000001. Il suffit donc de 7 bits pour coder les caractères de l’alphabet. Exercice 1 : Compléter le tableau suivant du code qui donne en décimal les lettres en minuscules de l’alphabet. a b c d e f g h i j k l m n o p q r s t u v w x y z Exercice python : Taper ord(‘a’) et chr(99) dans la console python. Que réalisent ces deux commandes ord et chr ? Ecrire une fonction qui a comme variable global une chaine de caractère et qui renvoie la liste des codages en décimal de chacune de ses lettres dans le même sens. Exemple : pour la chaine ‘barca’ la fonction doit renvoyer [98 97 114 99 97]. b) Codage par la méthode de césar : Chiffrement de César. Lors de ses batailles, l’empereur romain JULES CÉSAR cryptait les messages qu’il envoyait à ses généraux. Saméthode de codage consistait à décaler les lettres de 3 rangs, vers la droite, dans l’alphabet. • Cette méthode de cryptage est appelée chiffrement de César. • Le nombre de rangs de décalage des lettres est appelé la clé. Par exemple, si on remplace A par D, on remplace B par E, C par F, D par G, etc... Donnons un exemple sur à partir de ce décalage de 3 lettres : Texte clair A B C D E F G H I J K L M N O P Q R S T U V W X Y Z Texte codé D E F G H I J K L M N O P Q R S T U V W X Y Z A B C Exercice : Codez le message suivant « allez le barca ». Décodez le message suivant : « PDLV RX HVW FKDUOLH » Exercice python : Déterminer un programme qui à chaque lettre de l’alphabet associe le codage de sa lettre codée. Pour crypter chaque lettre, on associe à chaque lettre un indice ( 0 pour a, 1 pour b, …. 25 pour z) décaler les indices avec le nombre choisit, et retranscrire le tout en lettre. Exemple : 1er étape : pour la lettre b, le codage est 98. On doit se ramener à 1. Comment faire ? 2ième étape : On ajoute 3 à ce chiffre ce qui fait 4. Si jamais on part de la lettre z que se passe t-il ? Comment faire pour être sur d’avoir un entier entre 0 et 25 ? 3ième étape : à partir du chiffre 4, comment revenir à la lettre e. Mini-projet : A rendre après les vacances de la toussaint 1) Cryptage Ecrire un programme qui code une chaine de caractère selon la méthode de César avec un clé égale à 3 puis avec une clé quelconque. Exemple : pour la chaine ‘barca’ le programme doit renvoyer ‘edufd’. 2) décryptage Ecrire un programme qui décode un message selon la méthode de César avec une clé égale à 3. Exemple : pour la chaine ‘irrw’ le programme doit renvoyer ‘foot’. Application : Décrypter ce message codé par la méthode de César Premier message : « LQNA JVR S JR ZDNUZDN LQXBN MN CANB RVYXACJWC J CN MRAN. S DCRURBNAJR DW LAHYCJPN JOORWNYXDA LXMNA VXW YAXLQJRW VNBBJPN. »