Реализация сдвига букв на определенное количество в лево на python3

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

key = []
new_msg = []
alphabet = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
ind = 0
while True:
  rannd = random.randint(0, 52)
  key.append(rannd)
  letter = msg[ind]
  alphabet.index(letter)
  letter = alphabet[(alphabet.index('Z') + rannd) % len(alphabet)]
  new_msg.append(letter)
  ind += 1
  if ind >= len(list(msg)):
    break

print("Зашифрованное сообщение:")
print(new_msg)
print('Коюч:')
print(key) ```


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

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

Использование отрицательного значения сдвига работает

Пример:

import random
from typing import Tuple, List


alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"


def shift_letter(letter: str, number: int) -> str:
    new_index = (alphabet.index(letter) + number) % len(alphabet)
    return alphabet[new_index]


def encrypt(text: str) -> Tuple[str, List[int]]:
    key = []
    new_msg = []

    for c in text:
        rand_index = random.randint(0, len(alphabet))
        new_msg.append(shift_letter(c, rand_index))
        key.append(rand_index)

    return ''.join(new_msg), key


def decrypt(text: str, key: List[int]) -> str:
    return ''.join(
        shift_letter(c, -shift)
        for c, shift in zip(text, key)
    )

Проверяем работу:

msg = 'HelloWorld'
encrypt_msg, key = encrypt(msg)
print(encrypt_msg, key)
# spKkXFUokt [37, 11, 25, 51, 35, 35, 32, 49, 51, 16]

print(decrypt(encrypt_msg, key))
# HelloWorld
→ Ссылка