Atelier d'informatique, Sciences et humanités

TP3: Des messages secrets

Rappel :

Après avoir tapé le code dans une cellule pour l'exécuter tapez Shift+Entré et l'ordinateur calcule le résultat.

Le code doit être correctement indenté (pour préciser l'intérieur des boucles ou des tests).

Une variable peut être: déclarée, affectée, appelée.

range(20) désigne l'intervalle des nombres entiers de 0 (inclus) à 20 (exclu). range(1,20) désigne l'intervalle des nombres entiers de 1 (inclus) à 20 (exclu).

Message secret :

Nous avons vu la semaine dernière comment manipuler les chaines de caractères:

m="abracadabra"
result=""
for i in range(len(m)):
    if m[i]=='a':
        result = result + 'o'
    else:
        result = result + m[i]
print(result)

Vous utiliserez aussi les fonctions qui transforment un caractère en un nombre dans la table ASCII : chr(72) et ord('d')

Affichez les caractères dont pour les codes ascii entre 32 et 126:

for i in range(32,127):
    print(chr(i))

(Vous pouvez utliser l'option sep='' de la fonction print pour les afficher en ligne.)

In [ ]:
 

Codage par décalage

Comme chez les jeunes scout-es et autres éclaireu-ses/rs, la phrase suivante a été codée avec le codage avocat (A vaut K, brillant jeu de mot). C'est à dire que les A ont été remplacé par des K, les B par des L, les C par des M, etc.

En utilisant les fonctions chr(), ord() et les calculs modulo 26 (avec le symbole d'opération %), retrouvez le message original. Attention, aux parenthèses entre ces différentes opérations. Tatonnez un peu.

message="VKWOBOCDVOMSWODSOBONEMRKDOKENSP"
In [ ]:
 

Un autre codage à la mode chez les enfants est le codage cassette (K7 ou encore K=7), où le K est remplacé par un 7, le L par un 8, le M par un 9, etc.

Voici donc un autre message à décoder:

message = [8, 1, 24, 11, 10, 15, 1, 10, 15, 1, 15, 16, 8, 23, 25]
message += [4, 11, 15, 1, 0, 17, 9, 11, 10, 0, 1, 8, 23, 9, 5, 1]
message += [17, 20, 12, 23, 14, 16, 23, 3, 1, 1]
In [ ]:
 

Évidemment, on ne trouve pas, en général, la manière de décoder un message avec le message codé...

Mais, les langues humaines ne sont pas du tout des suites aléatoires de lettres. En particulier en français le E est la lettre la plus fréquente: 17,26% des caractères d'un texte en français sont des E.

Voici donc un message.

message="FZCFRJXGNJSXSJJXQFAFQJZWSFYYJSIUFXQJSTRGWJIJXFSSJJX"

Quelle est la lettre la plus fréquente ? Il va vous falloir programmer pour parcourir cette chaine de caractère et pour chaque caractère compter son nombre d'occurences. Créez donc une liste occurence qui pour chaque lettre de 0 à 25 vous donne son nombre d'occurences, par exemple occurence[2]==1 car il y a un seul C dans message. Puis il faut chercher l'indice du plus grand des nombres d'occurences et donner la lettre correspondante.

In [ ]:
 

On donne une indication: le message a été codé par décalage (quelque chose de semblable à avocat ou cassette) mais ici vous ne savez pas quel est le décalage. Grâce à la lettre la plus fréquente qui doit coder le E, décoder le message.

In [17]:
 

Une lettre sur 7

Et si on enroulait la bande du message autour d'un crayon ?

Dans le message ci-dessous, on a écrit une lettre toutes les 7 posititions, si bien que "bonjour" devient "bxxxxxxoxxxxxxnxxxxxxjxxxxxxoxxxxxxuxxxxxxr".

Saurez-vous retrouver le message ?

message="Anda e  c'crsoceaao ne tisp reotelgtnm auaa etuslimso  one ubmpsmpsr"
message+="oa eu ilij rlsltotseee ue.s sdrm  d,aspApe n,sulvls  xaee sq nn uuu"
message+="csagnr'h,ie  uo tlmlnsd  oaeeeudn  sjnodsd aenetul  n eresfadpesili"
message+="ept  ut eeppt p, leeuu cuu nrles de al se e ebe tsnsancrpetnsraaieai"
message+="incg.lbssee eltp  Tseaaeeo,slrtfu  .e ftl;"

le code secret autour du crayon

In [ ]:

In [ ]:

Plus difficile !


Votre mission, maintenant, si vous l'acceptez est de décrypter le message suivant:

G LPKKNVAH RL BALYG RNAN LCLPO OFVWFVAH CNPKKN HVA 
RFP LCNZ VYN GNKPZLONHHN OAFM OPRFANN MFVA TVN WN 
YN ZAVHHN MLH TVN K NYHNRSKN GNH ZIFHNH TV FY YN 
GFPO MLH ULPAN NHO PYGPCPHPSKN NO TVN GNH WNVYNH 
UPKKNH TVP RLYTVNYO GN ANHMNZO L KL CPNPKKNHHN 
UVHHNYO OFVO G VY ZFVM LAANONNH MLA GNH HZAVMVKNH 
TVLYG PK H LBPO GN MKLPHPAH MKVH ONYOLONVAH TVN GN 
HLVONA MLA GNHHVH VY FZOFBNYLPAN

Vous pouvez commencer par créer une grande chaine de caractère message (en utilisant la somme des chaines de caractères pour ne pas les copier-coller toutes d'un coup).

In [ ]:
 

Le seul indice dont vous disposez pour votre travail d'espion-ne est que le message est écrit en français sans accents, les espaces sont restés et il n'y a pas de signes de ponctuation. Chaque lettre en clair correspond à une lettre cryptée

Et les linguistes (et les joueuses de scrabble) vous diront qu'en français la fréquence des lettres n'est pas du tout uniforme:

EASINTRLUODCPMVGFBQHXJYZKW
17,268,408,087,347,137,076,556,015,745,264,183,033,012,961,321,271,121,060,990,920,450,310,300,120,050,04

Les bigrammes les plus fréquents sont dans l'ordre décroissant :

ES DE LE EN RE NT ON ER TE EL AN SE ET LA AI IT ME OU EM IE



Quelle est la lettre la plus fréquente dans le message crypté ?

Vous pouvez commencer par tatonner. Ou bien vous pouvez faire une boucle pour afficher le nombre d'occurence (puis la fréquence)de chacune des 26 lettres de l'alphabet.

In [ ]:
 

Essayez de remplacer la lettre la plus fréquente par des 'e' (minuscule pour bien voir la différence entre lettre cryptée et lettre en clair).

message[0]='d'

(oups je vous ai donné un indice).

Tiens, et pourquoi ne pas utiliser un dictionnaire pour se souvenir de la correspondance entre lettre cryptée et lettre en clair ?

decodage=dict()
for i in range(26):
    decodage[chr(65+i)]=chr(65+i)

decodage[' ']=' '
decodage['G']='d'

message_clair=""
for c in message:
    message_clair += decodage[c]

print(message_clair)
In [26]:
 
In [ ]:
 

Un autre message si quelqu'un évente le premier:

FGTSG POAMOGA EO NYRZ ZO SYGOT
Z ORG EHHGIRHG IKFTGVOG EOAAI LIGR MOG KYTHGDDG
KIAGTELDG VGRUGOT Z ORG POAHG MOGTGDDG
GH KEDBGOTGOJ YLPGH Z ORG IRPOAHG TIUOGOT
PG ZGKGOTG IKKYLIDG GH KYR EKG ELEHHOG
SGZG EO SYOF MOI KG HOG
AI FTGA ZG VYIT KYR NGO TGSYKFGRAG
Y ZIGO D GHTERUG FGIRG
GR SGH ENNTYRH KYR FGTG GAH D YNNGRAG
GH D YNNGRAGOT DG FGTG ZG SBIKGRG
In [ ]:
 
In [ ]: