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
| #!/usr/bin/env python
# -*- coding: UTF-8 -*-
import string
# Fonction qui chiffre/déchiffre une lettre en fonction d'un alphabet donné et d'une base de décalage
def Vigenere(alphaN, base, lettre, crypt=True):
# Recherche position de la base dans l'alphabet
ind=alphaN.find(base)
# Si base non trouvée, alors alphabet chiffré identique à alphabet donné
if ind == -1: ind=0
# Création de l'alphabet chiffré à partir de l'alphabet normal et de la base
alphaK="".join([alphaN[(ind + i) % len(alphaN)] for i in range(len(alphaN))])
# Positionnement du masque de conversion en fonction du sens (chiffrage/déchiffrage)
masque=(alphaN, alphaK) if crypt else (alphaK, alphaN)
# Recherche index lettre dans le masque de départ
ind=masque[0].find(lettre)
# Si lettre n'appartient pas à l'alphabet on la renvoie telle quelle. Elle ne sera pas chiffrée mais ne plantera pas la fonction
if ind == -1: return lettre
# Renvoi lettre associée du masque d'arrivée
return masque[1][ind]
# Vigenere
# Création de l'alphabet à partir de tous les caractères imprimables de la table ascii (majuscules, minuscules, chiffres, ponctuation, ...)
alpha="".join([chr(i) for i in range(256) if chr(i) in string.printable])
# Clef
clef="bonjour"
# Test de chiffrage sur clef
secret="".join(
[Vigenere(alpha, clef[i % len(clef)], x) for (i, x) in enumerate("Les sanglots longs des violons de l'automne, bercent mon coeur d'une langueur monotone !!!")]
)
print "Chiffre: [%s]" % secret
print
# Test de déchiffrage (même clef)
print "Clair: [%s]" % "".join(
[Vigenere(alpha, clef[i % len(clef)], x, False) for (i, x) in enumerate(secret)]
) |
Partager