~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini...

33
Programmation avec Python 2019 Etienne Lozes L1-Sciences Cours n°3 http://deptinfo.unice.fr/~elozes '#!§&/?*%$!' La boucle for & Les string

Transcript of ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini...

Page 1: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Programmation avec Python 2019 Etienne Lozes L1-Sciences

Cours n°3

http://deptinfo.unice.fr/~elozes

'#!§&/?*%$!'

La boucle for &

Les string

Page 2: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Compléments sur print: sep et end

a = 0print("a=", a,  "et non 1")print("b n’est pas défini")

espace automatique

• Par défaut, print ajoute des espaces entre chaque élément affiché et revient à la ligne après le dernier affiché

retour à la ligne automatique

RUNa= 0 et non 1b n’est pas défini

• On peut changer ce comportement avec les paramètres optionnels • sep et end

print("ab", "cd", sep = ",", end = ":")print("-)")

caractère séparateur

caractère fin de ligne

RUN

ab,cd:-)

Page 3: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Usages particuliers d’une boucle while• La boucle while est le couteau suisse du programmeur.• On n’utilise le plus souvent qu’une ou deux des nombreuses possibilités qu’elle offre.

# répéter jusqu’à ce que …while True :i = input('encore?')if i != 'oui' : break

# affiche les entiers impairs < 10 i = 1while i < 10 :print(i)i = i + 2

repeat … untildo … while

for loop

Les langages de programmation ont une syntaxe particulière pour cesboucles (mais pas de repeat until en Python!)

Page 4: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

La boucle for utilisée avec range for i in range(1,11,2) : print(i)

i = 1while i < 11 :print(i)i = i + 2

>>> for i in range(1,10) : print(i, end = '')123456789>>> >>> for i in range(10) : print(i, end = '')0123456789

On peut omettre le pas et la valeur initiale

13579

range(deb, fin, pas)

deb : la valeur au premier tour de boucle fin : la valeur à partir de laquelle on sort de la boucle (11 n’est pas affiché) pas : de combien augmente i à chaque tour de boucle

pour ne pas revenir à la ligne

RUN

Page 5: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Les pas négatifs: compter en arrière

for i in range(deb,fin,pas) : corps

i = debwhile i < fin :corpsi = i + pas

si le pas est positif:

>>> for i in range(9,0,-1) : print(i, end = ',')9,8,7,6,5,4,3,2,1,>>>>>> for i in range(8,0,-3) : print(i, end = '--')8--5--2-->>>

for i in range(deb,fin,pas) : corps

i = debwhile i > fin :corpsi = i + pas

si le pas est négatif:

Page 6: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

La variable de boucle

i = 42for i in range(1,10,2) : print(i, end = '') i = i + 4print()print(i)

Elle prend une la valeur prévue au début à chaque tour de boucle. On ne peut pas accélérer ou ralentir la boucle en la changeant. Elle garde la dernière valeur qu’elle avait en sortant de la boucle

RUN1357913

Page 7: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Boucles imbriquéesSi on écrit 2 boucles l’une dans l’autre, c’est la variable de la boucle intérieure qui « avance le plus vite »

for heure in range(1,13) : for minute in range (0,60,15) : print(heure, minute, sep=':')

RUN

1:01:151:301:452:02:152:302:45…12:45

Quand on a fini la boucle intérieure, on la refait en repartant du début

Page 8: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Sortie de bouclebreak et return permettent de sortir de la boucle avant d’arriver au bout

def premier_facteur(n) : for d in range(2,n) : if n % d == 0 : return d return n

Attention: break interrompt la boucle, maisreturn interrompt la fonction (donc toutes les boucles imbriquées où apparait le return)

def premier_facteur(n) : for d in range(2,n+1) : if n % d == 0 : break return d

on veut passer dans la boucle pour d=n

Page 9: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Les chaînes de caractères• Un texte est une suite finie de caractères : lettres majuscules ou minuscules, chiffres, ponctuations, symboles mathématiques, etc.

• Dans les langages de programmation, un texte est une chaîne (de caractères). In the world of programming languages, a text is a string.

>>> texte = '1984 : Orwell !'>>> texte'1984 : Orwell !'

• Ne confondez pas 1984 qui est un entier et '1984' qui est une chaîne.

>>> type(1984)<class 'int'>>>> type('1984')<class 'str'>

>> str(1984)'1984'>>> int('1984')1984

1984

'1984'

strint

'Notez les apostrophes !'

Page 10: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

• Les apostrophes simples sont préférées, mais on peut aussi utiliser des guillemets :

>>> texte = "1984 : Orwell !">>> texte'1984 : Orwell !'

• Pour inclure une apostrophe dans une chaîne, attention !

>>> 'Mais j'ai froid !'SyntaxError: invalid syntax

• Deux méthodes :

- utiliser des guillemets pour délimiter la chaîne :

- utiliser le caractère d'échappement backslash \

>>> "Mais j'ai froid !""Mais j'ai froid !"

>>> 'Mais j\'ai froid !'"Mais j'ai froid !"

Page 11: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Une chaîne est une suite de caractères• Combien y a-t-il de caractères dans une chaîne ?

>>> texte = '1984 : Orwell !'>>> len(texte)15

• Comment accéder au caractère numéro k (k = 0, 1, 2, ...) ?

>>> texte[0]'1'>>> texte[3]'4'>>> texte[len(texte)-1]'!'>>> texte[-1]'!'>>> texte[len(texte)]IndexError: string index out of range

>>> s = 'Hello'>>> s[-1]'o'>>> s[-5]'H'

length...

Page 12: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

• Puis-je modifier le caractère numéro k d'une chaîne ?

NON : une chaîne est un objet constant, non mutable. On peut modifier la valeur de la variable texte avec une affectation, mais pas l'un de ses caractères individuellement.

>>> texte = 'Je dis ' + texte>>> texte'Je dis 1984 : Orwell !'>>> texte[0] = 'K' # j'essaye de transformer J en KTypeError: 'str' object does not support item assignment

• L'opérateur + entre chaînes se nomme la concaténation.

>>> 'Sa' + '-' + 'lut''Sa-lut'

• L'opérateur * permet de répéter une chaîne :

>>> 3 * 'guili' # 'guili' + 'guili' + 'guili''guiliguiliguili'

>>> '17' + '89''1789'

Page 13: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

• Exemple : nombre d'apparitions du caractère c dans une chaîne s

def nb_occurrences(c,s) : res = 0 for i in range(len(s)) : if s[i] == c : res = res + 1 return res

>>> nb_occurences(‘e', 'exceptionnellement')5

• Que remarque-t-on ?

Un caractère est identifié à une chaîne de longueur 1. Le caractère 'e'

On teste l'égalité de deux caractères avec == >>> 'e' == 'E' False

Parcourir une chaîne de caractères

Page 14: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

• Exemple. Quelle est la position de la première apparition du caractère c dans la chaîne s ? Ou bien -1 s'il n'est pas dans s...

def position(c,s) : for i in range(len(s)) : if s[i] == c : return i return -1

>>> position('a','Koala')2>>> position('A','Koala')-1

def appartient(c,s) : return position(c,s) >= 0

>>> appartient('a','Koala')True>>> appartient('A','Koala')False

Parcourir une chaîne de caractères

def appartient(c,s) : for c2 in s : if c == c2 : return True return False

astuce pythonesque : on peut itérer directement sur les caractères!

Page 15: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Extraction d'une tranche de sous-chaîne• Python propose un moyen d'extraire une tranche (slice) d'une chaîne repérée par ses positions extrêmes :

>>> texte'Salut le monde !'>>> texte[2:5]'lut'

>>> texte[:8]'Salut le'>>> texte[2:]'lut le monde !'

• Attention donc, s[i:j] signifie la tranche de la chaîne s située entre les indices i et j-1, donc dans [i,j[. Pour prendre seulement 1 caractère sur k, demander s[i:j:k].

>>> texte'abcdefghijklmnopqrstuvwxyz'>>> texte[:6] + texte[6:]'abcdefghijklmnopqrstuvwxyz'

>>> texte[3:15:3]'dgjm' >>> texte[::3]'adgjmpsvy'>>> texte[3::3]'dgjmpsvy'

Page 16: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Beaucoup de primitives sur les chaînes...• Un langage de programmation vaut aussi par l'étendue de ses fonctionnalités. Avant de programmer, cherchez dans la doc si la fonction convoitée n'est pas une primitive !

• EXEMPLE. La fonction appartient(c,s) précédente n'est autre que l'opérateur primitif in de Python :

appartient(c,s) <==> c in s

• Le nombre de voyelles d'une chaîne s se programmerait (naïvement) :

def nb_voyelles(s) : res = 0 for i in range(len(s)) : if s[i] in 'aeiouy' : res = res + 1 return res

>>> nb_voyelles('Ajourné')2 naïf…

Page 17: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

...mais certaines ont une drôle de tête !• Nous commençons à entrevoir la PROGRAMMATION OBJET.

Nous garderons pour l'instant une idée naïve de ce qu'est un objet. Il suffit de savoir qu'on peut appeler une méthode d’un objet, et que cela correspond plus ou moins à une fonction.

• EXEMPLE. Je trouve dans la documentation la primitive find qui réalise ma fonction position(c,s). Mais ce n'est pas une fonction, c'est une méthode !

find(c,s)

fonction méthode

s.find(c)

s, donne-moi l'indice de c !

>>> texte = 'Salut le monde !'>>> texte.find('l')2>>> texte.find('mon')9

Page 18: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

• Autres exemples de méthodes dans la classe str des chaînes :

>>> '123'.isdigit() # que des chiffres ? True >>> 'Monde'.isalpha() # que des lettres ?True>>> 'rayon+2'.islower() # lettres minuscules ?True>>> 'RAYON+2'.isupper() # lettres majuscules ?True>>> 'RAYON+2'.lower() # mettre en minuscules'rayon+2'>>> 'rayon+2'.upper() # mettre en majuscules'RAYON+2'>>> ' www.unice.fr '.strip() # enlever les blancs aux bouts 'www.unice.fr'>>> 'abracadabra'.strip('ab') # enlever aux bouts'racadabr'>>> 'Tip chic'.replace('i','o') # remplacement'Top choc'

Page 19: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Documenter une fonction• Il y a une troisième manière de délimiter une chaîne : les guillemets triples ! Il s'agit d'une docstring permettant de documenter une fonction. Elle peut tenir sur plusieurs lignes.

def somch(n) : """Retourne la somme des chiffres de n en base 10""" res = 0 while n > 0 : res = res + (n % 10) ; n = n // 10 return res

• Cette docstring a été enregistrée et associée au nom de la fonction :

> help(somch)Help on function somch in module __main__: somch(n) Retourne la somme des chiffres de n en base 10

20

Page 20: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Une chaîne peut contenir du code Python !• Dans certaines applications avancées de Python ou pour les maths, on place une expression Python dans une chaîne str et on provoque son évaluation avec la fonction eval.

• L’usage de cette fonction est réservée à des cas très rares. En effet si la chaîne contient du code Python malicieux, la sécurité vacille…

>>> x = 3>>> eval('x+1')4>>> eval('x+1',{'x':10}) + x14

def val0() : f = eval(input('Entrez une fonction —> ')) print('Sa valeur en 0 est',f(0))

>>> val0()Entrez une fonction —> lambda x : (x+1)/2Sa valeur en 0 est 0.5

21

Page 21: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

La boucle for parcourt un objet itérable• Nous avons utilisé jusqu'à présent la boucle for sur un intervalle (range) ou une chaîne. Or range ne construit pas l'intervalle, mais un itérateur sur un intervalle virtuel. Heureusement d'ailleurs :

>>> i = range(1000000000000000000000000000000000)>>> for x in i :

print(x*x,end=' ') if x == 10 : break

0 1 4 9 16 25 36 49 64 81 100

• Les séquences (ex: string, range) sont des objets itérables. Plus généralement, la syntaxe de la boucle for est :

for x in <objet itérable> : .....

21

Page 22: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

La représentation machine des caractères

Page 23: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Le codage ASCII• Les caractères américains (dits internationaux) sont numérotés de 0 à 127, c'est le code ASCII (American Standard Code for Information Interchange). Par exemple le code ASCII de 'A' est égal à 65 mais on n'a pas besoin de le mémoriser :

>>> ord('A')65>>> ord('a')97

>>> ord(' ')32>>> ord('?')63

>>> chr(65)'A'>>> chr(63)'?'

• Les caractères dont le code ASCII tombe entre 0 et 31, ainsi que le caractère numéro 127 ne sont pas affichables. Ce sont les caractères de contrôle nommés symboliquement NUL, LF, BEL, CR, ESC, DEL...

>>> chr(10)'\n'

LF >>> chr(27)'\x1b'

ESC

symbolique hexadécimal

Page 24: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

32 33 ! 34 " 35 # 36 $ 37 % 38 & 39 '40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 /48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 756 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ?64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w120 x 121 y 122 z 123 { 124 | 125 } 126 ~

def ascii() : for k in range(32,127) : ...

cf TP !

• L'affichage de la table ci-dessus est programmée en Python :

Page 25: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Le codage ASCII étendu• Le code du caractère accentué 'é' est 233, il tombe entre 128 et 255. Il s'agit du code ASCII étendu, qui contient des caractères propres à chaque pays. Nous utilisons le codage Iso-Latin-1, qui couvre les langues de l'Europe de l'Ouest, avec le é, à, ç, ñ, Ö, ß, etc. Les russes utilisent KOI8-R, les chinois sont bien ennuyés, etc.

160   161 ¡ 162 ¢ 163 £ 164 ¤ 165 ¥ 166 ¦ 167 § 168 ¨ 169 © 170 ª 171 « 172 ¬ 173 174 ® 175 ¯ 176 ° 177 ± 178 ² 179 ³ 180 ´ 181 µ 182 ¶ 183 · 184 ¸ 185 ¹ 186 º 187 » 188 ¼ 189 ½ 190 ¾ 191 ¿ 192 À 193 Á 194 Â 195 Ã 196 Ä 197 Å 198 Æ 199 Ç 200 È 201 É 202 Ê 203 Ë 204 Ì 205 Í 206 Î 207 Ï 208 Ð 209 Ñ 210 Ò 211 Ó 212 Ô 213 Õ 214 Ö 215 × 216 Ø 217 Ù 218 Ú 219 Û 220 Ü 221 Ý 222 Þ 223 ß 224 à 225 á 226 â 227 ã 228 ä 229 å 230 æ 231 ç 232 è 233 é 234 ê 235 ë 236 ì 237 í 238 î 239 ï 240 ð 241 ñ 242 ò 243 ó 244 ô 245 õ 246 ö 247 ÷ 248 ø 249 ù 250 ú 251 û 252 ü 253 ý 254 þ

Une partie standard de Iso-Latin-1

Page 26: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Le codage UNICODE• Et les chinois furent contents ! En effet, le consortium Unicode (≈ 1990, initié par Xerox et Apple) proposait d'abandonner la limitation des 255 caractères en traitant d'un seul coup toutes les langues du monde (plus de 65000 caractères !)...

- Pourquoi ce nombre magique 255 ?

- Parce que l'unité d'information sur un ordinateur est l'octet : un bloc de 8 bits (un bit = 0 ou 1). Sur les 8 bits, un bit était utilisé pour la vérification de la bonne transmission (le bit de parité), d'où un codage sur 7 bits, c'est l'ASCII. Avec la fiabilité des transmissions, le 8ème bit fut finalement utilisé pour l'ASCII étendu...

1 1 1 0 1 0 0 1 é

Page 27: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

• Les caractères Unicode sont numérotés en hexadécimal (base 16). Par exemple, le symbole euro a pour numéro 20AC en hexa :

>>> '\u20ac''€'>>> chr(8364)'€'>>> chr(0x20ac)'€'

>>> 0x20ac8364 >>> hex(8364)'0x20ac'

>>> ord('€')8364

• Sur www.unicode.org, on trouve les page charts donnant les numéros de toutes les langues du monde. Par exemple le chinois :

• ou l'arabe (mais attention à l'écriture gauche ← droite)...

for i in range(0x0661,0x066a) :print(chr(i),end=' ') ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩

>>> phrase = '\u6211\u662F\u6cd5\u56fd\u4eba'>>> phrase'我是法国⼈人' Je suis Français.

Page 28: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Les problèmes d’encodageComme les caractères unicode ne tiennent plus tous sur un seul octet, certains caractères sont représentés sur 2, 3, voire 4 octets. Il y a plusieurs conventions d’encodage possibles pour un même caractère.

iso-88569-1 (latin 1) utf8 utf16

a 01000011 01000011 0000000001000011

é 11101001 1100001110101001

0000000011101001

€ indéfini111000101000001010101100

0010000010101100

Si on prend le mauvais encodage, on décode en affichant un autre caractère que celui voulu…Le standard recommandé est utf8 mais windows utilise utf16, et certains sites web, mais aussi Processing (prochain cours) utilisent iso-latin-1… erreurs garanties!

Page 29: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Introduction à la cryptologie

Page 30: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Jules César et les messages secrets• La cryptographie est l’art d’écrire des codes

secrets. • Une des premières formes de cryptage d'un

message est le chiffrement par décalage circulaire, appelé code de César.

• Jules César l’aurait utilisé pour ses correspondances durant la Guerre des Gaules.

• C’est une transformation lettre à lettre du message. exemple : avec A -> S , B -> T, … Z -> R, le message ZEBRA devient RWTJS

Le décalage est ici k=18, mais on peut prendre n’importe quel k entre 1 et 25. Ce nombre k est la clé de chiffrement.

Page 31: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Le code de César en PythonOn ne code que les MAJUSCULES...

Les différentes étapes pour chiffrer UNE lettre: 1) on calcule l’index de la lettre dans l’alphabet avec ord.

ex: X -> 23e lettre de l’alphabet, index 22 = ord(‘X’) - ord(‘A’) 2) on ajoute la clé à l’index, modulo 26 (la taille de l’alphabet)

ex: avec k=18, 22 -> 14 3) on calcule la lettre à cet index dans l’alphabet avec chr, en

utilisant le code ASCII ex: index 14, 15e lettre de l’alphabet : O = chr(14 + ord(‘A‘))

On remplace donc X par O

Chiffrer un message de plusieurs lettres On chiffre lettre à lettre, avec un accumulateur… cf TP!

Page 32: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Déchiffrer un messageIl suffit de connaitre la clé k utilisée pour le chiffrement. En chiffrant avec la clé -k (modulo 26), on retrouve le message de départ.

On parle de cryptographie à clé symétrique. La cryptographie à clé asymétrique utilise par opposition une clé de chiffrement qui peut être publique et une clé de déchiffrement qui est souvent tenue secrète.

Et si l’on ne connait pas la clé k?

Avec le chiffrement de César, il reste facile de déchifrer le message en énumérant toutes les clés possibles (26 possibilités)… cf TP!

Page 33: ~elozes La boucle for - unice.frdeptinfo.unice.fr/~elozes/AlgoPython/cours3.pdf · Quand on a fini la boucle intérieure, on la refait en repartant du début. Sortie de boucle break

Casser les codes : la cryptanalyse• La cryptanalyse est l’art de casser les codes secrets.

Cryptographie et cryptanalyse vont de pair et forment la cryptologie

La « bombe » de Bletchley Park

https://www.youtube.com/watch?v=2dKG21u2aSo

L’équipe de chercheurs de Bletchley Park, dont Alan Turing, fut l’une des premières à avoir recours aux machines pour casser un système cryptographique, en l’occurence le système Enigma utilisé par les allemands pendant la seconde guerre mondiale.

Une vidéo de 8 minutes très accessible sur le sujet