Неправильная расшифровка сообщения

Пишу шифровальщик алгоритм такой: каждая буква земенятся на определеноое количество в правою,эти цифры заносятся в ключ. Функция дешифровки работает некоректно вместо нормального вывода сообщения она выдает ZZZZZZZZ(Вывод программы ниже). Если послание состоит из одной буквы(а) и ключ для нее 3 то дешифрует программа правильно. Код

       alphabet = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
       ind = 0
       new_msg=[]
       while True:
           number = key[ind]
           letter = msg[ind]
           new_index = (alphabet.index(letter) - number) % len(alphabet)
           letter = alphabet[new_index]
           new_msg.append(letter)
           ind+=1
           if ind >=len(list(msg)):
               break
       print ("Исходное сообщение:")
       print(new_msg)

Вывод пограммы:

Зашифровать - 1
Расшифровать - 2
Сгенерировать пароль - 3
Выйти - 0
______________________________
Что вам нужно?1
Исходное сообщение:abc
Зашифрованное сообщение:
['z', 'M', 'S']
Коюч:
[26, 39, 45]
______________________________
Зашифровать - 1
Расшифровать - 2
Сгенерировать пароль - 3
Выйти - 0
______________________________
Что вам нужно?2
Зашифрованное сообщение:zMS
Вводите ключ по числам, если ключ введен впишите число 111
Цифрка ключа 0 :26
Цифрка ключа 1 :39
Цифрка ключа 2 :45
Цифрка ключа 3 :111
[26, 39, 45]
Если ваш ключ введен верно впишите y/n:y
Исходное сообщение:
['Z', 'Z', 'Z']

Ответы (1 шт):

Автор решения: passant

Все дело в том, что в Python операция вычисления остатка для отрицательных чисел выполняется по математическим правилам, то есть −7 % 4=1 при этом знак остатка совпадает со знаком делителя. Кстити, именно такой подход является корректным (https://ru.wikipedia.org/wiki/Деление_с_остатком) в отличии от некоторых других языков программирования.

Поэтому как только у вас случается ситуация alphabet.index(letter) < number, new_index принимает значение -1, что как раз и дает ваш символ 'Z'.

→ Ссылка