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).