Il cifrario di Vigenère si basa su un semplice cifrario di Cesare. La chiave di esso però cambia per ogni lettera seguendo una stringa (chiave/verme).
Quindi per la prima lettera viene usata la codifica seguendo la prima lettera della chiave, la seconda con la seconda della chiave e così via. Quando la chiave termina viene ripetuta.
import string
alph = string.ascii_lowercase
verme = 'chiave'
to_crypt = 'segreto da non rivelare'
# calcola lo shift del verme
verme_shift = list()
for lettera in verme:
index = alph.index(lettera)
verme_shift.append(index)
print(verme_shift)
[2, 7, 8, 0, 21, 4]
crypted = ''
for i, lettera in enumerate(to_crypt):
if lettera in alph:
letter_index = alph.index(lettera)
shift = verme_shift[i%len(verme)]
nuova_letter_index = (letter_index + shift)%len(alph)
nuova_lettera = alph[nuova_letter_index]
crypted += nuova_lettera
else:
crypted += lettera
print(crypted)
ulorzxq la rqu rdzgsirz