12. Код Цезаря. (в коде есть строки из следующих тем: "словари").

(открыть в новой вкладке)

Условие:

Одним из первых в истории примеров шифрования считаются закодированные послания Юлия Цезаря. Римскому полководцу необходимо было посылать письменные приказы своим генералам, но он не желал, чтобы в случае чего их прочитали недруги. В результате он стал шифровать свои послания довольно простым методом, который впоследствии стали называть кодом Цезаря.
Идея шифрования была совершенно тривиальной и заключалась в цик­лическом сдвиге букв на три позиции. В итоге буква A превращалась в D, B – в E, C – в F и т. д. Последние три буквы алфавита переносились на начало. Таким образом, буква X становилась A, Y – B, а Z – C. Цифры и другие символы не подвергались шифрованию.
Напишите программу, реализующую код Цезаря для русского алфавита. Позвольте пользователю ввести фразу и количество символов для сдвига, после чего выведите результирующее сообщение. Убедитесь в том, что ваша программа шифрует как строчные, так и прописные буквы.

Код:

alphabet = { "а": 1, "б": 2, "в": 3, "г": 4, "д": 5, "е": 6, "ё": 7, "ж": 8, "з": 9, "и": 10, "й": 11, "к": 12, "л": 13, "м": 14, "н": 15, "о": 16, "п": 17, "р": 18, "с": 19, "т": 20, "у": 21, "ф": 22, "х": 23, "ц": 24, "ч": 25, "ш": 26, "щ": 27, "ъ": 28, "ы": 29, "ь": 30, "э": 31, "ю": 32, "я": 33 }
diapazon_letters = range(1, 34)

while True:
    try:
        move = int(input("%40s" % "Ведите смещение от 1 до 32: "))
        if move in range(1, 33):
            break
        else:
            print("%39s" % "Смещение может быть только от 1 до 32.")    
    except:
        print("%39s" % "Смещение может быть только от 1 до 32.")
        continue

message = input("%40s" % "Введите сообщение от Цезаря: ")
message_new = str()

for i in message:                                                                           # обойдём все символы послания в цикле
    i = i.lower()                                                                           # все символы в послании приведём в нижний регистр
    if i in alphabet:                                                                       # если это русская буква и она есть в алфавите  
        digit = alphabet[i]                                                                 # узнаем номер этой буквы
        new_digit = (digit + move) % 33                                                     # согласно смещению, назначит новый номер букве (подменный)
        for a, b in alphabet.items():                                                       # обойдём алфавит и найдём новую букву для подменной цифры
            if b == new_digit:
                message_new += a                                                            # добавим букву в новое сообщение
    else:
        message_new += i                                                                    # этот блок добавляет символ в новое сообщение без изменений (это не буква в нашем алфавите)

print("%39s" % message_new)