""" Scripts du TP 1 PT - Lycée Vauvenargues Auteur : JMG """ ### Exercice 1 def cesar_chiffre_nb(x,k): return (x+k)%26 def cesar_dechiffre_nb(x,k): return (x-k)%26 def flc(lettre): return(ord(lettre)-65) def fcl(chiffre): return(chr(chiffre+65) ) def limo(liste): "".join(liste) """ chaine="" for x in liste: chaine=chaine+x return(chaine) """ def cesar_chiffre_mot(phrase,k): phrase_codee = "" for lettre in phrase: if lettre==" ": phrase_codee=phrase_codee+" " else : lettre_cryptee = fcl(cesar_chiffre_nb(flc(lettre),k)) phrase_codee=phrase_codee+lettre_cryptee return(phrase_codee) def cesar_dechiffre_mot(phrase,k): phrase_codee = "" for lettre in phrase: if lettre==" ": phrase_codee=phrase_codee+" " else : lettre_cryptee = fcl(cesar_dechiffre_nb(flc(lettre),k)) phrase_codee=phrase_codee+lettre_cryptee return(phrase_codee) print("Le texte crypté de ALEA JACTA EST par César est", cesar_chiffre_mot("ALEA JACTA EST",3)) print("Le texte décrypté de WX HV WURS ERQ par César est", cesar_chiffre_mot("GRQQH WRXW FH TXH WX DV",-3)) def attaque_cesar(mot): for k in range(26): print(k,cesar_chiffre_mot(mot,-k)) print('\nLes 26 tentatives pour LTBLMNEBKXLTGLXLITVX sont :\n') attaque_cesar("LTBLMNEBKXLTGLXLITVX") ### Exercice 2 def freq(chaine,lettre): # La fréquence d'une lettre est son nombre d'occurences divisée par la longueur du mot. # ici , on n'utilise par la méthode count, mais elle fonctionnerait en écrivant : compteur=chaine.count(lettre) compteur=0 for x in chaine: if x==lettre: compteur+=1 return(compteur/len(chaine)) f=open('phrasecryptee.txt','r') #éviter d'utiliser : f.readlines() qui renvoie la liste des lignes, mais qui place le pointeur de lecture à la fin !!! plus rien à lire dans la boucle for suivante... #f.close() c="" for l in f: c=c+l[0:-1] #ou encore c=c+l.replace('\n',"") #ou encore c=c+l.rstrip('\n') listefreq=[freq(c,fcl(k)) for k in range(26)] #print("\nLa liste des fréquences des 26 lettres dans c est", listefreq) import matplotlib.pyplot as pl pl.close() pl.plot(range(26),listefreq,'o') #On obtient que E est codé par 11. Or, il est codé par 4 sans cryptage, donc k = 11 - 4 = 7" M=max(listefreq) indice=[k for k in range(26) if freq(c,fcl(k))==M] print("La clé vaut : ", indice-4) # 4 étant l'entier associé à E print("\nLe texte décrypté de phrasecryptee par César est", cesar_chiffre_mot(c,-7)) ### Exercice 3 def vigenere(mot,cle): # Clé dutype [n_1,..., n_k] chaine_crypte="" k=len(cle) #Longueur de la clef i=0 #Rang dans le bloc for lettre in mot: #Pour chaque lettre if lettre!=" ": nomb=flc(lettre) # lettre devient un nb de 0 a 25 nomb_code=cesar_chiffre_nb(nomb,cle[i]) #Vigenere: on ajoute n_i lettre_code=fcl(nomb_code) #On repasse aux lettres i=(i+1)%k #On passe au rang suivant chaine_crypte+=lettre_code #Ajoute lettre au message return(chaine_crypte ) #print(cesar_chiffre_mot("VENI VEDI VICI",23)) cle=[flc(lettre) for lettre in "STAR"] print("La phrase codée par Vigenère pour la clé PT est :",vigenere("A FOND ",(15,19))) cle_recip=[-flc(lettre) for lettre in "STAR"] print("La phrase décodée par Vigenère pour la clé STAR est :",vigenere("LHUJHHLPLXCYFBCZWGSCWLPKKMAIK",tuple(cle_recip))) def statistiques(phrase): liste_stat=[] for i in range(26): liste_stat.append([0,chr(i+65)]) for lettre in phrase: #On parcourt la phrase i=ord(lettre)-65 #On transforme la lettre en nombre par la bijection f_nc if 0<=i and i<26: #Si c'est une vraie lettre liste_stat[i][0] = liste_stat[i][0]+1 return(liste_stat) print('Voici les stats pour LHLZ HFQ BC HFFPZ WH YOUPFH MUPZH :', statistiques("LHLZ HFQ BC HFFPZ WH YOUPFH MUPZH"))