Définition

Le chiffrement affine est une version améliorée du Code césar. Il utilise deux clés, a et b

On retrouve ces deux équations:

  • Chiffrement:
  • Déchiffrement: p = a$$^-$$^1 Où:
  • c est le message codé
  • p est le message décodé
  • a et b sont les coefficients (clé secrète) du chiffre affine.
  • a doit avoir un inverse a^-$$^1 qui est l’inverse de
  • a est inversible si gcd(a, n) == 1 (voir méthode inverse)

Méthode inverse:

def inverse(a, n):
  for it in range(1, n):
    if ((a * it) % n == 1):
      return it
  return -1

Chiffrement

Afin de chiffre un message avec le chiffrement Affine, on peut utiliser le code ci-dessous

def encryptAffine(m, a, b, n = 26):
  encryptedMessage = ""
 
  for car in m:
    if car.lower() in alphabet:
      c = ((a * numericChar(alphabet, car)) + b) % n
      encryptedMessage += alphabet[c]
    else:
      encryptedMessage += car
  return encryptedMessage

Ainsi, encryptAffine("Sparks", 10, 2) donneras awcqya

Déchiffrement

De même, le code ci-dessous est un exemple d’implémentation du déchiffrement du chiffrement Affine:

def decryptAffine(ctext, a, b, n=26):
    a_inv = inverse(a, n)
    if a_inv == -1:
        raise ValueError("a n'est pas inversible modulo n")
        
    plaintext = ""
    for char in ctext:
        if char.lower() in alphabet:
            c = numericChar(alphabet, char)
            p = (a_inv * (c - b)) % n
            plaintext += alphabet[p]
        else:
            plaintext += char
    return plaintext