def metEnForme(chaine):
resu = ''
for c in chaine:
if ord(c) > 96 and ord(c) < 123:
resu += c return resu
def tableau(t):
return [ord(x) - 97 for x in t]
def texte(t):
return ''.join(chr(x + 97) for x in t)
texteEssaiBrut = 'bla, bla, bla'
texteEssai = metEnForme(texteEssaiBrut) texteEssaiNumerique = tableau(texteEssai)
clef = 'clef'
clefNumerique = tableau(clef)
def codageCesar(t, d):
return [(x - d) % 26 for x in t]
def decodageCesar(t, d):
return [(x + d) % 26 for x in t]
def frequences(t1):
resultat = 26*[0]
for x in t1:
resultat[x] += 1 return resultat
def indice_du_maximum(fr):
indice, valeur = 0, fr[0]
for k in range(1, 26):
if fr[k] > valeur:
indice, valeur = k, fr[k]
return indice
def decodageAuto(t1):
indice = indice_du_maximum(frequences(t1)) d = 4 - indice
return decodageCesar(t1, d)
def codageVigenere(t, c):
n, k = len(t), len(c)
return [ (t[j] + c[j % k]) % 26 for j in range(n)]
def pgcd(a, b): # fonctionne pour a, b >= 0 while b > 0:
1
if b > a:
a, b = b, a a = a - b
return a
def longueurDeLaCle(t):
n, d = len(t), 0
for i in range(n - 5):
for j in range(i + 3, n - 2):
if t[i:i+3] == t[j:j+3]:
d = pgcd(d, j - i) return d
def decodageVigenereAuto(t):
lClef = longueurDeLaCle(t) for j in range(lClef):
sousTableau = t[j::lClef]
decode = decodageAuto(sousTableau) t[j::lClef] = decode
tableauCode = codageVigenere(texteEssaiNumerique, clefNumerique)
decodageVigenereAuto(tableauCode) resultatFinal = texte(tableauCode) print(resultatFinal)
2