Table of Contents

    Les outils PYTHON pour la cryptographie.

    Les outils de base

    • On utilise les lettres minuscules codées de 97 à 122
    • les lettres majuscules sont codées de 65 à 90
    • l'espace est le caractère 32
    • le code ASCII de base ne possède pas de caractère accentué

    Les outils PYTHON utilisés :

    • list(" texte") transforme un texte en liste de lettres
    • méthode join qui fait le contraire
    • ord("car") envoie son code dans la table ascii
    • chr(nombre) fait le contraire
    In [0]:
    texte="hello world"
    
    In [0]:
    # Transformer un  texte en en liste
    
    ListeLettres=list(texte)
    print(ListeLettres)
    
    ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
    
    In [0]:
    # Transformer une liste en un texte
    
    string=""
    Phrase=string.join(ListeLettres)
    
    print(Phrase)
    
    hello world
    
    In [0]:
    # Obtenir une liste de nombres à la place des lettres
    
    ListeLettresChiffrees=[]
    for lettre in ListeLettres : 
        ListeLettresChiffrees.append(ord(lettre))
    
    print(ListeLettresChiffrees)
    
    [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
    
    In [0]:
    # Obtenir une liste de nombres à la place des lettres
    
    ListeLettres=[]
    for nombre in ListeLettresChiffrees : 
        ListeLettres.append(chr(nombre))
    
    print(ListeLettres)
    
    ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
    
    In [0]:
    # On transforme ces outils en fonctions 
    
    def LireTexte(texte):
        return list(texte)
    
    
    def LireListeLettres(liste):
        string=""
        Phrase=string.join(liste)
        return Phrase
        
    def TransformeLettreNombre(ListeLettres):
        ListeLettresChiffrees=[]
        for lettre in ListeLettres : 
            ListeLettresChiffrees.append(ord(lettre))
        return ListeLettresChiffrees
            
    def TransformeNombreLettre(ListeLettresChiffrees):
        ListeLettres=[]
        for nombre in ListeLettresChiffrees : 
            ListeLettres.append(chr(nombre))
        return ListeLettres
    
    
            
    
    In [0]:
    def demo():
        phrase="hello world"
        print(phrase)
        ListeLettres=LireTexte(phrase)
        print(ListeLettres)
        ListeLettresChiffrees=TransformeLettreNombre(ListeLettres)
        print(ListeLettresChiffrees)
        ListeLettres2=TransformeNombreLettre(ListeLettresChiffrees)
        print(ListeLettres2)
        print(LireListeLettres(ListeLettres2))
        
    demo()
    
    hello world
    ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
    [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
    ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
    hello world
    
    In [0]:
    cle=6
    
    # On prend en compte la ponctuation , les majuscules et les minuscules.
    #On ne prend pas en compte les accents.
    
    def Listecode1(texte,cle):
        "code César qui fonctionne par décalage des lettres de l'alphabet"
        ListeLettres=LireTexte(texte)
        ListeLettresChiffrees=TransformeLettreNombre(ListeLettres)
        ListeCodee=[]
        for element in ListeLettresChiffrees:
            if 97<= element <= 122-cle: ListeCodee.append(element+cle) # Les minuscules
            elif 122-cle< element<123: ListeCodee.append(element+cle-26)
            elif 65<= element <= 90-cle: ListeCodee.append(element+cle) # Les majuscules
            elif 90-cle<element<91 : ListeCodee.append(element+cle-26)
            else : ListeCodee.append(element) # Le reste du monde
                
        ListeLettres2=TransformeNombreLettre(ListeCodee)
        TexteCode=LireListeLettres(ListeLettres2)
        return TexteCode
    
    In [0]:
    def demo2(texte):
        print(Listecode1(texte,6))
    
    texte="hello world"
    
    demo2(texte)
    
    nkrru cuxrj
    
    In [0]:
    # Pour décoder
    
    def ListeDeCode1(texte,cle):
        assert 0<cle<27
        "code César qui fonctionne par décalage des lettres de l'alphabet"
        ListeLettres=LireTexte(texte)
        ListeLettresChiffrees=TransformeLettreNombre(ListeLettres)
        ListeCodee=[]
        for element in ListeLettresChiffrees:
            if 97+cle<= element <= 122: ListeCodee.append(element-cle) # Les minuscules
            elif 96 < element<97+cle: ListeCodee.append(element-cle+26)
            elif 65+cle<= element <= 90: ListeCodee.append(element-cle) # Les majuscules
            elif 64<element<65+cle : ListeCodee.append(element-cle+26)
            else : ListeCodee.append(element) # Le reste du monde
                
        ListeLettres2=TransformeNombreLettre(ListeCodee)
        TexteDeCode=LireListeLettres(ListeLettres2)
        return TexteDeCode
    
    In [0]:
    ListeDeCode1("nkrru cuxrj",6)
    
    Out[0]:
    'hello world'
    In [0]:
    for cle in range(1,27) : 
        print(ListeDeCode1("nkrru cuxrj",cle))
    
    mjqqt btwqi
    lipps asvph
    khoor zruog
    jgnnq yqtnf
    ifmmp xpsme
    hello world
    gdkkn vnqkc
    fcjjm umpjb
    ebiil tloia
    dahhk sknhz
    czggj rjmgy
    byffi qilfx
    axeeh phkew
    zwddg ogjdv
    yvccf nficu
    xubbe mehbt
    wtaad ldgas
    vszzc kcfzr
    uryyb jbeyq
    tqxxa iadxp
    spwwz hzcwo
    rovvy gybvn
    qnuux fxaum
    pmttw ewztl
    olssv dvysk
    nkrru cuxrj
    

    Lecture d'un fichier pour obtenir un message codé.

    Exercice

    Décoder le message situé dans le fichier source : messageCode.txt

    Il s'agit d'un cryptage par décalage.

    • Vous pouvez utiliser la fréquence d'apparition des lettres.
    • Vous pouvez écrire une fonction qui teste tous les décalages.
    In [1]:
    fichier = open("messageCode.txt", "r")
    texte=fichier.read()
    
    ---------------------------------------------------------------------------
    FileNotFoundError                         Traceback (most recent call last)
    <ipython-input-1-4495a7f1b880> in <module>()
    ----> 1 fichier = open("messageCode.txt", "r")
          2 texte=fichier.read()
    
    FileNotFoundError: [Errno 2] No such file or directory: 'messageCode.txt'
    In [0]:
    print(texte)
    
    Ut g vgxluoy hkyuot jk iussatowakx jky otluxsgzouty wao tk juobktz vgy zushkx ktzxk rky sgoty jk zokxy. Vrayokaxy skznujky vkxskzzktz j'gzzkotjxk ik haz, sgoy rk vxotiovk kyz wak rky juttkky juobktz kzxk ixevzkky.
    
    In [0]:
    def liste_lettres(texte):
        liste=LireTexte(texte)
        dico_lettres={}
        for lettre in liste:
                if lettre in dico_lettres.keys():
                    dico_lettres[lettre]=dico_lettres[lettre]+1
                else : dico_lettres[lettre]=1
        return dico_lettres
    
    def freq_lettres(dico_lettres):
        ListeValeurs=dico_lettres.values()
        total=sum(ListeValeurs)
        freq_lettres={}
        for car in dico_lettres.keys():
            freq_lettres[car]=dico_lettres[car]/total
        return freq_lettres
    
    def freqLettre(DictionnaireFrequence,char):
        ListeLettres=DictionnaireFrequence.keys()
        if char in ListeLettres:
            return DictionnaireFrequence[char]
        else : return 0
    
    In [0]:
    dico_Lettres=liste_lettres(texte)
    dico_freq_lettres=freq_lettres(dico_Lettres)
    
    In [0]:
    dico_freq_lettres
    
    Out[0]:
    {' ': 0.15492957746478872,
     "'": 0.004694835680751174,
     ',': 0.004694835680751174,
     '.': 0.009389671361502348,
     'U': 0.004694835680751174,
     'V': 0.004694835680751174,
     'a': 0.03286384976525822,
     'b': 0.009389671361502348,
     'e': 0.004694835680751174,
     'g': 0.03286384976525822,
     'h': 0.014084507042253521,
     'i': 0.018779342723004695,
     'j': 0.04225352112676056,
     'k': 0.15492957746478872,
     'l': 0.009389671361502348,
     'n': 0.004694835680751174,
     'o': 0.07042253521126761,
     'r': 0.018779342723004695,
     's': 0.03755868544600939,
     't': 0.07042253521126761,
     'u': 0.046948356807511735,
     'v': 0.028169014084507043,
     'w': 0.014084507042253521,
     'x': 0.056338028169014086,
     'y': 0.07511737089201878,
     'z': 0.07511737089201878}
    In [0]: