Fonction affine

To the non-french speaker, note that you can translate the articles using the Google Trad widget situated at the bottom of all pages.


Second algorithme que j’ai étudié : le chiffrement par fonction affine qui repose sur une fonction affine modulo 26 :

y = (a * x + b) % 26

Prenons le mot suivant :

salut

Ici notre clé de chiffrement symétrique sera un ensemble de deux nombres : a et b (respectivement 2 et 5 pour la suite de cet article).

Pour chiffrer notre message il faudra tout d’abord déclarer un dictionnaire de lettres numérotées de 0 à 25 :

1.png

Puis appliquer la formule vu plus haut :

y = (a * x + b) % 26

Par exemple pour la lettre ‘s’ nous obtiendrons la valeur suivante :

y = (2 * 17 + 5) % 26
y = 39 % 26
y = 13

Ce qui correspond dans notre tableau à un ‘n’. En bouclant sur l’ensemble des lettres de notre message nous obtiendrons cette chaîne de caractères :

xdifo

Pour déchiffrer ce message chiffré il faudra effectuer l’opération inverse. Or l’inverse de :

y = (a * x + b) % 26

c’est :

a^-1 * (y − b) = x % 26

Par exemple pour la lettre x on effectuera le calcul suivant :

2^-1 * (13 - 5) = x % 26
x = 17
salut

Ce qui correspond bien à la lettre ‘s’.

Pour finir je vous laisse le code python que j’ai utilisé pour implémenter cet algorithme :

dic = {
    "a":0,
    "b":1,
    "c":2,
    "d":3,
    "e":4,
    "f":5,
    "g":6,
    "h":7,
    "i":8,
    "j":9,
    "k":10,
    "l":11,
    "m":12,
    "n":13,
    "o":14,
    "p":15,
    "q":16,
    "r":17,
    "s":18,
    "t":19,
    "u":20,
    "v":21,
    "w":22,
    "x":23,
    "y":24,
    "z":25,
    }

print("CHIFFREMENT PAR FONCTION AFFINE----------------")

string = "SALUT"
ciphered = ""
unciphered = ""
a = 17
b = 3

print("Ciphering : {}".format(string))
for c in string.lower() :
    number = (a * dic[c] + b) %26
    for key, value in dic.items():
        if value == number:
            ciphered += key
print("CIPHERED: {}\n".format(ciphered))

print("Unciphering : {}".format(ciphered))

def inverse(a):
    x = 0
    while a * x % 26 != 1:
        x += 1
    return x

for c in ciphered :
    number = inverse(a) * (dic[c] - b)
    for key, value in dic.items():
        if value == number % 26:
            unciphered += key
print("UNCIPHERED : {}\n".format(unciphered))

Ne vous inquiétez pas, les prochains algorithmes seront plus violents/compliqués, promis 😉 !

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l'aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s