crypter_chiffre_affine.py

Created by jerem-jarsaillon

Created on January 23, 2024

5.25 KB


alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] #Notre liste d'alphabet en minuscule
alphabet2 = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'] #Notre liste d'alhabet en majuscule

for x in range(len(alphabet)): #On parcours notre alphabet1 et alphabet2
  alphabet.append(alphabet[x]) ##On append notre alphabet en minuscule
  alphabet2.append(alphabet2[x]) #On append notre alphabet en majuscule


# Calcul du pgcd de a et b
def pgcd(a,b): 
    while b!=0: #Boucle tant que b différent de 0
        a,b=b,a%b #On change le a avec le b ensuite on fait a%b
    return a #On retourne a


# Fonction de chiffrement affine
def chiffrementAffine(a,b,L):
        if L in alphabet2: #Si L est une lettre en majuscule
          x=alphabet2.index(L) #x prend l'indice de la lettre dans l'alphabet en majuscule
          y=(a*x+b)%26 #y prend la valeur de la lettre en majuscule L après chiffrement affine 
          return alphabet2[y] #On retourne la lettre chiffrée en majuscle
        elif L in alphabet : #Sinon Si L est une lettre en minuscle
            x=alphabet.index(L) #x prend l'indice de la lettre dans l'alphabet en minuscule
            y=(a*x+b)%26 #y prend la valeur de la lettre en minsucle L après chiffrement affine 
            return alphabet[y] #On retourne la lettre chiffrée en minuscule
        else :       #Sinon c'est un symbole
            return L #On retourne le symbole tout simplement sans rien effectuer
        
        
# Calcul de l'inverse d'un nombre modulo 26
def inverse(a):
        x=0 #x prend la valeur 0 au départ
        while (a*x%26!=1): #Boucle tant que a*x%26 n'est pas différent de 1
                x=x+1 #x prend la valeure de x + 1 tant que la boucle est vrai
        return x #On retourne la valeure de x
   
    
#Calcul de l'inverse d'un nombre modulo 26 avec Euclide Etendu
def euclide(a):
    # Initialisation
    b=26 #b prend la valeur 26 
    d,u,v,d1,u1,v1=a,1,0,b,0,1 #on initialiste les 1ere cases pour effectuer l'algorithme d'euclide etendu
    # Calcul
    while d1!=0: #Boucle qui s'arrete seulement lorsque d = 0
        q=d//d1 #q prend la valeur du reste de la division euclidienne de d par d1
        d,u,v,d1,u1,v1=d1,u1,v1,d-q*d1,u-q*u1,v-q*v1 #On applique la formule du cours
    x=u #x prend la valeur de l'inverse de a
    return x #On retourne l'inverse de a


# Fonction de déchiffrement
def dechiffrementAffine(a,b,L):
    if L in alphabet: #Si L est une lettre en minuscule
        x=alphabet.index(L) #x prend l'indice de la lettre dans l'alphabet en minuscule
        y=(inverse(a)*(x-b))%26 #y prend la valeur de la lettre en minsucle L après déchiffrement affine
        return alphabet[y] #On retourne la lettre déchiffrée en minuscule
    elif L in alphabet2 : #Sinon si L est une lettre en majuscule
        x=alphabet2.index(L) #x prend l'indice de la lettre dans l'alphabet en majuscule
        y=(inverse(a)*(x-b))%26 #y prend la valeur de la lettre en majuscule L après déchiffrement affine
        return alphabet2[y] #On retourne la lettre déchiffrée en majuscle
    else :              #Sinon c'est un symbole non chiffré
        return L        #On retourne le symbole
      
                
# Affichage du mot chiffré
def crypt(M,a,b):
    if (pgcd(a,26)==1): #Si le pgcd de a et 26 est égale à 1
        mot = [] #On initialiste un string vide
        for i in range(0,len(M)): #Boucle qui parcours la longeur du message à chiffré
                mot.append(chiffrementAffine(a,b,M[i])) #mot prend à chaque parcours la lettre chiffré après appel à la fonction chiffrementAffine et on la met à la fin de mot
        return "".join(mot) #On retourne le mot avec toute les lettres ou symboles chiffrés
    else: #Sinon il y a une erreur
        return "Chiffrement impossible. Veuillez choisir un nombre a premier avec 26." #On retourne que a n'est pas premier avec 26


# Affichage du mot déchiffré
def decrypt(M,a,b):
    if (pgcd(a,26)==1): #Si le pgcd de a et 26 est égale à 1
        mot = [] #On initialiste un string vide
        for i in range(0,len(M)):  #Boucle qui parcours la longeur du message à déchiffré
          mot.append(dechiffrementAffine(a,b,M[i])) #mot prend à chaque parcours la lettre déchiffré après appel à la fonction déchiffrementAffine et on la met à la fin de mot
        return "".join(mot) #On retourne le mot avec toute les lettres ou symboles déchiffrés
    else: #Sinon il y a une erreur
        return "Déchiffrement impossible. Le nombre a n'est pas premier avec 26." #On retourne que a n'est pas premier avec 26



message1 = 'Malik' #jeu d'essai 1 à chiffrer
message2 = 'M4l1k'#jeu d'essai 2 à chiffrer
message3 = 'Un t3st 4v3ec pl3!in de ch@rchteres sp3c !aux'#jeu d'essai 3 à chiffrer
msg_chiffré1 = crypt(message1, 3, -2) #On chiffre le message1
msg_chiffré2 = crypt(message2, 3, -2) #On chiffre le message2 
msg_chiffré3 = crypt(message3, 3, -2) #On chiffre le message3
print('Le message chiffré 1 est  : \n', msg_chiffré1) #On affiche le message chiffré
print('Le message chiffré 2 est  : \n', msg_chiffré2) #On affiche le message chiffré 
print('Le message chiffré 3 est  : \n', msg_chiffré3) #On affiche le message chiffré 

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our cookies policy.