-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtask13_cesar_cod.py
More file actions
61 lines (56 loc) · 4.53 KB
/
task13_cesar_cod.py
File metadata and controls
61 lines (56 loc) · 4.53 KB
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
"""
Довольно часто программисты сталкиваются с задачами кодирования информации. Закодировать сообщение в чате между двумя пользователями.
Зашифровать пароль и имя пользователя при аутентификации пользователя по сети и т.д.
Напишите программу, реализующую код Цезаря. Назван он в честь великого римского императора Юлия Цезаря.
Идея шифрования заключается в циклическом сдвиге букв на заданное количество.
Например, если сдвиг на три позиции, то буква A становится буквой D, B – E, и т.д. Последние три буквы алфавита зацикливаются и
переносятся в начало. Буква X становится A, Y – B, а Z – C. Цифры, пробелы и другие символы не подвергаются шифрованию.
В программе пользователь вводит фразу и число для сдвига, после чего надо вычислить новое закодированное сообщение.
Программа будет шифровать как строчные (a-z), так и прописные буквы (A-Z).
Для решения этой задачи вам понадобится знание двух новых функций. Первая функция ord.
Она преобразует символ в целочисленную позицию в таблице ASCII.
ord("a") # 97
Можно считать, что полученный результат 97 — это числовое представление символа a для компьютера.
Обратная функция chr возвращает строковый символ в таблице ASCII по позиции, переданной в качестве аргумента.
chr(118) # 'v'
Более подробный принцип шифрования.
Рассмотрим для примера, как зашифровать символ v. Чтобы получить позицию символа v относительно начального символа a,
необходимо выполнить выражение
pos = ord('v') - ord('a') # 21
Но, согласно алгоритму, нам необходимо учитывать смещение, которое может быть произвольным, например 33. И помнить,
что алфавит английского языка основан на латинском алфавите и состоит из 26 букв.
Поэтому конечная позиция символа v относительно символа a для шифровки с учетом этого — равна 2.
pos = ord('v') - ord('a') # 21
pos = (pos + 33) % 26 # 2
Остался последний шаг, получить новый символ:
pos = ord('v') - ord('a') # 21
pos = (pos + 33) % 26 # 2
new_char = chr(pos + ord("a")) # 'c'
Символ v со смещением 33 шифруется символом c.
Тесты проверяют и кодируют следующие строки:
"Hello my little friends!", offset = 37,
"Hello world!", offset = 7
Тестовое сообщение закодировано неверно - 'mpwwzyxjywteewpyqctpyodz'.
Должно быть: 'Hello my little friends!' -> 'Spwwz xj wteewp qctpyod!' offset=37
"""
message = input("Введите сообщение: ")
offset = int(input("Введите сдвиг: "))
encoded_message = ""
for ch in message:
if ord(ch) >=65 and ord(ch) <=90:# Capital letters
pos = ord(ch) - ord('A') # 21
pos = (pos + offset) % 26 # 2
new_char = chr(pos + ord("A")) # 'c'
print(ch, ord(ch),"+37", ord(new_char), new_char )
#print(new_char)
encoded_message = encoded_message + new_char
elif ord(ch) >=97 and ord(ch) <=122: #small letters
pos = ord(ch) - ord('a') # 21
pos = (pos + offset) % 26 # 2
new_char = chr(pos + ord("a")) # 'c'
print(ch, ord(ch),"+37", ord(new_char), new_char )
#print(new_char)
encoded_message = encoded_message + new_char
else:
encoded_message = encoded_message + ch
print(encoded_message)