problem z szyfrem vigenere

0

Witam stworzyłem niedawno program szyfrujący i deszyfrujący do szyfru vigenere'a https://pl.wikipedia.org/wiki/Szyfr_Vigen%C3%A8re%E2%80%99a . Gływnym problemem jest to że nie działa a przynajmniej nie tak jakbym się tego spodziewał.
problem : jeżeli w slowie jest litera "z" to program wypisuje "z" a nie powinno tak być. np z i z powinno dać y a nie z
a oto program :

alfabet = []
tab = []


def calfabet(start):
    for litera in range(start, 91):
        alfabet.append(litera)
    for reszta in range(65, start):
        alfabet.append(reszta)
    print(alfabet)


def csmallalefabet(start):
    for litera in range(start, 122):
        alfabet.append(litera)
    for reszta in range(97, start):
        alfabet.append(reszta)


def encrypt(wordlit, keylit):
    calfabet(wordlit)
    tab.append(alfabet[keylit-65])
    alfabet.clear()


def decrypt(wordlit, keylit):
    calfabet(keylit)
    z = alfabet.index(wordlit)
    alfabet.clear()
    calfabet(65)
    tab.append(alfabet[z])
    alfabet.clear()


print("Co chcesz zaszyfrowac lub odszyfrowac?")
x = input().upper()
print("podaj slowo klucz:")
y = input().upper()


word = []
key = []
wordi = 0
keyi = 0


for znak in x:
    word.append(ord(znak))
for znak in y:
    key.append(ord(znak))

while len(key) < len(word):
    key = key*2


print("co chcesz zrobic? \n 1) zaszyfrowac:  \n 2) odszyfrowac: ")
wybor = input()


if wybor == "1":
    while len(tab) < len(x):
        if word[wordi] in range(65, 90):
            encrypt(word[wordi], key[keyi])
            wordi += 1
            keyi += 1
        else:
            tab.append(word[wordi])
            wordi += 1
else:
    while len(tab) < len(x):
        if word[wordi] in range(65, 90):
            decrypt(word[wordi], key[keyi])
            wordi += 1
            keyi += 1
        else:
            tab.append(word[wordi])

            wordi += 1
wynik2 = str
wynik = []

for znak in tab:
    wynik.append(chr(znak))

wynik2 = "".join(wynik)
print(wynik2)

0

Ziomeczku, a debuggera nie masz? Nauczcie się w końcu ogarniać debuggery, bo wyłapywanie błędów na oko rzeczywiście może być trudne. Choć mnie się w tym przypadku udało znaleźć błąd gołym okiem, ponieważ rzucał się w oczy ;)

Pytanko, co zwraca obiekt klasy range w tym przypadku?

range(65, 90)
0

A żeś naczarował... Podpowiem ci w ten sposób, można to zoptymalizować zarówno względem ilości kodów jak i złożoności obliczeniowej.

Wykorzystaj indexy tablicy alfabetu, joina i tyle ci wystarczy, nie powinno to być więcej niż ~15 linii kodu który nawet jest łatwiej debugować wzrokiem jeśli nie chcesz korzystać z debugera, poza tym, nie budujesz setek iteracji dla długich napisów. Oczywiście zakładam że chciałbyś to zrobić, jeśli nie chcesz, olej, jakbyś chciał, to w razie problemów mogę ci podesłać napisane przeze mnie rozwiązanie (jakieś kilkanaście miesięcy temu)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.