Делишь задачу на под-задачи. Допустим, у тебя есть строка-исходный текст
text
и строка-ключ
key
, а также список строк, содержащий алфавит языка
alpha
.
Определяешь функцию, заменяющую символ по шифру:
# принимает символ открытого текста, его позицию в тексте, строку-ключ и алфавит
# возвращаем символ шифротекста
def viginere_encode(text_char: str, i: int, key: str, alpha: list[str]) -> str:
if text_char not in alpha: # незнакомый символ?
return text_char # оставляем его как есть
text_char_code = alpha.index(text_char) # номер символа открытого текста в алфавите
key_char = key[i % len(key)] # символ ключа, соответствующего i-му символу открытого текста
key_char_code = alpha.index(key_char) # номер символа ключа в алфавите
cypher_char_code = (text_char_code + key_char_code) % len(alpha) # номер символа шифротекста
return alpha[cypher_char_code] # возвращаем символ шифротекста
А дальше применяем эту функцию к строке:
cipher_text = ''
for i in range(len(text)):
cipher_text += viginere_encode(text[i], i, key, alpha)
Вот и всё. Да, тут много чего можно оптимизировать, но я старался писать как можно проще.
Полный примерalpha = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
text = 'A SMOKE OF MOTHERLAND IS SWEET FOR US AND PLEASANT'
key = 'SECRET'
# принимает символ открытого текста, его позицию в тексте, строку-ключ и алфавит
# возвращаем символ шифротекста
def viginere_encode(text_char: str, i: int, key: str, alpha: list[str]) -> str:
if text_char not in alpha: # незнакомый символ?
return text_char # оставляем его как есть
text_char_code = alpha.index(text_char) # номер символа открытого текста в алфавите
key_char = key[i % len(key)] # символ ключа, соответствующего i-му символу открытого текста
key_char_code = alpha.index(key_char) # номер символа ключа в алфавите
cypher_char_code = (text_char_code + key_char_code) % len(alpha) # номер символа шифротекста
return alpha[cypher_char_code] # возвращаем символ шифротекста
# принимает символ шифротекста, его позицию в тексте, строку-ключ и алфавит
# возвращаем символ открытого текста
def viginere_decode(cipher_char: str, i: int, key: str, alpha: list[str]) -> str:
if cipher_char not in alpha: # незнакомый символ?
return cipher_char # оставляем его как есть
cipher_char_code = alpha.index(cipher_char) # номер символа шифротекста в алфавите
key_char = key[i % len(key)] # символ ключа, соответствующего i-му символу шифротекста
key_char_code = alpha.index(key_char) # номер символа ключа в алфавите
text_char_code = (text_char_code + len(alpha) - key_char_code) % len(alpha) # номер символа открытого текста
return alpha[cypher_char_code] # возвращаем символ открытого текста
cipher_text = ''
for i in range(len(text)):
cipher_text += viginere_encode(text[i], i, key, alpha)
decoded_text = ''
for i in range(len(cipher_text)):
decoded_text += viginere_decode(cipher_text[i], i, key, alpha)
print(text)
print(cipher_text)
print(decoded_text)