Accueil

Traduction

Tutoriel Python - sommaire

Tutoriel Python - recherche

L'auteur : Patrick Darcheville

Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site

Des jeux et des programmes de cryptage

Dans ce chapitre nous abordons des programmes un peu plus complexes : des jeux et des programmes de cryptage.
Ce sera aussi l'occasion de présenter de nouveaux modules Python.

Des jeux

Thème : tirage au sort de cartes dans un jeu de 32 cartes.

Première version

Le code à saisir :

Étudions le code maintenant.
Ce programme est construit à partir de deux listes. La première liste comprend 4 éléments (les 4 enseignes ou "couleurs") et la seconde comprend 8 éléments. On utilise donc un jeu de 32 cartes.
Si on voulait utiliser un jeu de 52 cartes il suffirait de modifier l'une des listes.
Notez que la deuxième liste est ce que j'appelle " liste mixte" avec des chaines et des nombres.
Observez bien le test qui permet de sortir de la boucle while. En effet l'utilisateur qui veut arrêter le tirage doit taper "n" ou "N". S'il tape autre chose il reste dans la boucle.

La fonction choice(liste) :
Cette fonction permet d'extraire de façon aléatoire un élément d'une liste.
Cette fonction ne fait pas partie des fonctions "natives" (du module de base) mais du module "random" qu'il faut donc importer.

Version améliorée de ce jeu

Ça serait bien qu'après 5 pioches du joueur, on puisse visualiser sa main.

Le code de la version améliorée

Comme le nombre de pioches est connu (5), il faut mieux utiliser la structure "for ... " que la structure "while ...".
À chaque passage dans la boucle il y a tirage au sort d'une carte.
Le nom de la carte tirée devient un nouvel élément de la liste "mon_jeu_liste" grâce à la méthode append().
Notez le paramètrage de la fonction print() dans la deuxième boucle. L'argument end = " - " interdit le saut de ligne qui survient normalement après une instruction print().
Ce programme vous montre aussi comment créer une liste vide : nomListe = [].

Le rendu

La main du joueur est affichée sur une seule ligne alors que cinq instructions "print" on été exécutées ...

Critiques du script


Voir le chapitre 8 dans ce même tuto pour une version deboguée.

Cryptage par code ASCII

Pendant guerre, les nazis disposaient d'une machine de cryptage appelé ENIGMA.
La clé de cryptage changeait chaque jour.
Les Britanniques, à l'initiative du chercheur Alan Turing, réalisèrent un super calculateur électro-mécanique surnommé la "bombe" pour casser le code avec un certain succès.

Ci-dessous à gauche la fameuse "bombe" et à droite la machine enigma.
tuto python tuto python

Code ASCII, c'est quoi ?

En informatique chaque lettre, symbole a un code ASCII. Les logiciels manipulent en fait les codes ASCII des symboles et lettres.

Les codes 0 à 31 ne codent pas des caractères mais des symboles.
Les codes 65 à 90 représentent les majuscules. Les codes 97 à 122 représentent les minuscules.

La fonction ord(C) renvoie le code ASCII de la lettre C majuscule.
La fonction chr(n) renvoie la lettre ou symbole associé au code ASCII n.

Affichez les codes ASCII de 65 à 122 avec la lettre correspondante

Le code tient en 2 instructions !

Lors de son exécution, ce programme retourne 58 lignes avec affichages d'abord des lettres majuscules puis des lettres minuscules.

Exercice

Produisez le programme qui affiche les caractères correspondant aux codes ASCII de 1 à 64.
Vous constaterez que Python est incapable d'afficher les symboles correspondant aux codes ASCII de 1 à 33.

Programme pour afficher le code ASCII des lettres majuscules de l'alphabet latin

Le code :

La chaine "majuscules" contient 26 lettres. La variable i va successivement prendre les valeurs de 0 à 25 (car longueur vaut 26) ; la boucle va donc être exécutée 26 fois.
A chaque passage dans la boucle on extrait une lettre de la chaine (celle de position i) et on génère son code ASCII grâce à la fonction ord().

Premier programme de cryptage

Imaginons un cryptage qui consiste à remplacer chaque caractère par son code ASCII.

Le code correspondant

Enregistrez ce fichier sous le nom "cryptage_ascii.py

Test

Message en clair : "attaquez colline delta a 6 am"

Ce qui donne le message crypté suivant :
971161169711311710111432991111
081081051101013210010110811697329732543297109

Il faudrait maintenant imaginer le programme de décryptage OU à défaut une table de décryptage ...

Construction du tableau de décryptage

Grâce à cette table le destinaire du message pourra le décrypter.

Le code :

Il ne faut pas hésiter à commenter les lignes de code.

Le rendu du code :

Remarque : vous constatez que même les chiffres dès qu'ils sont considérés comme des strings ont un code ASCII.

À vous de travailler un peu.
Vous devez décrypter ce message reçu par chaque chef d'unité en utilisant la table de conversion.
99101115115101122321081013210210111732973249493297
109321081013249493210011
732109111105115324949

Cryptage en "leet speak"

Le cryptage de chaque caractère par son code ASCII est relativement simple à réaliser mais en contrepartie il est aussi simple à "casser".
Nous allons maintenant aborder une autre technique dite "leet speak".
Le principe est d'utiliser des caractères graphiquement voisins des caractères usuels, par exemple "5" au lieu de "S", "7" au lieu de "T" ,etc.

Programme de cryptage en "leet speak" : première version

Le code :

Test

Tapez la fameuse maxime de Boileau :
"Tout ce qui se concoit bien s enonce clairement et les mots viennent a la bouche aisement. "
Oui il y a des fautes d'orthographe mais délibérées : il faut en effet éviter les lettres accentuées, les majuscules et apostrophes dans le message à crypter.

Critiques

Ce programme est basé sur la méthode replace() que l'on peut appliquer à une chaine de caractères.
Remarque : lettre "u" remplacée par "||" (double pype) et "e" par " !" (point d'exclamation)

Ce programme "marche" mais sur un plan algorithmique, il est complètement nul ! Il a été écrit rapidement. Or en programmation il ne faut confondre vitesse et précipitation.
Ce programme est mauvais car d'abord il est trop long et sa maintenance est difficile. Il y a trop de variables utilisées : message_code, ... message_code6.

Version améliorée

Cette version améliorée repose sur l'utilisation d'une liste de sous-listes.

Le code

Testez ce programme

Tapez le message à crypter : "sans methode la pensee erre l action tatonne"
message codé : 5an5 m!74od! la p!n5!! !rr! l ac7ion 7a7onn!
Bof … ; pas terrible comme cryptage ; ça reste compréhensible mais c'est tout simplement parce que le nombre de sous-listes est faible.

Analyse du code

La liste de listes nommée "clé" comprend 5 sous-listes ; il pourrait y en avoir beaucoup plus.
Donc la boucle "for s in cle" va être exécutée 5 fois.
À chaque passage une des sous-listes est manipulée.
Le programme est désormais bien écrit. Pour complexifier le cryptage il suffirait de rajouter des sous-listes à la liste "cle".

Exercice

Pour vérifier que vous avez bien compris le programme ci-dessus, vous allez le compléter en rajoutant la routine de décryptage.
Dans le même fichier vous aurez donc la routine de cryptage et celle de décryptage.
Le rendu que vous devez obtenir :
Tapez le message en clair mais sans accentuer les "e" : "sans methode la pensee erre et l action tatonne" .
message codé : 5an5 m!74od! la p!n5!! !rr! !7 l ac7ion 7a7onn!
message décryptée : sans methode la pensee erre et l action tatonne

Encore à vous de "bosser"

Il serait souhaitable que toutes les voyelles soient cryptées.