Цикличное повторение ключа в шифре Виженера

Решил написать аналог шифра Виженера и поместить все это в функцию. Для начала следует растянуть ключ до длины шифруемого текста, чтобы он повторялся циклично:

Человек, посылающий сообщение, записывает ключевое слово («LEMON») циклически до тех пор, пока его длина не будет соответствовать длине исходного текста:

LEMONLEMONLE (текст - ATTACKATDAWN)

Соответственно, написал вот это:

# key_word = 'LEMON'
# message = 'ATTACKATDAWN'
key_word_large = ''
x = 0
while x < len(message):
    key_word_large += key_word[x % len(key_word)]
    x += 1

Как итог получилось довольно громоздко, я думал над тем как это все уместить покомпактнее, например в генератор списка, однако остановился на этом. Собственно вопрос состоит в том, как можно укоротить этот участок кода (без импорта модулей)

Кому надо, вот ссылка - https://ru.wikipedia.org/wiki/%D0%A8%D0%B8%D1%84%D1%80_%D0%92%D0%B8%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%B0


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

Автор решения: Тимур Машарипов

Не совсем понял, что делать если message по длине окажется меньше, чем key_word, поэтому код работает из следующего предположения:

Если, например, key_word = "LEMON", а message = "LOL", то key_word_large = "LEM"

Сам код:

key_word = 'LEMON'
message = 'ATTACKATDAWN'

p = len(message) // len(key_word)
q = len(message) % len(key_word)

key_word_large = key_word * p + key_word[:q]

Результат: LEMONLEMONLE

→ Ссылка