Le chiffrement affine est une méthode de chiffrement basée sur les fonctions affines… Mouais !
En d’autres termes, si x est le code d’une lettre sur un alphabet déterminé alors cette dernière sera transformée en une autre lettre dont le code est égal à ax+b mod n (où n est le nombre de caractères de l’alphabet choisi et où a et b sont deux entiers strictement inférieurs à n).
Par exemple, si on considère l’alphabet “ABCDEFGHIJKLMNOPQRSTUVWXYZ” et si on décide d’attribuer le nombre 0 à “A”, 1 à “B”, … , 25 à “Z”, en prenant le chiffrement basé sur les nombres a = 3 et b = 7, la lettre “M” (dont le code est 12) est transformée en la lettre dont le code est \(y\equiv3\times12+7\mod26\) soit \(y\equiv43\mod26\), donc en la lettre dont le code est y = 17, c’est-à-dire en la lettre “R”.
Pour automatiser le chiffrement d’un mot, il est alors pratique d’utiliser un programme.
Voici un exemple de programme Python qui permet de chiffrer et déchiffrer un message :
# Calcul du pgcd de a et b def pgcd(a,b): while b!=0: a,b=b,a%b return a # fonction de chiffrement affine def chiffrementAffine(a,b,L): 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"] x=alphabet.index(L) y=(a*x+b)%26 return alphabet[y] # Calcul de l'inverse d'un nombre modulo 26 def inverse(a): x=0 while (a*x%26!=1): x=x+1 return x # Fonction de déchiffrement def dechiffrementAffine(a,b,L): 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"] x=alphabet.index(L) y=(inverse(a)*(x-b))%26 return alphabet[y] # Affichage du mot chiffré def crypt(M,a,b): if (pgcd(a,26)==1): mot = [] for i in range(0,len(M)): mot.append(chiffrementAffine(a,b,M[i])) return "".join(mot) else: return "Chiffrement impossible. Veuillez choisir un nombre a premier avec 26." # Affichage du mot déchiffré def decrypt(M,a,b): if (pgcd(a,26)==1): mot = [] for i in range(0,len(M)): mot.append(dechiffrementAffine(a,b,M[i])) return "".join(mot) else: return "Déchiffrement impossible. Le nombre a n'est pas premier avec 26."
Une autre variante des deux dernières fonctions est :
# Affichage du mot chiffré def crypt(M,a,b): if (pgcd(a,26)==1): mot = [chiffrementAffine(a,b,i) for i in M] return "".join(mot) else: return "Chiffrement impossible. Veuillez choisir un nombre a premier avec 26." # Affichage du mot déchiffré def decrypt(M,a,b): if (pgcd(a,26)==1): mot = [dechiffrementAffine(a,b,i) for i in M] return "".join(mot) else: return "Déchiffrement impossible. Le nombre a n'est pas premier avec 26."
En tapant :
crypt("MATH",3,7)
on demande de chiffrer le mot “MATH” en prenant a = 3 et b = 7.
Le programme nous retourne alors : “RHMC”.
Maintenant, en tapant :
decrypt("RHMC",3,7)
on demande de déchiffrer le message.
Le programme retourne alors : “MATH” (logique !).
Bien entendu, si on prend a = 13, le chiffrement est impossible (car 13 et 26 ne sont pas premiers entre eux) et le programme retourne la phrase :
Chiffrement impossible. Veuillez choisir un nombre a premier avec 26.
Le chiffrement affine était au programme de Spécialité Math en Terminale S en France (exigible pour le bac).
hi,pourquoi cette condition apparait dans votre code
if (pgcd(a,26)==1
Comme mentionné dans le programme (voir le “else” qui suit), si cette condition n’est pas satisfaite, le chiffrement n’est pas possible. La raison est mathématique: si a n’est pas premier avec 26, alors il n’admet pas d’inverse modulo 26, ce qui pose un sérieux problème pour le déchiffrement (qui n’est alors pas unique).