-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathChiffrement_Affine.py
108 lines (89 loc) · 5.83 KB
/
Chiffrement_Affine.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# -*- coding: utf-8 -*-
"""
Malik Makkes
"""
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
#Fonction pour tester notre programme
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
msg_déchiffré1 = decrypt(msg_chiffré1,3,-2) #On déchiffre le message chiffré1
msg_déchiffré2 = decrypt(msg_chiffré2,3,-2) #On déchiffre le message chiffré1
msg_déchiffré3 = decrypt(msg_chiffré3,3,-2) #On déchiffre le message chiffré1
print('Le message chiffré 1 est : \n', msg_chiffré1) #On affiche le message chiffré
print('Le message déchiffré 1 est : \n', msg_déchiffré1) #On affiche le message déchiffré
print('Le message chiffré 2 est : \n', msg_chiffré2) #On affiche le message chiffré
print('Le message déchiffré 2 est : \n', msg_déchiffré2) #On affiche le message déchiffré
print('Le message chiffré 3 est : \n', msg_chiffré3) #On affiche le message chiffré
print('Le message déchiffré 3 est : \n', msg_déchiffré3) #On affiche le message déchiffré