TP de cryptographie en Python

jeudi 22 mars 2012
par  Alain BUSSER

Pour montrer aux élèves que la statistique n’a pas été inventée uniquement pour les embêter, rien de mieux que l’algorithme d’al-Kindi, qui utilise la répartition statistique des lettres pour décoder un message.

Le TP a été présenté comme un exemple de fonction non numérique (ou application (mathématiques)), avec la question posée en distribuant les sujets : « On considère une fonction dont les antécédents et les images sont des lettres au lieu de nombres ; qu’est-ce que ça donne si on l’applique à des mots ? ». Réponse : « Des autres mots » ; prolongement : De la cryptographie ! Et comme Python a déjà servi à manipuler des ensembles, autant le garder pour formaliser des fonctions entre ensembles (finis), qui dans le langage de Python s’appellent des dictionnaires (ou « tableaux associatifs » dans d’autres langages de programmation).

Comment obtenir un message crypté ?

En le cryptant soi-même !

Bien entendu, pour que les élèves puissent décrypter un message, il faut déjà que celui-ci soit crypté ! Pour éviter les risques d’erreur quand on crypte à la main, j’ai choisi un chiffre affine, et plus précisément un chiffre de Cesar, et encore plus particulièrement l’algorithme ROT13. Et bien entendu, le chiffrage a été fait en Python, avec l’algorithme suivant :

  1. Récupérer le message à coder, en l’occurence un poème mathématique [1] stocké dans un fichier appelé texte1.txt et transposé en majuscules avec un éditeur de texte.
  2. lire le message à coder qui est dans le fichier ;
  3. fermer le fichier (pour ne pas risquer d’oublier cette étape par la suite)
  4. créer un message à envoyer, initialement vide
  5. pour chaque lettre x du message,
    1. soustraire 65 (valeur du « a ») à son code ASCII (un entier)
    2. si cette valeur est positive (c’est-à-dire si x est une vraie lettre), lui additionner 13 modulo 26
    3. additionner à nouveau 65 pour avoir à nouveau une lettre affichable ;
    4. ajouter la lettre codée (par concaténation) au message à envoyer ;
  6. ouvrir un fichier de sortie (ici appelé texte2.txt)
  7. écrire dans ce fichier, le message à envoyer
  8. fermer le fichier

En Python (langage), l’algorithme ci-dessus se transforme en

entree=open('texte1.txt','r')
message=entree.read()
entree.close()
envoi=''
for x in message:
        lettre=ord(x)-65
        if lettre>=0:
                lettre=(lettre+13)%26
        lettre+=65
        envoi+=chr(lettre)
       
sortie=open('texte2.txt','w')
sortie.write(envoi)
sortie.close()

Un bug (informatique) est apparu inopinément : J’avais oublié de mettre le « = » dans le test ce qui a eu pour effet que deux lettres différentes se codaient par « A » (en fait le « A » ne se codait pas). Ceci a au moins permis de rappeler qu’en général, une lettre peut avoir plusieurs antécédents [2]. Ceci dit la difficulté supplémentaire introduite par ce biais a été en général vécue comme un défi à relever...

La très impressionnante concision de Python est mise en brèche pour qui connaît l’algorithme de cryptage, celui-ci étant très rapidement mis en œuvre par le langage bash :

#! /bin/bash

cat texte1.txt | tr 'A-Z' 'N-ZA-M'

(la commande cat (Unix) affiche le contenu d’un fichier, ici celui à coder ; le tuyau (trait vertical) branché entre cat et tr a pour effet que l’affichage ne se fait pas dans la console, mais qu’il sert d’entrée à tr ; la commande tr (Unix) justement transpose les lettres de A à Z en les lettres de N à Z puis de A à M).

Le message à décrypter était celui-ci :

YR PNEER QR Y ULCBGRAHFR
RFG RTNY FV WR AR Z NOHFR
N YN FBZZR QRF PNEERF
QRF QRHK NHGERF PBGRF

L’algorithme d’al Kindi, ou analyse fréquentielle, est un cas particulier de l’inférence bayésienne : On compare les fréquences d’apparition des lettres dans le message et dans la langue française, et on identifie les lettres les plus fréquentes entre elles (on choisit celle qui offre un maximum de vraisemblance). Ceci dit, cela ne fonctionne qu’avec les lettres les plus fréquentes, le « i » par exemple étant anormalement rare dans le message d’origine. Le fait que les fréquences des lettres dans l’échantillon ne coïncident pas exactement avec celles des lettres dans la langue française en général illustre bien la notion de fluctuation d’échantillonnage, à laquelle les élèves ne sont pas spontanément sensibilisés. Pour réduire la fluctuation d’échantillonnage, on doit s’assurer

  • que l’échantillon (le message à décoder) soit suffisamment grand ;
  • que son style soit suffisamment typique de la langue française (d’où l’allusion à La Disparition (roman) en fin de sujet).

De ces solutions, la deuxième est la plus perceptible par les élèves.

Voici le sujet du TP (on remarquera que Python n’est utilisé que pour compter, et n’est donc absolument pas nécessaire pour ce TP, le comptage pouvant être fait de bien d’autres manières) :

PDF - 101.2 ko

Déroulement du TP

L’un des élèves a demandé s’il pouvait soumettre le message codé à Google, et a obtenu ceci :


Aucun document ne correspond aux termes de recherche spécifiés (YR PNEER QR Y ULCBGRAHFR RFG RTNY FV WR AR Z NOHFR N YN FBZZR QRF ...).

Il a mal cherché...

En fait, l’article wikipedia sur l’analyse fréquentielle comprend un script en Python, qui, une fois qu’on lui soumet le message du TP, le décrypte sans aucune erreur !

Et évidemment, tout élève qui aurait deviné l’algorithme de cryptage aurait pu utiliser le décodeur en ligne de l’algorithme (en php).

Un des élèves, visiblement herpétophobe, a utilisé la fonction de recherche d’un éditeur de texte pour se faciliter le comptage (mais cela ne l’a pas empêché de se tromper en comptant une des lettres). De façon générale, le comptage à la main engendre plus d’erreurs que la recopie du texte crypté dans le script Python.

Le premier mot a souvent été trouvé, ainsi que le premier mot du second vers. Surprenamment, le second mot du second vers, bien que l’algorithme d’al Kindi en fournisse trois lettres sur 4, n’a pas souvent été trouvé. Les élèves qui ont fini de décoder le message ont en général deviné le second ou le dernier mot du premier vers, qui les a très rapidement mis sur la voie de la suite...

Un des élèves a essayé de construire un dictionnaire Python pour réaliser le décryptage. Plusieurs autres ont utilisé l’éditeur IDLE de Python comme brouillon. Un autre a utilisé les couleurs dans un traitement de texte pour faire l’exercice (l’original en haut, colorié pour le comptage, le message décodé en bas, la partie déjà décodée en blanc) :

De manière générale, la statistique a aidé le décryptage au début, l’obstacle ayant suivi étant de nature essentiellement linguistique (manque de vocabulaire, méconnaissance de l’orthographe ...).

Quelques perles


Le perre ....

Freudien et dysorthographique...


De parre ...

Apparemment, l’élève est habitué à des phrases qui commencent par « De part » et ne sait pas comment s’écrit « part ».


Le carre ...

est étal ...

à la salle ...


Le passé je l’...

(on devine la suite... Ceci dit c’est tout ce que l’élève a décodé en une heure, en particulier il n’a pas pensé à mettre les « e » ailleurs)


Je naze

Pas faux...


.E .AIIE RE U ....TECNSE

EST E.A. S. .E CEDA.NSE

A .A S.DDE RES .AIIES

RES REN. ANTIES ..TES

(erreur statistique, le « I » est la conséquence d’un algorithme d’al Kindi poussé trop loin)


Le passé sé

(Le passé, c’est ... passé, en une heure)

Les dictionnaires Python

Comme exemple de fonction définie sur un ensemble fini, on peut considérer les valeurs hors-atout des cartes à la belote, qui définissent sur une carte prélevée au hasard, une variable aléatoire. On peut définir la variable aléatoire comme ce dictionnaire :

hors_atout={'1  ':11,'10 ':10,'R  ':4,'D  ':3,'V  ':2,'9  ':0,'8  ':0,'7  ':0}

À partir de cette fonction, on peut obtenir son ensemble d’arrivée par hors_atout.values() et son ensemble de départ par hors_atout.keys() :

valeurs=set(hors_atout.keys())

Maintenant, on peut construire l’univers de probabilité par un produit cartésien entre les valeurs et les couleurs :

couleurs={'carreau','coeur','pique','trefle'}
jeu=set([v+c for v in valeurs for c in couleurs])

Pour obtenir une donne au hasard, on peut constituer un échantillon sans remise de 8 cartes :

from random import *
donne=sample(jeu,8)

On peut enfin connaître la valeur de cette donne avec

sum([hors_atout[donne[n][0:3]] for n in range(len(donne))])

cryptex du Da Vinci code

En conclusion :

Zbgvinag, pr GC, ienvzrag!
Ba qrienvg ra snver cyhf fbhirag!
Rivqrzzrag, p'rfg cyhf qr yn yvathvfgvdhr
dhr qrf znguf, znvf p'
rfg gryyrzrag cyhf sha!

Bibliographie :


[1un quatrain du chansonnier Franc-Nohain.

[2ce qui n’est pas souhaitable en cryptographie évidemment


Commentaires

Annonces

Prochains rendez-vous de l’IREM

Séminaire EDIM-IREM

- Mercredi 14 juin 2017, 14h-18h, PTU, Saint-Denis, salle S23.6
- Mercredi 21 juin 2017, 14h-18h, 146 route de Grand-Coude, Saint-Joseph


Brèves

Décès de Roger Mohr

mardi 27 juin

On sait bien que Nicolas Bourbaki n’était pas le nom d’une personne mais le pseudonyme d’un groupe. L’équivalent en informatique théorique est Claude Livercy, auteur de la théorie des programmes. Roger Mohr était un des membres de Claude Livercy.

À travers les labyrinthes : algorithmes et fourmis

dimanche 1er septembre 2013

Quand les chercheurs mettent au point des modèles d’optimisation et de recherche de plus court chemin qui s’inspirent du comportement de masse de colonies de fourmis...
À écouter : Sur les Épaules de Darwin, émission diffusée sur France Inter samedi 31 août 2013.

Rencontres Mondiales du Logiciel Libre à St-Joseph

mardi 20 août 2013

Les RMLLd se dérouleront pour la 2e fois à Saint-Joseph du 22 au 25 août.
C’est une opportunité pour les élèves qui suivent la spécialité ISN et les passionnés d’informatique.

Voici pour le samedi et le dimanche quelques interventions choisies :
- http://2013.d.rmll.info/Raspberry-votre-ordinateur-au-format-carte-de-credit?lang=fr
- http://2013.d.rmll.info/Materiel-libre-et-DIY?lang=fr
- http://2013.d.rmll.info/Arduino-de-l-electronique-libre?lang=fr

Noter aussi les conférences Art et Culture du dimanche, ainsi qu’une conférence plus engagée.

Le programme complet se trouve ici. Une radio sera ouverte pour l’occasion.
Des plaquettes à distribuer se trouvent ici.

Hyper-vidéos pour l’algorithmique au lycée

dimanche 19 août 2012

Olivier Roizès, à la demande de l’ADIREM, a réalisé une collection d’hyper-vidéos de présentation de logiciels et environnements de programmation. Ces hyper-vidéos, c’est-à-dire des vidéos contenant des éléments clicables, devraient être utiles aux enseignants désireux de se familiariser avec Python, CaRMetal, R, Rurple, Scilab ou Xcas.

Ouverture du SILO

mardi 1er novembre 2011

Le SILO (Science Informatique au Lycée : Oui !) est un espace collaboratif documentaire de partage et de formation collégiale, à destination des professeurs appelés à enseigner l’informatique au lycée.

Une initiative du CNDP, de l’INRIA et de Pasc@line, à laquelle se sont associés SPECIF, fuscia, EPI et ePrep.

Sur le Web : Site du SILO

Introduction à la science informatique

lundi 12 septembre 2011

Le CRDP de Paris publie le premier ouvrage destiné aux professeurs chargés d’enseigner la nouvelle spécialité « Informatique et sciences du numérique » en Terminale S à la rentrée 2012. Cet ouvrage a été coordonné par Gilles Dowek, directeur de recherche à l’INRIA.

Sur la création de la spécialité ISN, on pourra également consulter l’interview donnée au Café pédagogique par l’inspecteur général Robert Cabanne.

Sur le Web : CRDP de Paris

Deux publications sur l’algorithmique

samedi 17 octobre 2009

L’IREM d’Aix-Marseille publie une brochure de 73 pages, téléchargeable librement, intitulée Algorithmes et logique au lycée. Ces notions sont illustrées et déclinées sur des exercices du programme de spécialité mathématique en série L, mais sont adaptables aux programmes à venir.

Le hors série thématique n° 37 du magazine Tangente, disponible actuellement en kiosque, s’intitule « Les algorithmes. Au cœur du raisonnement structuré ». Extrait de l’éditorial : « La rédaction de Tangente a conçu la quasi-totalité de ce hors série thématique pour qu’il puisse être lu par des élèves de Seconde ».

Une carte mentale pour l’algorithmique

jeudi 10 septembre 2009

Sur son site, Jean-Jacques Dhénin a publié une carte mentale géante qui renvoie vers plus de 30 documents en ligne sur l’algorithmique. Tout ce qu’il faut — et même davantage — pour faire face au nouveau programme de Seconde !

Un catalogue libre d’algorithmes pour le lycée

dimanche 30 août 2009

Guillaume Connan, de l’IREM de Nantes, publie un catalogue libre de 119 pages d’algorithmes pour le lycée. Sur son site très riche, on trouvera d’autres documents en rapport avec l’algorithmique, notamment sur l’utilisation des langages fonctionnels au lycée et sur la comparaison programmation fonctionnelle/programmation impérative.

L’algorithmique à l’IREM de Lille

vendredi 26 juin 2009

Le groupe AMECMI de l’IREM de Lille vient de mettre en ligne des ressources importantes au service des professeurs de Seconde :

- Algorithmique et programmation (Emmanuel Ostenne)
- Bibliographie amoureuse de l’algorithmique (Alain Juhel)

Statistiques

Dernière mise à jour

lundi 24 juillet 2017

Publication

759 Articles
Aucun album photo
133 Brèves
11 Sites Web
132 Auteurs

Visites

306 aujourd'hui
292 hier
2063396 depuis le début
12 visiteurs actuellement connectés