Заменяя каждую букву ее порядковым номером в алфавите зашифруйте фразу: Практическое занятие — 3

Содержание

Практическое занятие — 3

Заменяя каждую букву ее порядковым номером в алфавите, зашифруйте фразу: «Я УМЕЮ КОДИРОВАТЬ ИНФОРМАЦИЮ».

Решение: Для того, чтобы легко закодировать фразу, заменяя каждую букву ее порядковым номером в алфавите необходимо составить таблицу соответствия «Буква — её порядковый номер»:

Буква

Буква

Буква

Буква

Буква

1

А

8

Ж

15

Н

22

Ф

29

Ы

2

Б

9

З

16

О

23

Х

30

Ь

3

В

10

И

17

П

24

Ц

31

Э

4

Г

11

Й

18

Р

25

Ч

32

Ю

5

Д

12

К

19

С

26

Ш

33

Я

6

Е

13

Л

20

Т

27

Щ

-

расстояние между буквами

7

Ё

14

М

21

У

28

Ъ

-

пробел

Теперь можно легко зашифровать фразу. Она будет выглядеть так: «33 21-14-6-32 12-16-5-10-18-16-3-1-20-30 10-15-22-16-18-14-1-24-10-32″

Дана кодировочная таблица (первая цифра кода — номер строки, вторая — номер столбца):

0 1 2 3 4 5 6 7 8
0 А Б В Г Д Е Ж З И
1 Й К Л М Н О П Р С
2 Т У Ф Х Ц Ч Ш Щ Ъ
3 Ы Ь Й Э Ю Я _ . ,
4 : ; - ! «

С помощью этой кодировочной таблицы зашифруйте фразу: ТЕЛЕГРАММА. Решение: 20 05 12 05 03 17 00 13 13 00

Практическое занятие — 3

Теория

Ответ: 1. топор, лейка 2. прорубь, 3. ёж. 7. Заменяя каждую букву ее порядковым номером в алфавите зашифруйте фразу: “Я УМЕЮ КОДИРОВАТЬ ИНФОРМАЦИЮ”.

Практическая работа по теме: “Кодирование информации”:
1. Дана кодовая таблица флажковой азбуки
[ Cкачайте файл, чтобы посмотреть картинку ]
Старший помощник Лом сдает экзамен капитану Врунгелю. Помогите ему прочитать следующий текст:
[ Cкачайте файл, чтобы посмотреть картинку ]
2. С помощью флажковой азбуки зашифруйте фразу “Учение да труд к славе ведут”.
3. С помощью флажковой азбуки зашифруйте любую пословицу, а сосед по парте пусть ее расшифрует.
4. Дана кодовая таблица азбуки Морзе
[ Cкачайте файл, чтобы посмотреть картинку ]
Расшифруйте (декодируйте), что здесь написано (буквы отделены друг от друга пробелами)?
[ Cкачайте файл, чтобы посмотреть картинку ]
5. Закодируйте с помощью азбуки Морзе слова ИНФОРМАТИКА, ДАННЫЕ, АЛГОРИТМ.
6. Зашифрованная пословица.
Разгадайте слова в предложениях (каждой букве соответствует определенная цифра).
Чтобы рубить дрова, нужен 14, 2, 3, 2, 7 , а чтобы полить огород – 10, 4, 5, 1, 6 .
Рыбаки сделали во льду 3, 7, 2, 7, 8, 9, 11 и стали ловить рыбу.
Самый колючий зверь в лесу – это 12, 13.
А теперь прочитай пословицу:
1, 2, 3, 4, 5, 1, 67, 8, 9, 10, 119, 4, 7, 4, 13, 12, 14.
Ответ: 1. топор, лейка 2. прорубь, 3. ёж. Пословица – копейка рубль бережёт.
7. Заменяя каждую букву ее порядковым номером в алфавите зашифруйте фразу: “Я УМЕЮ КОДИРОВАТЬ ИНФОРМАЦИЮ”.
Зашифрованный текст должен быть записан без пропусков.
[ Cкачайте файл, чтобы посмотреть картинку ],
8. Мальчик заменил каждую букву своего имени ее номером в алфавите. Получилось 46151. как зовут мальчика?
9. Дана кодировочная таблица (первая цифра кода – номер строки, вторая – номер столбца).
[ Cкачайте файл, чтобы посмотреть картинку ]
С помощью этой кодировочной таблицы зашифруйте фразу: Я УМЕЮ РАБОТАТЬ С ИНФОРМАЦИЕЙ! А ТЫ?
10. Используя кодировочную таблицу, расшифруйте текст: 25201538350304053835111503040038
11. “Шифры замены”.
Каждая буква алфавита может быть заменена любым числом из соответствующего столбика кодировочной таблицы.
[ Cкачайте файл, чтобы посмотреть картинку ]
Какие сообщения закодированы с помощью этой таблицы?
[ Cкачайте файл, чтобы посмотреть картинку ]
12. Рассмотрим “маленький монитор” с сеткой размером 10х10. Закодировать изображение (пусть “1” обозначает закрашенный квадрат, а “0” – не закрашенный).
[ Cкачайте файл, чтобы посмотреть картинку ]
13. Придумать свою кодировочную таблицу и зашифровать с её помощью свой домашний адрес.Закодировать изображение “маленького монитора” с сеткой размером 10х10 (пусть “1” обозначает закрашенный квадрат, а “0” – не закрашенный).
[ Cкачайте файл, чтобы посмотреть картинку ]

15

“Кодирование информации” — Документ

Практическая работа по теме: “Кодирование информации”:

1. Дана кодовая таблица флажковой азбуки

Старший помощник Лом сдает экзамен капитану Врунгелю. Помогите ему прочитать следующий текст:

2. С помощью флажковой азбуки зашифруйте фразу “Учение да труд к славе ведут”.

3. С помощью флажковой азбуки зашифруйте любую пословицу, а сосед по парте пусть ее расшифрует.

4. Дана кодовая таблица азбуки Морзе

Расшифруйте (декодируйте), что здесь написано (буквы отделены друг от друга пробелами)?

5. Закодируйте с помощью азбуки Морзе слова ИНФОРМАТИКА, ДАННЫЕ, АЛГОРИТМ.

6. Зашифрованная пословица.

Разгадайте слова в предложениях (каждой букве соответствует определенная цифра).

  1. Чтобы рубить дрова, нужен 14, 2, 3, 2, 7 , а чтобы полить огород – 10, 4, 5, 1, 6 .

  2. Рыбаки сделали во льду 3, 7, 2, 7, 8, 9, 11 и стали ловить рыбу.

  3. Самый колючий зверь в лесу – это 12, 13.

А теперь прочитай пословицу:

1, 2, 3, 4, 5, 1, 6
7, 8, 9, 10, 11
9, 4, 7, 4, 13, 12, 14.

Ответ: 1. топор, лейка 2. прорубь, 3. ёж. Пословица – копейка рубль бережёт.

7. Заменяя каждую букву ее порядковым номером в алфавите зашифруйте фразу: “Я УМЕЮ КОДИРОВАТЬ ИНФОРМАЦИЮ”. Зашифрованный текст должен быть записан без пропусков.

,

8. Мальчик заменил каждую букву своего имени ее номером в алфавите. Получилось 46151. как зовут мальчика?

9. Дана кодировочная таблица (первая цифра кода – номер строки, вторая – номер столбца).

С помощью этой кодировочной таблицы зашифруйте фразу: Я УМЕЮ РАБОТАТЬ С ИНФОРМАЦИЕЙ! А ТЫ?

10. Используя кодировочную таблицу, расшифруйте текст: 25201538350304053835111503040038

11. “Шифры замены”.

Каждая буква алфавита может быть заменена любым числом из соответствующего столбика кодировочной таблицы.

Какие сообщения закодированы с помощью этой таблицы?

12. Рассмотрим “маленький монитор” с сеткой размером 10х10. Закодировать изображение (пусть “1” обозначает закрашенный квадрат, а “0” – не закрашенный).

13. Придумать свою кодировочную таблицу и зашифровать с её помощью свой домашний адрес.
Закодировать изображение “маленького монитора” с сеткой размером 10х10 (пусть “1” обозначает закрашенный квадрат, а “0” – не закрашенный).

Кодирование информации (шифрование)

Кодирование информации (шифрование)

Автор: edu1

Методическая копилка — Информатика и ИКТ

Кодирование информации

 

1. Заменяя каждую букву ее порядковым номером в алфавите, зашифруйте фразу: «Я УМЕЮ КОДИРОВАТЬ ИНФОРМАЦИЮ«. Что необходимо предусмотреть, чтобы зашифрованный текст был записан без пропусков?

2. Дана кодировочная таблица (первая цифра кода — номер строки, вторая — номер столбца)

 

1

2

3

4

5

6

7

8

9

0

А

Б

В

Г

Д

Е

Ё

Ж

З

1

И

К

Л

М

Н

О

П

Р

С

2

Т

У

Ф

Х

Ц

Ч

Ш

Щ

Ъ

3

Ы

Ь

Э

Ю

Я

_

.

,

?

4

:

;

!

«

       
                   

С помощью этой кодировочной таблицы зашифруйте фразу: Я УМЕЮ РАБОТАТЬ С ИНФОРМАЦИЕЙ! А ТЫ?

3.  Используя кодировочную таблицу на рис. 3, расшифруйте текст:                          25201538350304053835111503040038

4. Придумайте свою кодировочную таблицу и зашифруйте с ее помощью свой домашний адрес.

5. «Шифры замены». Каждая буква алфавита может быть заменена любым числом из соответствующего столбика кодировочной таблицы.

А

Б

В

Г

Д

Е

Ж

З

И

К

Л

М

Н

О

П

Р

21

37

14

22

01

24

62

73

46

23

12

08

27

53

35

04

40

26

63

47

31

83

88

30

02

91

72

32

77

68

60

44

10

03

71

82

15

70

11

55

90

69

38

61

54

09

84

45

С

Т

У

Ф

Х

Ц

Ч

Ш

Щ

Ъ

Ы

Ь

Э

Ю

Я

20

13

59

25

75

43

19

29

06

65

74

48

36

28

16

52

39

07

49

33

85

58

80

50

34

17

56

78

64

41

89

67

93

76

18

51

87

66

81

92

42

79

86

05

57

Какие сообщения закодированы с помощью этой таблицы?

16

55

54

10

69

09

61

89

29

90

49

44

10

08

02

73

21

32

83

54

74

41

55

77

10

23

68

08

20

66

90

76

44

21

61

90

55

21

61

83

54

42

57

30

27

10

91

68

32

20

80

02

49

45

40

32

46

55

40

08

83

27

17

6. Используя кодировочную таблицу, приведенную на рис. 4, зашифруйте свое имя и фамилию.

7. «Шифр Цезаря». Этот шифр реализует следующее преобразование текста: каждая буква исходного текста заменяется третьей после нее буквой в алфавите, который считается написанным по кругу. Используя этот шифр, зашифруйте слова ИНФОРМАЦИЯ, КОМПЬЮТЕР, ЧЕЛОВЕК.

8. Расшифруйте слово НУЛТХСЁУГЧЛВ, закодированное с помощью шифра Цезаря.

9. «Шифр Виженера». Это шифр представляет шифр Цезаря с переменной величиной сдвига. Величину сдвига задают ключевым словом. Например, ключевое слово ВАЗА означает следующую последовательность сдвигов букв исходного текста: 31913191и т.д. Используя в качестве ключевого слово ВАГОН, закодируйте слова: АЛГОРИТМ, ПРАВИЛА, ИНФОРМАЦИЯ.

10. Слово НССРХПЛСГХСА получено с помощью шифра Виженера  ключевым словом ВАЗА. Восстановите исходное слово.

11. «Шифр перестановки». Кодирование осуществляется перестановкой букв в слове по одному и тому же общему правилу. Восстановите слова и определите правило перестановки: ЛБКО, ЕРАВШН, УМЫЗАК, АШНРРИ, РКДЕТИ.

12. Зашифруйте по правилу из задачи  11 слова ИНФОРМАЦИЯ, ПРАВИЛА, АЛГОРИТМ.

13. Придумайте свой шифр перестановки и с его помощью зашифруйте свое имя и фамилию.

14. Правило кодирования: после каждой гласной буквы вставляется буква А, а после согласной — Т. Расшифруйте слова: иантфтоартмтааттиактаа, птртиантттеарт.

Буква и ее номер в алфавите

В тестах iq  есть  не только числа, но и буквы. Буква заменяется на ее порядковый  номер в алфавите,  и он используется как число. Числа, в свою очередь, связываются определенными закономерностями.

Полученное в результате решения число может быть снова заменено  буквой.   Чтобы было удобнее использовать связь буквы и ее номера в алфавите, составим пары буква-число.

Заготовленный русский алфавит с номерами букв  поможет намного быстрее справиться с  заданием.

 

A-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.

 

Еще одна таблица — пары букв. Буквы в паре одинаково удалены от концов алфавита.

А — Я — 1                      З — Ч — 9                   П — П — 17

Б — Ю — 2                    И — Ц — 10

В — Э — 3                     Й — Х — 11

Г — Ь — 4                     К — Ф — 12

Д — Ы — 5                   Л — У — 13

Е — Ъ — 6                    М —  Т — 14

Ё — Щ — 7                   Н — С — 15

Ж — Ш — 8                 О — Р — 16

 

1) Найти букву и число:

3    8    13    ?

В   Ж    Л    ?

Показать решение

( Ответ:  18  Р.

В верхнем ряду каждое следующее число на 5 больше предыдущего, для нижнего ряда   это —  номер буквы в алфавите).

2)   Вставить пропущенные буквы:

Б    Ы   ?   Х   М

Ю   Д   ?   Й   Т

Показать решение

(Ответ: Ж  Ш.

Начиная от  Б  идем зигзагом, перескакивая через две буквы вперед. Аналогично от Ю — зигзаг на 2 буквы назад:

Буквы в паре в верхней и нижней строках,  к тому же, занимают равноотстоящие  позиции от концов алфавита).

3) Какие буквы пропущены?

В   Е    З      ?

Я   Ы   Ч     ?

Показать решение

(Ответ: К  У.

В верхней строке каждую следующую букву получаем, перескакивая две через буквы вперед, в нижней — через три буквы назад).

4) Найти, какую букву надо вставить:

А   Ж   Д   ?   З    О  Л

Показать решение

(Ответ: К.

От А  перепрыгиваем вперед через 6 букв, потом — через 2 назад, далее — аналогично).

5) Заменить знак вопроса буквой:

А    ?   З   О   Ч

Показать решение

  (Ответ: Г.

Номера  этих букв  являются квадратами первых пяти чисел).

6) Определить, какая буква пропущена:

В   Д   Ж   Л   Т   ?

Показать решение

(Ответ: Э.

К порядковому номеру буквы в алфавите последовательно прибавляем 2, 3, 5, 7,  11, которые являются первыми простыми числами. Простые числа — это числа, которые имеют только два делителя: единицу и себя. Поскольку простые числа изучают в начале 6 класса,  если ваш ребенок младше, предложите ему  связать буквы иначе. Например, увеличивайте  номер буквы в алфавите  последовательно на 1, 2, 4, 7, 11. Если начинать с буквы В, задание  выглядит так:

  В   Г   Е   И   П   ?   (Ъ)).

7) Какую букву надо поставить вместо знака вопроса?

  И    М    Е

  Р     Ф     ?

Показать решение

  (Ответ: М.

В каждой строке вторую букву получаем, перепрыгивая от первой через три вперед, а третью от первой —  через три назад).

Проанализируйте задания на номер буквы в алфавите вместе с ребенком. Обсудите, как еще могут быть связаны буква и ее номер. Затем дайте ребенку задание связать буквы и числа самостоятельно.

Кодирование информации

Кодирование информации
1.Дана кодовая таблица флажковой азбуки:

Старший помощник Лом сдает экзамен капитану Врунгелю. Помогите ему прочитать следующий текст:

2.С помощью флажковой азбуки зашифруйте фразу «Учение да труд к славе ведут».

3.С помощью флажковой азбуки запишите свое имя и фамилию.

4.Дана кодовая таблица азбуки Морзе


А • —

л • — • •

ц — • — •

Б — • • •

м —

ч — •

В • —

н — •

ш —-

Г — •

о —

Щ — • —

д — • •

п • —•

Ъ • — — •- •

Е •

р • — •

ы — • — —

Ж • • • —

с • • •

ь — • • —

3 — • •

т —

э • • — • •

И • •

У • • —

ю • • —

и • —

ф • • — •

я •- • —

к — • —

X • • • •

Расшифруйте (декодируйте), что здесь написано (буквы отделены друг от друга пробелами)?

— — •-•• — -•• -•-• -•—

5. Закодируйте с помощью азбуки Морзе слова: ИНФОРМАТИКА, ДАННЫЕ, АЛГОРИТМ.

6.Закодируйте с помощью азбуки Морзе свое имя и фамилию.

7.Мальчик заменил каждую букву своего имени ее номером в алфавите. Получилось 4 6 15 1. Как зовут мальчика?

8.Зашифрованная пословица.

Чтобы рубить дрова, нужен 14, 2, 3, 2,7 , а чтобы полить огород — 10, 4, 5, 1, 6 .

Рыбаки сделали во льду 3, 7, 2, 7, 8, 9, 11 и стали ловить рыбу.

Самый колючий зверь в лесу — это 12, 13.

А теперь прочитайте пословицу:

1, 2, 3, 4, 5, 1, 6 7, 8, 9, 10, 11 9, 4, 7, 4, 13, 12, 14 .

9.Заменяя каждую букву ее порядковым номером в алфавите, зашифруйте фразу: Я УМЕЮ КОДИРОВАТЬ ИНФОРМАЦИЮ. Что необходимо предусмотреть, чтобы зашифрованный текст был записан без пропусков?

10.Дана кодировочная таблица (первая цифра кода — номер строки, вторая — номер столбца)


0

1

2

3

4

5

6

7

8

0

А

Б

В

Г

Д

Е

Ё

Ж

3

1

И

Й

К

Л

М

Н

О

П

Р

2

С

Т

У

Ф

X

Ц

Ч

Ш

Щ

3

Ъ

Ы

Ь

Э

Ю

Я

_

.

,

4

?

:

;



!

»

С помощью этой кодировочной таблицы зашифруйте фразу Я УМЕЮ РАБОТАТЬ С ИНФОРМАЦИЕЙ! А ТЫ?

11.Используя кодировочную таблицу, расшифруйте текст:

26211640360304054036121603040040.

12.Придумайте свою кодировочную таблицу и зашифруйте с ее помощью свой домашний адрес.

13.Шифр Цезаря. Этот шифр реализует следующее преобразование текста: каждая буква исходного текста заменяется идущей после нее с некоторым сдвигом буквой в алфавите, который считается написанным по кругу. Пусть этот сдвиг равен 3. Используя этот шифр, зашифруйте слова: ИНФОРМАЦИЯ, КОМПЬЮТЕР, ЧЕЛОВЕК.

14.Расшифруйте слово НУЛТХСЁУГЧЛВ, закодированное с помощью шифра Цезаря.

15. Шифр Виженера. Этот шифр представляет собой шифр Цезаря с переменной величиной сдвига. Величину сдвига задают ключевым словом. Например, ключевое слово ВАЗА означает следующую последовательность сдвигов букв исходного текста: 31913191ит. д. Используя в качестве ключевого слово ВАГОН, закодируйте слова: АЛГОРИТМ, ПРАВИЛА, ИНФОРМАЦИЯ.

16.Слово НССРХПЛСГХСА получено с помощью шифра Виженера с ключевым словом ВАЗА. Восстановите исходное слово.

17.Шифр перестановки. Кодирование осуществляется перестановкой букв в слове по одному и тому же общему правилу. Восстановите слова и определите правило перестановки: ЛБКО, БРАВШИ, УМЫЗАК, АШНРРИ, РКДЕТИ.

18.Зашифруйте по правилу из задачи 17 слова: ИНФОРМАЦИЯ, ПРАВИЛА, АЛГОРИТМ.

19.Придумайте свой шифр перестановки и с его помощью зашифруйте свое имя и фамилию.

20.Какому или каким из перечисленных ниже слов соответствует код Х0:$=+0=? Слова: ОРНАМЕНТ, ДОМИНИОН, РИФЛЕНИЕ, СТРОЕНИЕ, СМЕКАЛКА.

21.Задано правило кодирования: после каждой гласной буквы вставляется буква А, а после согласной — Т. Расшифруйте слова: ИАНТФТОАРТМТААТТИАКТАА, ПТРТИАНТТТЕАРТ.

22.Угадайте правило шифровки и расшифруйте слова: ТКАФЕТРА, ТКНИТСНИ, ТИЦАРТНА, ЛАНИГИРО.

23.Пользуясь правилом из задачи 22, зашифруйте фразу ИНФОРМАТИКА — ЭТО НАУКА О СПОСОБАХ ПОЛУЧЕНИЯ, НАКОПЛЕНИЯ, ОБРАБОТКИ, ПЕРЕДАЧИ И ПРЕДСТАВЛЕНИЯ ИНФОРМАЦИИ.

24.Определите правило шифровки и расшифруйте слова: АКРОЛДИИТРБОФВНАЗНГИЦЕШ, ЩИКНГФЗОЕРУМЦ АЫЦГИХИ

25.Для точности передачи сообщений и ликвидации «шумов» в сообщениях используется принцип двукратной последовательной передачи каждого символа. В результате сбоя при передаче информации приемником принята символьная последовательность: ПРРРАОССПТОО. Какое осмысленное сообщение передавалось?

Аналитические методы шифрования — МегаЛекции

Зашифровать слово ЖУК

Ключ – матрица

А=

Выполнить проверку (расшифровать слово)


Контрольная работа «КОДИРОВАНИЕ И ШИФРОВАНИЕ ИНФОРМАЦИИ»

Вариант 7

Кодирование информации

1. Дана кодовая таблица азбуки Морзе

Расшифруйте (декодируйте), что здесь написано (буквы отделены друг от друга пробелами)?

2. Закодируйте с помощью азбуки Морзе слова ПАРОЛЬ, ЭКРАНИРОВАНИЕ, КОДИРОВАНИЕ

3.
Дана таблица ASCII-кодов

Расшифровать слово при помощи таблицы ASCII rкодов:

49 20 6С 6FF 75

4. Зашифрованная пословица.

Разгадайте слова в предложениях (каждой букве соответствует определенная цифра).

19. Чтобы рубить дрова, нужен 14, 2, 3, 2, 7 , а чтобы полить огород – 10, 4, 5, 1, 6 .

20. Рыбаки сделали во льду 3, 7, 2, 7, 8, 9, 11 и стали ловить рыбу.

21. Самый колючий зверь в лесу – это 12, 13.

А теперь прочитайте пословицу:

1, 2, 3, 4, 5, 1, 6
7, 8, 9, 10, 11
9, 4, 7, 4, 13, 12, 14.

5. Заменяя каждую букву ее порядковым номером в алфавите, зашифруйте фразу: “Я ЗНАЮ МЕТОДЫ ШИФРОВАНИЯ ”. Зашифрованный текст должен быть записан без пропусков.

,

6. Дана кодировочная таблица (первая цифра кода – номер строки, вторая – номер столбца).

С помощью этой кодировочной таблицы зашифруйте фразу: Я ЗНАЮ МЕТОДЫ ШИФРОВАНИЯ

Используя эту же кодировочную таблицу, расшифруйте текст:

Шифры замены.

7. Каждая буква алфавита может быть заменена любым числом из соответствующего столбика кодировочной таблицы.

Какие сообщения закодированы с помощью этой таблицы?

При помощи таблицы Вижинера зашифровать текст «Профилактика заражения вирусами». Ключ «ВИРУС» Шифры перестановки

k) Закодировать методом Гамильтона (создать свой маршрут(ы)).

Скремблирование

l) Закодировать методом Гамильтона (создать свой маршрут(ы)).

Туннелирование

Аналитические методы шифрования

Зашифровать словоМАК

Ключ – матрица

А=

Выполнить проверку (расшифровать слово)

Контрольная работа «КОДИРОВАНИЕ И ШИФРОВАНИЕ ИНФОРМАЦИИ»



Вариант 8

Кодирование информации

1. Дана кодовая таблица азбуки Морзе

Расшифруйте (декодируйте), что здесь написано (буквы отделены друг от друга пробелами)?

2. Закодируйте с помощью азбуки Морзе слова АУТЕНТИФИКАЦИЯ, ПАРОЛЬ, КОДИРОВАНИЕ

3.
Дана таблица ASCII-кодов

Закодировать при помощи таблицы ASCII кодов следующий текст PASCAL.Результат представить в шестнадцатеричной СС

4. Зашифрованная пословица.

Разгадайте слова в предложениях (каждой букве соответствует определенная цифра).

22. Чтобы рубить дрова, нужен 14, 2, 3, 2, 7 , а чтобы полить огород – 10, 4, 5, 1, 6 .

23. Рыбаки сделали во льду 3, 7, 2, 7, 8, 9, 11 и стали ловить рыбу.

24. Самый колючий зверь в лесу – это 12, 13.

А теперь прочитайте пословицу:

1, 2, 3, 4, 5, 1, 6
7, 8, 9, 10, 11
9, 4, 7, 4, 13, 12, 14.

5. Заменяя каждую букву ее порядковым номером в алфавите, зашифруйте фразу: “Я ЗНАЮ МЕТОДЫ КОДИРОВАНИЯ ”. Зашифрованный текст должен быть записан без пропусков.

,

6. Дана кодировочная таблица (первая цифра кода – номер строки, вторая – номер столбца).

С помощью этой кодировочной таблицы зашифруйте фразу: Я ЗНАЮ МЕТОДЫ КОДИРОВАНИЯ

Используя эту же кодировочную таблицу, расшифруйте текст:

Шифры замены.

7. Каждая буква алфавита может быть заменена любым числом из соответствующего столбика кодировочной таблицы.

Какие сообщения закодированы с помощью этой таблицы?

При помощи таблицы Вижинера зашифровать текст «Профилактика заражения вирусами». Ключ «ВИРУС» Шифры перестановки

m) Закодировать методом Гамильтона (создать свой маршрут(ы)).

Генератор паролей

n) Закодировать методом Гамильтона (создать свой маршрут(ы)).

Вирусное заражение

Аналитические методы шифрования

Зашифровать слово СОК

Ключ – матрица

А=

Выполнить проверку (расшифровать слово)


Контрольная работа «КОДИРОВАНИЕ И ШИФРОВАНИЕ ИНФОРМАЦИИ»

Вариант 9

Кодирование информации

1. Дана кодовая таблица азбуки Морзе

Расшифруйте (декодируйте), что здесь написано (буквы отделены друг от друга пробелами)?

2. Закодируйте с помощью азбуки Морзе слова ДАКТЕЛОСКОПИЯ, ПАРОЛЬ, СТЕНОГРАФИЯ

3.
Дана таблица ASCII-кодов

Расшифровать слово при помощи таблицы ASCII rкодов:

32 2А 78 2В 79 3D 30

4. Зашифрованная пословица.

Разгадайте слова в предложениях (каждой букве соответствует определенная цифра).

25. Чтобы рубить дрова, нужен 14, 2, 3, 2, 7 , а чтобы полить огород – 10, 4, 5, 1, 6 .

26. Рыбаки сделали во льду 3, 7, 2, 7, 8, 9, 11 и стали ловить рыбу.

27. Самый колючий зверь в лесу – это 12, 13.

А теперь прочитайте пословицу:

1, 2, 3, 4, 5, 1, 6
7, 8, 9, 10, 11
9, 4, 7, 4, 13, 12, 14.

5. Заменяя каждую букву ее порядковым номером в алфавите, зашифруйте фразу: “Я ЗНАЮ МЕТОДЫ КОДИРОВАНИЯ ”. Зашифрованный текст должен быть записан без пропусков.

,

6. Дана кодировочная таблица (первая цифра кода – номер строки, вторая – номер столбца).

С помощью этой кодировочной таблицы зашифруйте фразу: Я ЗНАЮ МЕТОДЫ КОДИРОВАНИЯ

Используя эту же кодировочную таблицу, расшифруйте текст:

Шифры замены.

7. Каждая буква алфавита может быть заменена любым числом из соответствующего столбика кодировочной таблицы.

Какие сообщения закодированы с помощью этой таблицы?

При помощи таблицы Вижинера зашифровать текст «Биометрические характеристики». Ключ «ВИРУС» Шифры перестановки

o) Закодировать методом Гамильтона (создать свой маршрут(ы)).

Атака на шифр

p) Закодировать методом Гамильтона (создать свой маршрут(ы)).

Защита информации


Рекомендуемые страницы:


Воспользуйтесь поиском по сайту:

Глава 14

Темы, рассматриваемые в этой главе:

· Криптография и шифры

· Шифрование и дешифрование

· Шифрованный текст, открытый текст, ключи и символы

· Шифр Цезаря

· Порядковые значения ASCII

· Chr () и ord () функции

· Isalpha () строковый метод

· Isupper () и ниже () строковые методы

· Криптоанализ

· Техника грубой силы

Программа в этой главе на самом деле не игра, но увлекательная программа.Программа преобразует нормальный английский в секретный код. Может также снова конвертируйте секретные коды обратно в обычный английский. Только тот, кто знающие секретные коды смогут понять наш секрет Сообщения.

Поскольку эта программа манипулирует текстом, чтобы преобразовать его в секретный сообщения, вы узнаете несколько новых функций и методов для управления струны. Вы также узнаете, как программы могут выполнять математические вычисления с текстовыми строками так же, как это может с числами.

Наука о написании секретных кодов называется криптографией. На протяжении тысячелетий криптография делали секретные сообщения, которые могли прочитать только отправитель и получатель, даже если кто-то захватил посланника и прочитал закодированное сообщение. Система секретного кода называется шифром. Шифр, используемый Программа в этой главе называется шифром Цезаря.

В криптографии мы называем сообщение, которое хотим сохранить в секрете открытый текст. Открытый текст может выглядеть как это:

Привет! Ключи к домик спрятан под цветочным горшком.

Преобразование открытого текста в закодированное сообщение называется шифрованием открытого текста. Открытый текст зашифрован в зашифрованный текст. Зашифрованный текст выглядит как случайные буквы, и мы не можем понять, что исходный открытый текст был просто глядя на зашифрованный текст. Вот предыдущий пример, зашифрованный в зашифрованный текст:

Yvccf киев! Kyv bvpj kf kyv yfljv riv yzuuve leuvi kyv wcfnvi gfk.

Но если вы знаете, какой шифр используется для шифрования сообщения, вы может расшифровать зашифрованный текст обратно в открытый текст.(Расшифровка противоположна шифрованию.)

Многие шифры также используют ключи. Ключи являются секретными значениями, которые позволяют расшифровать зашифрованный текст, который был зашифрован с помощью конкретный шифр. Думайте о шифре как о дверном замке. Ты можешь только разблокировать его с помощью определенного ключа.

Если вы заинтересованы в написании программ криптографии, вы можете прочтите мою другую книгу «Взлом секретных шифров с помощью Python». Это бесплатно скачать с сайта http: // invithpython.com / hacking .

Ключом для шифра Цезаря будет число от 1 до 26. Если вы не знаете ключ (то есть не знаете номер, использованный для шифрования сообщения), вы не сможете расшифровать секретный код.

Шифр ​​Цезаря был одним из самые ранние из когда-либо изобретенных шифров. В этом шифре вы шифруете сообщение, беря каждая буква в сообщении (в криптографии эти буквы называются символами, потому что они могут быть буквами, цифрами или любыми другими другой знак) и заменив его «сдвинутой» буквой.Если сдвинуть букву А на один пробел вы получите букву B. Если сдвинуть букву A на два пробела, вы получите букву C. Рисунок 14-1 представляет собой изображение некоторых букв, сдвинутых на три пробела.

Рис. 14-1: Перемещение букв на три пробела. Здесь B становится E.

Чтобы получить каждую сдвинутую букву, нарисуйте ряд ящиков с каждой буквой. буква алфавита. Затем нарисуйте под ним второй ряд прямоугольников, но начните определенное количество (это число является ключом) пробелов над.После писем в конец, заверните обратно в начало коробок. Вот пример с буквы смещены на три пробела:

Рис. 14-2: Весь алфавит сдвинут на три пробела.

Количество сдвигаемых пробелов — это ключ в шифре Цезаря. В приведенном выше примере показаны переводы букв для клавиши 3.

Если вы зашифруете открытый текст «Привет» с ключом 3, то:

· «H» становится «K».

· Буква «o» становится «r».

· Буква «w» превращается в «z».

· Буква «д» становится «г».

· Буква «y» становится «b».

Шифрованный текст «Hello» с ключом 3 становится «Krzgb».

Мы сохраним все небуквенные символы. Расшифровать «Krzgb» клавишей 3, идем от нижних ящиков к верхним:

· Буква «К» превращается в «Н».

· Буква «р» становится «о».

· Буква «z» становится «w».

· Буква «g» превращается в «d».

· Буква «b» становится «y».

Как мы реализуем это смещение букв в виде кода? Мы можем сделайте это, представив каждую букву в виде числа, называемого порядковым номером, а затем добавив или вычтя из этого числа число, чтобы образовать новый порядковый номер (и новую букву). ASCII (произносится как «спроси-е» и означает Американский стандартный код обмена информацией) — это код, который связывает каждый символ с числом от 32 до 126.

Заглавные буквы от «A» до «Z» имеют номера ASCII 65. — 90. Строчные буквы от «a» до «z» имеют номера ASCII 97. — 122. Цифровые цифры от «0» до «9» имеют номера ASCII 48 — 57. В таблице 14-1 показаны все символы и порядковые номера ASCII.

Современные компьютеры используют UTF-8 вместо ASCII. Но UTF-8 — это обратно совместим с ASCII, поэтому порядковые номера UTF-8 для символов ASCII то же, что и порядковые номера ASCII.

Таблица 14-1: Таблица ASCII

32

(космос)

48

0

64

@

80

96

`

112

п.

33

!

49

1

65

А

81

квартал

97

а

113

q

34

«

50

2

66

В

82

R

98

б

114

г

35

#

51

3

67

С

83

S

99

с

115

с

36

$

52

4

68

D

84

т

100

д

116

т

37

%

53

5

69

E

85

U

101

e

117

u

38

и

54

6

70

Ф

86

В

102

f

118

v

39

55

7

71

г

87

Вт

103

г

119

Вт

40

(

56

8

72

H

88

Х

104

ч

120

х

41

)

57

9

73

я

89

Я

105

и

121

л

42

*

58

:

74

Дж

90

Z

106

дж

122

z

43

+

59

;

75

К

91

[

107

к

123

{

44

,

60

<

76

л

92

\

108

л

124

|

45

61

=

77

м

93

]

109

кв.м

125

}

46

.

110

п

126

~

47

/

63

?

79

О

95

_

111

или

Итак, если вы хотите переместить букву «A» на три пробела, вы должны сделать следующее:

· Преобразуйте «A» в порядковый номер (65).

· Складываем 3 к 65, получаем 68.

· Преобразуйте порядковый номер 68 обратно в букву («D»).

Функции chr () и ord () могут преобразовывать символы и ординалы.

Функции chr () и ord ()

Функция chr () (произносится как «символ», сокращенно от «символ») принимает целочисленный порядковый номер и возвращает односимвольную строку. Ord () функция (сокращение от «порядковый») принимает односимвольную строку и возвращает целочисленный порядковый номер.Попробуйте ввести в интерактивную оболочку следующее:

>>> chr (65)

‘A’

>>> ord (‘A’)

65

>>> chr (65 + 8)

«I»

>>> chr (52)

‘4’

>>> chr (ord (‘F’))

‘F’

>>> ord (chr (68))

68

В третьей строке chr (65 + 8) оценивается как chr (73). Если вы посмотрите на таблицу ASCII, вы увидите, что 73 — порядковый номер для заглавная буква «I».

В пятой строке chr (ord (‘F’)) оценивается как chr (70) который оценивается как «F». Функции ord () и chr () являются напротив друг друга.

Вот пример запуска программы Caesar Cipher, шифрующей сообщение:

Вы хотите зашифровать или расшифровать сообщение?

зашифровать

Введите ваше сообщение:

Небо над порт был цвета телевизора, настроенного на мертвый канал.

Введите ключевой номер (1-26)

13

Ваш переведенный текст:

Гур fxl nobir gur cbeg jnf gur pbybe bs gryrivfvba, gharq gb n qrnq punaary.

Теперь запустите программу и расшифруйте только что зашифрованный текст.

Вы хотите зашифровать или расшифровать сообщение?

расшифровать

Введите ваше сообщение:

Гур FXL Нобир Гур cbeg jnf gur pbybe bs gryrivfvba, gharq gb n qrnq punaary.

Введите ключевой номер (1-26)

13

Ваш переведенный текст:

Небо над портом был цвета телевизора, настроенного на мертвый канал.

Если вы не расшифруете правильным ключом, расшифрованный текст будет мусор data:

Вы хотите зашифровать или расшифровать сообщение?

расшифровать

Введите ваше сообщение:

Гур FXL Нобир Гур cbeg jnf gur pbybe bs gryrivfvba, gharq gb n qrnq punaary.

Введите ключевой номер (1-26)

15

Ваш переведенный текст:

RFC QIW YZMTC RFC NMPR UYQ RFC AMJMP MD Rcjctgqgml, rslcb rm y bcyb afyllcj.

Вот исходный код программы Caesar Cipher. После вас введите этот код, сохраните файл как cipher.py . Если после введя этот код, сравните набранный вами код с кодом книги с онлайн-инструмент сравнения на http://invpy.com/diff/cipher .

caesar.py

1.

2.

3. MAX_KEY_SIZE = 26

4.

5. деф getMode ():

6. пока Верно:

7. print (‘Вы хотите зашифровать или расшифровать сообщение?’)

8. режим = вход (). нижний ()

9. если режим в ‘encrypt e decrypt d’.split ():

10. режим возврата

11. еще:

12. print (‘Введите либо «зашифровать», либо «е», либо «расшифровать» или «d». ‘)

13.

14. def getMessage ():

15. print (‘Введите свое сообщение:’)

16. возврат вход ()

17.

18. def getKey ():

19. ключ = 0

20. а Верно:

21. print (‘Введите номер ключа (1-% s)’% (MAX_KEY_SIZE))

22. ключ = int (вход ())

23. если (ключ> = 1 и ключ <= MAX_KEY_SIZE):

24. ключ возврата

25.

26. def getTranslatedMessage (режим, сообщение, ключ):

27. если mode [0] == ‘d’:

28. ключ = -ключ

29. переведено = »

30.

31. для символ в сообщении:

32. если symbol.isalpha ():

33. число = ord (символ)

34. число + = ключ

35.

36. если symbol.isupper ():

37. если число> ord (‘Z’):

38. число — = 26

39. elif число

40. число + = 26

41. elif symbol.islower ():

42. если число> ord (‘z’):

43. число — = 26

44. elif число

45. число + = 26

46.

47. переведено + = chr (число)

48. еще:

49. переведено + = символ

50. возврат переведен

51.

52. режим = getMode ()

53. сообщение = getMessage ()

54. ключ = getKey ()

55.

56.print (‘Ваш переведенный текст:’)

57. print (getTranslatedMessage (режим, сообщение, ключ))

Процессы шифрования и дешифрования противоположны другое, и даже тогда они по-прежнему используют один и тот же код. Давайте посмотрим, как каждая линия работает.

1.
2.

3. MAX_KEY_SIZE = 26

Первая строка — это просто комментарий. MAX_KEY_SIZE — это константа, в которой хранится целое число 26. MAX_KEY_SIZE напоминает нам что в этой программе ключ, используемый в шифре, должен быть от 1 до 26.

Решение зашифровать или расшифровать

5. def getMode ():

6. Пока True:

7. print (‘Вы хотите зашифровать или расшифровать сообщение? ‘)

8. режим = вход (). Нижний ()

9. если режим в ‘зашифровать и расшифровать d’.split ():

10. Режим возврата

11. еще:

12. print (‘Введите либо «зашифровать», или «е», или «расшифровать», или «d». ‘)

Функция getMode () позволит пользователю ввести, если он хочет режим шифрования или дешифрования для программы.Значение, возвращаемое функцией input () и ниже () хранится в режиме. Если условие оператора проверяет, существует ли в списке строка, хранящаяся в режиме возвращается с помощью ‘encrypt е расшифровать d’.split ().

Это список [‘encrypt’, ‘e’, ​​’decrypt’, ‘d’], но это программисту проще набрать ‘encrypt e decrypt d’.split (), а не введите все эти кавычки и запятые. Используйте то, что вам удобнее; Oни оба оценивают одно и то же значение списка.

Эта функция вернет первый символ в режиме пока режим равно ‘encrypt’, ‘е’, ‘расшифровать’, или ‘d’.Следовательно, getMode () вернет строку ‘e’ или строку ‘d’ (но пользователь может введите «e», «encrypt», «d» или «decrypt».)

Получение сообщения от игрока

14. def getMessage ():

15. print (‘Введите свое сообщение:’)

16. возврат вход ()

Функция getMessage () просто получает сообщение для шифрования или расшифровать от пользователя и вернуть.

Получение ключа от игрока

18.def getKey ():

19. ключ = 0

20. в то время как Истина:

21. print (‘Введите номер ключа (1-% s)’% (MAX_KEY_SIZE))

22. ключ = int (input ())

23. if (ключ> = 1 и ключ <= MAX_KEY_SIZE):

24. Ключ возврата

Функция getKey () позволяет игроку ввести ключ, который он будет используйте для шифрования или дешифрования сообщения. Цикл while гарантирует, что функция продолжает цикл до тех пор, пока пользователь не введет действительный ключ.

Действительный ключ здесь — это тот, который находится между целыми значениями 1 и 26 (помните, что MAX_KEY_SIZE всегда будет иметь значение 26 потому что он постоянный). Затем он возвращает этот ключ. Строка 22 устанавливает ключ к целочисленной версии того, что ввел пользователь, поэтому getKey () возвращает целое число.

Зашифровать или расшифровать сообщение заданным ключом

26. def getTranslatedMessage (режим, сообщение, ключ):

27. если mode [0] == ‘d’:

28. ключ = -ключ

29. переведено = »

getTranslatedMessage () выполняет шифрование и дешифрование. Имеет три параметра:

· mode устанавливает функцию в режим шифрования или дешифрования режим.

· сообщение — это открытый текст (или зашифрованный текст), который нужно зашифровать (или в расшифрованном виде).

· key — это ключ, который используется в этом шифре.

Строка 27 проверяет, является ли первая буква в переменной режима строка ‘d’.Если да, то программа находится в режиме расшифровки. Единственная разница между режим дешифрования и шифрования заключается в том, что в режиме дешифрования ключ устанавливается на отрицательная версия самой себя. Если ключ был целым числом 22, то при расшифровке режим установите его на -22. Причина будет объяснена позже.

— это строка результата: либо зашифрованный текст (если вы шифруете) или открытый текст (если вы расшифровываете). Это начинается как пустая строка и содержит зашифрованные или расшифрованные символы присоединены к его концу.

Строковый метод isalpha ()

Строковый метод isalpha () вернет True, если строка является прописные или строчные буквы от A до Z. Если строка содержит какие-либо небуквенные символы, тогда isalpha () вернет False. Попробуйте ввести в интерактивную оболочку:

>>> ‘Привет’. Isalpha ()

Правда

>>> ‘Сорок два’. Isalpha ()

Ложь

>>> ‘Сорок два’.isalpha ()

Правда

>>> ’42’.isalpha ()

Ложь

>>> » .isalpha ()

Ложь

Как видите, ‘Forty two’. Isalpha () вернет False. потому что сорок two ‘имеет пробел, который не является буквенным символом. ‘Fortytwo’.isalpha () возвращает True потому что там нет этого места.

’42’.isalpha () возвращает False, потому что оба’ 4 ‘ и «2» небуквенные символы.isalpha () возвращает True, только если строка имеет только буквенные символы и не является пустым.

Метод isalpha () используется в следующих нескольких строках программа.

31. для символ в сообщении:

32. если symbol.isalpha ():

33. число = ord (символ)

34. число + = ключ

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

Строка 32 там, потому что будут зашифрованы только буквы или расшифровано. Цифры, знаки препинания и все остальное останется в своих оригинальный вид. Переменная num будет содержать целочисленное порядковое значение письмо хранится в символе. Строка 34 затем «сдвигает» значение в num по значению в ключе.

Строковые методы isupper () и islower ()

Строковые методы isupper () и islower () (которые включены строки 36 и 41) работают аналогично isdigit () и isalpha () методы.

isupper () вернет True, если строка вызываемый содержит как минимум одну заглавную букву и ни одной строчной буквы. islower () возвращает True если вызываемая строка содержит хотя бы одну строчную букву и нет заглавные буквы. В противном случае эти методы возвращают False.

Попробуйте ввести в интерактивную оболочку следующее:

>>> ‘HELLO’. Закуска ()

Правда

>>> ‘привет’ .isupper ()

Ложь

>>> ‘Привет’.islower ()

Правда

>>> ‘Hello’. Islower ()

Ложь

>>> «ВЫГЛЯДИТЕ ЗА СЕБЯ!». Isupper ()

Правда

>>> ’42’. Верхняя часть ()

Ложь

>>> ’42’. Ниже ()

Ложь

>>> » .isupper ()

Ложь

>>> ‘.islower ()

Ложь

Шифрование или дешифрование каждого письма

36.» — 94).это вообще не письмо. Вы хотите зашифрованный текст для «перехода» к началу алфавита.

Проверить, имеет ли num значение больше порядкового номера для «Z». Если это так, то из вычтем 26 (потому что есть 26 всего букв) от кол. После этого значение num 68. 68 — правильный порядковый номер для «D».

41. elif symbol.islower ():

42. если число> ord (‘z’):

43. число — = 26

44. elif число

45. число + = 26

Если символ — строчная буква, программа запускает код, который аналогичен строкам с 36 по 40. Единственное отличие состоит в том, что в нем используется ord (‘z’) и ord (‘а’) вместо ord (‘Z’) и ord (‘A’).

В режиме дешифрования ключ будет отрицательным. В особом случае число — = 26 меньше значения ASCII. для».В этом случае прибавьте 26 к числу чтобы он «обернулся» до конца алфавита.

47. переведено + = chr (число)

48. еще:

49. переведено + = символ

Строка 47 объединяет зашифрованный / дешифрованный символ с переведенным нить.

Если символ не был прописной или строчной буквой, то строка 48 объединяет исходный символ с переведенной строкой.Таким образом, пробелы, числа, знаки препинания и другие символы не будут зашифрованные или расшифрованные.

50. возврат переведено

Последняя строка в getTranslatedMessage () функция возвращает переведенную строку.

Начало программы

52. режим = getMode ()

53. сообщение = getMessage ()

54. ключ = getKey ()

55. print (‘Ваш переведенный текст:’)

56.print (getTranslatedMessage (режим, сообщение, ключ))

Запуск программы вызывает каждую из трех функций определено ранее, чтобы получить режим, сообщение и ключ от пользователя. Эти три значения передаются в getTranslatedMessage (), возвращаемое значение (переведенное строка) печатается пользователю.

Это весь Цезарь Шифр. Однако, хотя этот шифр может обмануть некоторых людей, которые не понимают криптографию, она не сохранит сообщение секрет от того, кто разбирается в криптоанализе.Хотя криптография — это наука создания кодов, криптоанализ — это наука о коды взлома.

Вы хотите зашифровать или расшифровать сообщение?

зашифровать

Введите ваше сообщение:

Сомнений быть не может приятно, но уверенность абсурдна.

Введите ключевой номер (1-26)

8

Ваш переведенный текст:

Lwcjba uig vwb jm xtmiaivb, jcb kmzbiqvbg qa ijaczl.

Весь смысл криптографии в том, что если кто-то их руки держат зашифрованное сообщение, они не могут понять оригинал незашифрованное сообщение от него.Представим, что мы взломщики кода и все, что мы есть зашифрованный текст:

Lwcjba uig vwb jm xtmiaivb, jcb kmzbiqvbg qa ijaczl.

Грубая сила — это техника пробовать все возможные ключи, пока не найдете правильный. Потому что есть всего 26 возможных ключей, криптоаналитику будет несложно написать взлом программа, чем расшифровывает всеми возможными ключами. Тогда они могли искать ключ который расшифровывает простой английский. Давайте добавим в программу функцию перебора.

Добавление режима грубой силы

Сначала измените строки 7, 9 и 12 (которые находятся в getMode () функция) в следующем виде (изменения выделены жирным шрифтом):

5. деф getMode ():

6. пока Верно:

7. print (‘Вы хотите зашифровать или расшифровать или брутфорс сообщение? ‘)

8. режим = вход (). нижний ()

9. если режим в ‘encrypt e decrypt d brute b ‘.split ():

10. возврат режим [0]

11. еще:

12. print (‘Введите либо «зашифровать», либо «е», либо «расшифровать» или «d» или «brute» или «b» . ‘)

Этот код позволяет пользователю выбрать режим «грубой силы». Доработать и добавить следующие изменения в основную часть программы:

52. режим = getMode ()

53. сообщение = getMessage ()

54. если режим [0]! = ‘B’:

55.ключ = getKey ()

56.

57. print (‘Ваш переведенный текст:’)

58. если режим [0]! = ‘B’:

59. print (getTranslatedMessage (режим, сообщение, ключ))

60. остальное:

61. для ключа в диапазоне (1, MAX_KEY_SIZE + 1):

62. print (ключ, getTranslatedMessage (‘расшифровать’, сообщение, ключ))

Эти изменения запрашивают у пользователя ключ, если они не в «грубом принудительный »режим.Выполняется исходный вызов getTranslatedMessage () и переведенная строка печатается.

Однако, если пользователь находится в режиме «грубой силы», тогда getTranslatedMessage () цикл, который выполняет итерацию от 1 до MAX_KEY_SIZE (то есть 26). Помните, что когда функция range () возвращает список целых чисел вверх ко второму параметру, но не включая его, поэтому у вас + 1. Эта программа распечатает все возможные переводы сообщения (включая ключевой номер, использованный в переводе).Вот пример этого модифицированного программа:

Вы хотите зашифровать, расшифровать или перебрать сообщение?

грубый

Введите ваше сообщение:

Lwcjba uig vwb jm xtmiaivb, jcb kmzbiqvbg qa ijaczl.

Ваш переведенный текст:

1 Kvbiaz thf uva il wslhzhua, iba jlyahpuaf pz хизбык.

2 Juahzy sge tuz hk vrkgygtz, haz ikxzgotze oy ghyaxj.

3 Itzgyx RFD Sty gj uqjfxfsy, gzy hjwyfnsyd nx fgxzwi.

4 Hsyfxw qec rsx fi tpiewerx, fyx givxemrxc mw efwyvh.

5 Grxewv pdb qrw eh sohdvdqw, exw fhuwdlqwb lv devxug.

6 Fqwdvu oca pqv dg rngcucpv, dwv egtvckpva ku cduwtf.

7 Epvcut nbz opu cf qmfbtbou, cvu dfsubjouz jt bctvse.

8 Сомнения могут и неприятны, но определенность абсурдна.

9 Cntasr lzx mns ad okdzrzms, ats bdqszhmsx hr zartqc.

10 Bmszrq kyw lmr zc njcyqylr, zsr acpryglrw gq yzqspb.

11 Alryqp jxv klq yb mibxpxkq, yrq zboqxfkqv fp xyproa.

12 Zkqxpo iwu jkp xa lhawowjp, xqp yanpwejpu eo wxoqnz.

13 Yjpwon hvt ijo wz kgzvnvio, wpo xzmovdiot dn vwnpmy.

14 Xiovnm gus hin vy jfyumuhn, von wylnuchns cm увмолкс.

15 Whnuml ftr ghm ux iextltgm, unm vxkmtbgmr bl Tulnkw.

16 Vgmtlk esq fgl tw hdwsksfl, tml uwjlsaflq ak stkmjv.

17 Uflskj drp efk sv gcvrjrek, slk tvikrzekp zj rsjliu.

18 Tekrji cqo dej ru fbuqiqdj, rkj suhjqydjo yi qrikht.

19 Sdjqih bpn cdi qt eatphpci, qji rtgipxcin xh pqhjgs.

20 Rciphg aom bch ps dzsogobh, pih qsfhowbhm wg opgifr.

21 Qbhogf znl abg или cyrnfnag, ohg Pregnvagl vf nofheq.

22 Pagnfe ymk zaf nq bxqmemzf, ngf oqdfmuzfk ue мнегдп.

23 Ozfmed xlj yze mp awpldlye, mfe npceltyej td lmdfco.

24 Nyeldc wki xyd lo zvokckxd, светодиодный mobdksxdi sc klcebn.

25 Mxdkcb vjh wxc kn yunjbjwc, kdc lnacjrwch rb jkbdam.

26 Lwcjba uig vwb jm xtmiaivb, jcb kmzbiqvbg qa ijaczl.

Просмотрев каждую строку, вы увидите, что 8-е сообщение это не фигня, а простой английский! Криптоаналитик может сделать вывод, что оригинал ключ для этого зашифрованного текста должен быть 8. Эта грубая сила было бы трудно сделать во времена кесаря ​​и римлян Империя, но сегодня у нас есть компьютеры, которые могут быстро пройти через миллионы или даже миллиарды ключей за короткое время.

Сводка

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

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

Большая часть понимания того, как написать программу, — это выяснение того, как представить информацию, которой вы хотите управлять, в виде значений что Python может понять.

В следующей главе мы расскажем о Реверси (также известном как Отелло). ИИ, который играет в эту игру, будет намного более продвинутым, чем ИИ. который играл в крестики-нолики в главе 9. На самом деле ИИ настолько хорош в большинстве раз ты не сможешь победить!

Глава 14: Цезарь Шифр ​​

14
ЦЕЗАРЬ ШИФР

Программа в этой главе на самом деле не игра, но, тем не менее, увлекательная.Программа преобразует нормальный английский в секретный код. Он также может преобразовывать секретные коды обратно в обычный английский. Только тот, кто знает ключ к секретным кодам, сможет понять сообщения.

Поскольку эта программа манипулирует текстом для преобразования его в секретные сообщения, вы узнаете несколько новых функций и методов для управления строками. Вы также узнаете, как программы могут выполнять математические вычисления с текстовыми строками так же, как с числами.

Криптография и шифрование

Наука о написании секретных кодов называется криптография .На протяжении тысяч лет криптография позволяла отправлять секретные сообщения, которые могли прочитать только отправитель и получатель, даже если кто-то захватил мессенджер и прочитал закодированное сообщение. Система секретного кода называется шифром . Шифр, используемый программой в этой главе, называется шифром Цезаря .

В криптографии мы называем сообщение, которое хотим сохранить в секрете, открытым текстом . Допустим, у нас есть текстовое сообщение, которое выглядит следующим образом:

За книжной полкой есть подсказка.

Преобразование открытого текста в закодированное сообщение называется шифрованием открытого текста. Открытый текст зашифрован в шифротекст . Зашифрованный текст выглядит как случайные буквы, поэтому мы не можем понять, что был за исходный открытый текст, просто взглянув на зашифрованный текст. Вот предыдущий пример, зашифрованный в зашифрованный текст:

aolyl pz h jsBl ilopuk Aol ivvrzolsm.

Если вам известен шифр, использованный для шифрования сообщения, вы можете расшифровать зашифрованный текст обратно в открытый текст.(Расшифровка противоположна шифрованию.)

Многие шифры используют ключи , которые представляют собой секретные значения, которые позволяют расшифровать зашифрованный текст, зашифрованный с помощью определенного шифра. Думайте о шифре как о дверном замке. Вы можете разблокировать его только с помощью определенного ключа.

Если вы заинтересованы в написании криптографических программ, вы можете прочитать мою книгу Взлом секретных шифров с помощью Python . Его можно бесплатно загрузить с http://inventwithpython.com/hacking/ .

Как работает шифр Цезаря

Шифр ​​Цезаря был одним из самых ранних шифров, когда-либо изобретенных. В этом шифре вы шифруете сообщение, заменяя каждую букву в нем «сдвинутой» буквой. В криптографии зашифрованные буквы называются символами , потому что они могут быть буквами, цифрами или любыми другими знаками. Если вы сдвинете букву A на один пробел, вы получите букву B. Если вы сдвинете букву A на два пробела, вы получите букву C. На рис. 14-1 показаны некоторые буквы, сдвинутые на три пробела.

Рис. 14-1: Шифр ​​Цезаря, сдвигающий буквы на три пробела. Здесь B становится E.

Чтобы получить каждую сдвинутую букву, нарисуйте ряд прямоугольников с каждой буквой алфавита. Затем нарисуйте под ним второй ряд прямоугольников, но начинайте буквы на определенное количество пробелов. Когда вы дойдете до конца алфавита открытого текста, вернитесь к A. На рис. 14-2 показан пример с буквами, сдвинутыми на три пробела.

Рисунок 14-2: Весь алфавит со сдвигом на три пробела

Число пробелов, на которые вы переносите буквы (от 1 до 26), является ключом в шифре Цезаря.Если вы не знаете ключ (номер, использованный для шифрования сообщения), вы не сможете расшифровать секретный код. Пример на Рисунке 14-2 показывает перевод букв для клавиши 3.

ПРИМЕЧАНИЕ

Хотя существует 26 возможных ключей, шифрование вашего сообщения с помощью 26 приведет к получению зашифрованного текста, который в точности совпадает с открытым текстом!

Если вы зашифруете текстовое слово HOWDY с ключом 3, то:

• Буква H становится K.

• Буква O становится R.

• Буква W становится Z.

• Буква D становится G.

• Буква Y превращается в B.

Итак, зашифрованный текст HOWDY с ключом 3 становится KRZGB. Чтобы расшифровать KRZGB с помощью ключа 3, мы переходим от нижних ящиков к верхним.

Если вы хотите включить строчные буквы в отличие от прописных букв, добавьте еще 26 полей к уже имеющимся и заполните их 26 строчными буквами.Теперь с ключом 3 буква Y становится b, как показано на рисунке 14-3.

Рис. 14-3: Весь алфавит, включая строчные буквы, сдвинут на три пробела

Шифр ​​работает так же, как и с заглавными буквами. Фактически, если вы хотите использовать буквы алфавита другого языка, вы можете написать с этими буквами прямоугольники, чтобы создать свой шифр.

Пример выполнения Caesar Cipher

Вот пример запуска программы Caesar Cipher, шифрующей сообщение:

Вы хотите зашифровать или расшифровать сообщение?
encrypt
Введите свое сообщение:
Небо над портом было цвета телевизора, настроенного на мертвый канал.
Введите номер ключа (1-52)
13
Ваш переведенный текст:
gur FxL noBIr Gur CBEG JnF Gur pByBE Bs GryrIvFvBA, GHArq GB n qrnq punAAry.

Теперь запустите программу и расшифруйте только что зашифрованный текст:

Вы хотите зашифровать или расшифровать сообщение?
дешифровать
Введите свое сообщение:
gur FxL noBIr Gur CBEG JnF Gur pByBE Bs GryrIvFvBA, GHArq GB n qrnq punAry.
Введите номер ключа (1-52)
13
Ваш переведенный текст:
Небо над портом было цвета телевизора, настроенного на мертвый канал.

Если вы не расшифруете правильным ключом, текст не будет правильно расшифрован:

Вы хотите зашифровать или расшифровать сообщение?
дешифровать
Введите свое сообщение:
gur FxL noBIr Gur CBEG JnF Gur pByBE Bs GryrIvFvBA, GHArq GB n qrnq punAry.
Введите номер ключа (1-52)
15
Ваш переведенный текст:
Rfc qiw YZmtc rfc nmpr uYq rfc amjmp md rcjctgqgml, rslcb rm Y bcYb afYllcj.

Исходный код для Caesar Cipher

Введите этот исходный код для программы Caesar Cipher и затем сохраните файл как шифр .py .

Если после ввода этого кода у вас возникнут ошибки, сравните набранный вами код с кодом книги с онлайн-инструментом сравнения на https://www.nostarch.com/inventwithpython#diff .

cipher.py

1. # Caesar Cipher
2. SYMBOLS = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz’
3. MAX_KEY_SIZE = len (SYMBOLS)
4.
5. def getMode для печати: зашифровать или расшифровать сообщение? ‘)
8.mode = input (). lower ()
9. if mode in [‘encrypt’, ‘e’, ​​’decrypt’, ‘d’]:
10. return mode
11. else:
12. print (‘Enter либо «зашифровать», либо «е», либо «расшифровать», либо «d». ‘)
13.
14. def getMessage ():
15. print (‘ Введите свое сообщение: ‘)
16. return input ()
17.
18. def getKey ():
19. key = 0
20. while True:
21. print (‘Введите номер ключа (1-% s)’% (MAX_KEY_SIZE))
22.key = int (input ())
23. if (key> = 1 and key <= MAX_KEY_SIZE):
24. return key
25.
26. def getTranslatedMessage (mode, message, key):
27. if mode [0] == ‘d’:
28. key = -key
29. Translated = »
30.
31. для символа в сообщении:
32. symbolIndex = SYMBOLS.find (symbol)
33. if symbolIndex == -1: # Символ не найден в СИМВОЛАХ.
34. # Просто добавьте этот символ без изменений.
35. переведено + = символ
36. else:
37. # Зашифровать или расшифровать.
38. symbolIndex + = key
39.
40. if symbolIndex> = len (SYMBOLS):
41. symbolIndex — = len (SYMBOLS)
42. elif symbolIndex <0:
43. symbolIndex + = len (SYMBOLS)
44.
45. переведено + = СИМВОЛЫ [symbolIndex]
46. вернуть переведено
47.
48. mode = getMode ()
49.message = getMessage ()
50. key = getKey ()
51. print (‘Ваш переведенный текст:’)
52. print (getTranslatedMessage (mode, message, key))

Установка максимальной длины ключа

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

1. # Caesar Cipher
2. SYMBOLS = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz’
3. MAX_KEY_SIZE = len (SYMBOLS)

MAX_KEY_SIZE — константа, в которой хранится длина SYMBOLS (52).Эта константа напоминает нам, что в этой программе ключ, используемый в шифре, всегда должен находиться в диапазоне от 1 до 52.

Решение зашифровать или расшифровать сообщение

Функция getMode () позволяет пользователю решить, хотят ли они использовать режим шифрования или дешифрования программы:

5. def getMode ():
6. while True:
7. print («Вы хотите зашифровать или расшифровать сообщение?»)
8. mode = input (). Lower ()
9. if mode in [‘encrypt’, ‘e’, ​​’decrypt’, ‘d’]:
10.режим возврата
11. else:
12. print (‘Введите либо «зашифровать», либо «е», либо «расшифровать» или «d». »)

Строка 8 вызывает input (), чтобы пользователь мог войти в нужный режим. Затем для этой строки вызывается метод lower (), чтобы вернуть версию строки в нижнем регистре. Значение, возвращаемое функцией input (). Lower (), сохраняется в режиме. Условие оператора if проверяет, существует ли строка, сохраненная в режиме, в списке [‘encrypt’, ‘e’, ​​’decrypt’, ‘d’].

Эта функция вернет строку в режиме, если режим равен ‘encrypt’, ‘e’, ​​’decrypt’ или ‘d’.Следовательно, getMode () вернет строковый режим. Если пользователь вводит что-то, что не является ‘encrypt’, ‘e’, ​​’decrypt’ или ‘d’, тогда цикл while спросит их снова.

Получение сообщения от игрока

Функция getMessage () просто получает сообщение для шифрования или дешифрования от пользователя и возвращает его:

14. def getMessage ():
15. print (‘Введите свое сообщение:’)
16. return input ()

Вызов input () комбинируется с return, поэтому мы используем только одну строку вместо двух.

Получение ключа от плеера

Функция getKey () позволяет игроку ввести ключ, который он будет использовать для шифрования или дешифрования сообщения:

18. def getKey ():
19. key = 0
20. while True:
21. print (‘Введите номер ключа (1-% s)’% (MAX_KEY_SIZE))
22. key = int (input ())
23. if (ключ> = 1 и ключ <= MAX_KEY_SIZE):
24. ключ возврата

Цикл while гарантирует, что функция продолжает цикл до тех пор, пока пользователь не введет допустимый ключ.Действительный ключ здесь — это ключ между целыми значениями от 1 до 52 (помните, что MAX_KEY_SIZE равно 52, потому что в переменной SYMBOLS 52 символа). Затем функция getKey () возвращает этот ключ. Строка 22 устанавливает ключ для целочисленной версии того, что ввел пользователь, поэтому getKey () возвращает целое число.

Шифрование или дешифрование сообщения

Функция getTranslatedMessage () выполняет собственное шифрование и дешифрование:

26. def getTranslatedMessage (режим, сообщение, ключ):
27.если режим [0] == ‘d’:
28. key = -key
29. translated = »

Имеет три параметра:

mode Устанавливает функцию в режим шифрования или режим дешифрования.

Сообщение

Это открытый текст (или зашифрованный текст), который нужно зашифровать (или расшифровать).

ключ Это ключ, который используется в этом шифре.

Строка 27 проверяет, является ли первая буква в переменной режима строкой ‘d’. Если да, то программа находится в режиме расшифровки. Единственное различие между режимом дешифрования и шифрования заключается в том, что в режиме дешифрования ключ устанавливается в отрицательную версию самого себя.Например, если ключ — это целое число 22, то режим дешифрования устанавливает его на -22. Причина объяснена в разделе «Шифрование или дешифрование каждого письма» на странице 205.

Переведенная переменная будет содержать строку результата: либо зашифрованный текст (если вы шифруете), либо открытый текст (если вы расшифровываете). Он начинается с пустой строки и содержит зашифрованные или дешифрованные символы, присоединенные к ее концу. Однако, прежде чем мы сможем объединить символы для перевода, нам нужно зашифровать или расшифровать текст, что мы и сделаем в остальной части getTranslatedMessage ().

Поиск пропущенных строк с помощью строкового метода find ()

Чтобы переместить буквы для шифрования или дешифрования, нам сначала нужно преобразовать их в числа. Число для каждой буквы в строке SYMBOLS будет индексом, в котором она появляется. Поскольку буква A находится в SYMBOLS [0], число 0 будет представлять заглавную A. Если бы мы хотели зашифровать это с помощью ключа 3, мы бы просто использовали 0 + 3, чтобы получить индекс зашифрованной буквы: SYMBOLS [3 ] или «D».

Мы будем использовать строковый метод find (), который находит первое вхождение переданной строки в строке, для которой вызывается метод. Введите в интерактивную оболочку следующее:

>>> ‘Hello world!’. Find (‘H’)
0
>>> ‘Hello world!’. Find (‘o’)
4
>>> ‘Hello world!’. Find (‘ell ‘)
1

«Hello world!». Find («H») возвращает 0, потому что «H» находится в первом индексе строки «Hello world!». Помните, что индексы начинаются с 0, а не с 1.Код «Hello world!». Find («o») возвращает 4, потому что строчная «o» сначала встречается в конце «Hello». Метод find () перестает искать первое вхождение, поэтому второе «o» в «world» не имеет значения. Вы также можете найти строки, содержащие более одного символа. Строка ‘ell’ начинается с индекса 1.

Если переданная строка не может быть найдена, метод find () возвращает -1:

>>> ‘Привет, мир!’. Find (‘xyz’)
-1

Вернемся к программе Caesar Cipher.Строка 31 — это цикл for, который повторяет каждый символ в строке сообщения:

31. для символа в сообщении:
32. symbolIndex = SYMBOLS.find (symbol)
33. if symbolIndex == -1: # Символ не найден в SYMBOLS.
34. # Просто добавьте этот символ без изменений.
35. переведено + = символ

Метод find () используется в строке 32 для получения индекса строки в символе. Если find () возвращает -1, символ в символе будет просто добавлен в переведенный без каких-либо изменений.Это означает, что любые символы, не входящие в алфавит, например запятые и точки, не будут изменены.

Шифрование или дешифрование каждого письма

После того, как вы нашли порядковый номер буквы, добавление ключа к номеру выполнит сдвиг и даст вам индекс для зашифрованной буквы.

Строка 38 делает это добавление, чтобы получить зашифрованное (или расшифрованное) письмо.

37. # Зашифровать или расшифровать.
38. symbolIndex + = ключ

Помните, что в строке 28 мы сделали целое число в ключе отрицательным для дешифрования.Код, который добавляет ключ, теперь вычитает его, поскольку добавление отрицательного числа аналогично вычитанию.

Однако, если это сложение (или вычитание, если ключ отрицательный) приводит к тому, что symbolIndex проходит мимо последнего индекса SYMBOLS, нам нужно будет перейти к началу списка с 0. Это обрабатывается оператором if, начиная с в строке 40:

40. if symbolIndex> = len (SYMBOLS):
41. symbolIndex — = len (SYMBOLS)
42. elif symbolIndex <0:
43.symbolIndex + = len (SYMBOLS)
44.
45. переведено + = SYMBOLS [symbolIndex]

Строка 40 проверяет, прошел ли symbolIndex последний индекс, сравнивая его с длиной строки SYMBOLS. Если да, строка 41 вычитает длину СИМВОЛОВ из symbolIndex. Если теперь символ symbolIndex отрицательный, то индекс должен перейти на другую сторону строки SYMBOLS. Строка 42 проверяет, является ли значение symbolIndex отрицательным после добавления ключа дешифрования.Если это так, в строке 43 к symbolIndex добавляется длина SYMBOLS.

Переменная symbolIndex теперь содержит индекс правильно зашифрованного или дешифрованного символа. SYMBOLS [symbolIndex] будет указывать на символ для этого индекса, и этот символ добавляется в конец переведенного в строке 45.

Выполнение возвращается к строке 31, чтобы повторить это для следующего символа в сообщении. После завершения цикла функция возвращает зашифрованную (или расшифрованную) строку, переведенную в строке 46:

.

46.возврат переведен

Последняя строка в функции getTranslatedMessage () возвращает переведенную строку.

Запуск программы

Запуск программы вызывает каждую из трех функций, определенных ранее, чтобы получить режим, сообщение и ключ от пользователя:

48. mode = getMode ()
49. message = getMessage ()
50. key = getKey ()
51. print (‘Ваш переведенный текст:’)
52. print (getTranslatedMessage (mode, message, key) )

Эти три значения передаются в getTranslatedMessage (), возвращаемое значение которой (переведенная строка) печатается пользователю.

Техника грубой силы

Это весь шифр Цезаря. Однако, хотя этот шифр может ввести в заблуждение некоторых людей, не разбирающихся в криптографии, он не сохранит сообщение в секрете от того, кто знает криптоанализ . В то время как криптография — это наука о создании кодов, криптоанализ — это наука о взломе кодов.

Весь смысл криптографии состоит в том, чтобы убедиться, что если кто-то другой получит в свои руки зашифрованное сообщение, он не сможет выяснить исходный текст.Давайте представим, что мы взломщик кода, и все, что у нас есть, это зашифрованный текст:

LwCjBA uiG vwB jm xtmiAivB, jCB kmzBiqvBG qA ijACzl.

Брутто-форсирование — это метод перебора всех возможных ключей до тех пор, пока вы не найдете правильный. Поскольку существует только 52 возможных ключа, криптоаналитику будет легко написать программу взлома, которая расшифровывает все возможные ключи. Тогда они могли бы искать ключ, который расшифровывает до простого английского. Давайте добавим в программу функцию перебора.

Добавление режима грубой силы

Сначала измените строки 7, 9 и 12, которые находятся в функции getMode (), чтобы они выглядели следующим образом (изменения выделены жирным шрифтом):

5. def getMode ():
6. while True:
7. print («Вы хотите зашифровать, расшифровать или перебрать сообщение
?»)
8. mode = input (). Lower ()
9. если режим в [‘encrypt’, ‘e’, ​​’decrypt’, ‘d’, ‘brute’, ‘b’]:
10. режим возврата
11.else:
12. print (‘Введите либо «encrypt», либо «e», либо «decrypt», либо «d», либо
«brute» или «b».’)

Этот код позволит пользователю выбрать режим грубой силы.

Далее внесем следующие изменения в основную часть программы:

48. mode = getMode ()
49. message = getMessage ()
50. if mode [0]! = ‘B’:
51. key = getKey ()
52. print (‘Ваш переведенный текст:’ )
53. if mode [0]! = ‘B’:
54. print (getTranslatedMessage (режим, сообщение, ключ))
55.иначе:
56. для ключа в диапазоне (1, MAX_KEY_SIZE + 1):
57. print (ключ, getTranslatedMessage (‘расшифровать’, сообщение, ключ))

Если пользователь не находится в режиме грубой силы, у него запрашивается ключ, выполняется исходный вызов getTranslatedMessage () и печатается переведенная строка.

Однако, если пользователь находится в режиме грубой силы, цикл getTranslatedMessage () выполняет итерацию от 1 до MAX_KEY_SIZE (то есть 52). Помните, что функция range () возвращает список целых чисел до второго параметра, но не включая его, поэтому мы добавляем +1.Затем программа распечатает все возможные переводы сообщения (включая ключевой номер, использованный в переводе). Вот пример выполнения этой модифицированной программы:

Вы хотите зашифровать, расшифровать или подобрать сообщение?
brute
Введите свое сообщение:
LwCjBA uiG vwB jm xtmiAivB, jCB kmzBiqvBG qA ijACzl.
Ваш переведенный текст:
1 KvBiAz thF uvA il wslhzhuA, iBA jlyAhpuAF pz hizByk.
2 JuAhzy sgE tuz hk vrkgygtz, hAz ikxzgotzE oy ghyAxj.
3 Itzgyx RFD sty gj uqjfxfsy, gzy hjwyfnsyD nx fgxzwi.
4 Hsyfxw qeC rsx fi tpiewerx, fyx givxemrxC mw efwyvh.
5 Grxewv pdB qrw eh sohdvdqw, exw fhuwdlqwB lv devxug.
6 Fqwdvu ocA pqv dg rngcucpv, dwv egtvckpvA ku cduwtf.
7 Epvcut nbz opu cf qmfbtbou, cvu dfsubjouz jt bctvse.
8 Сомнения не могут быть приятными, но уверенность абсурдна.
9 Cntasr lZx mns ad okdZrZms, ats bdqsZhmsx hr Zartqc.
10 BmsZrq kYw lmr Zc njcYqYlr, Zsr acprYglrw gq YZqspb.
11 AlrYqp jXv klq Yb mibXpXkq, Yrq ZboqXfkqv fp XYproa.
12 zkqXpo iWu jkp Xa lhaWoWjp, Xqp YanpWejpu eo WXoqnZ.
—снип —

Просмотрев каждую строку, вы увидите, что восьмое сообщение — не ерунда, а простой английский! Криптоаналитик может сделать вывод, что исходный ключ для этого зашифрованного текста должен был быть 8. Этот метод грубой силы было бы трудно применить во времена Юлия Цезаря и Римской империи, но сегодня у нас есть компьютеры, которые могут быстро пройти через миллионы или даже миллиарды ключей за короткое время.

Сводка

Компьютеры хорошо разбираются в математике.Когда мы создаем систему для перевода некоторой части информации в числа (как мы делаем с текстом и порядковыми числами или с пространством и системами координат), компьютерные программы могут обрабатывать эти числа быстро и эффективно. Большая часть написания программы — это выяснение того, как представить информацию, которой вы хотите манипулировать, в виде значений, понятных Python.

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

В главе 15 мы создадим Reversegam (также известный как Reversi или Othello). ИИ, который играет в эту игру, намного более продвинут, чем ИИ, который играл в крестики-нолики в главе 10. На самом деле, он настолько хорош, что большую часть времени вы не сможете победить его!

Задание 7 — CS 65: Введение в компьютерные науки

Тип: Группа Назначение
Срок сдачи: до 12:00 (полночь) в четверг, 15 октября 2020 г.

Пролог

Это групповое задание.Обязательно ознакомьтесь с нашим Кодексом поведения для парного программирования и соблюдайте его при работе над заданием. Имейте в виду, что вы и должны быть авторами всего отправленного кода.

Обзор

Шифр ​​Цезаря — это простой метод шифрования сообщения, который затрудняет чтение, если у вас нет секретного номера, называемого смена . Чтобы зашифровать сообщение, вам нужно заменить каждый символ в сообщении на сдвиг на количество символов впереди в алфавите.Например, если shift = 3 , то все символы в алфавите будут сдвинуты на три, а те, что в конце, будут «переходить» в начало.

Алфавит А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
Алфавит, сдвинутый на 3 Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я Я Б С

Используя сдвиг на 3, сообщение типа «hello» будет зашифровано как «khoor», поскольку символ «h» сдвигается на «k» (поскольку «k» на три символа опережает «h») и скоро.

В этом задании вы реализуете шифр Цезаря, который позволит вам таким образом шифровать и расшифровывать фразы. Вы должны поместить свой код для этого назначения в файл с именем cipher.py .

Часть A: Перемещение писем

В этой части вы напишете функцию с именем shift_letter (ch, shift) , которая принимает в качестве параметра символ ch , а также целое число shift и возвращает «смещенную» форму символа.Ваша функция должна сохранять регистр символа и ничего не делать с небуквенными символами.

Ниже приведены некоторые примеры казней.

  >>> shift_letter ("a", 3)
'd'
>>> shift_letter ("z", 1)
'а'
>>> shift_letter ("B", -1)
'А'
>>> shift_letter ("H"; 5)
'М'
>>> shift_letter ("$", 13)
'$'
  

Для этой задачи вам потребуется использовать функцию ord , которая преобразует символ в его целое число порядковый номер , и функцию chr , которая преобразует целые порядковые числа обратно в символы.Особенно полезно, чтобы все буквенные символы располагались рядом друг с другом:

  >>> ord ("А")
65
>>> ord ("B")
66
>>> ord ("C")
67
  

Обратите внимание, что символы верхнего и нижнего регистра имеют разные порядковые номера:

  >>> ord ("а")
97
>>> ord ("б")
98
>>> ord ("с")
99
  

Часть B: Сдвиг струн

В этой части вы напишете функцию с именем shift_phrase (s, shift) , которая принимает в качестве параметра строку s , а также целое число shift и возвращает «смещенную» форму строки.Ваше решение этой части должно использовать вашу функцию shift_letter из Части A.

Ниже приведены некоторые примеры выполнения ввода.

  >>> shift_phrase («Привет, мир!», 3)
«Хор зруог!»
>>> shift_phrase ("Хор зруог!", -3)
"Привет, мир!"
>>> shift_phrase ("быстрая коричневая лиса", 13)
'gur dhvpx oebja sbk'
>>> shift_phrase ("gur dhvpx oebja sbk", 13)
'быстрая коричневая лиса'
  

Помните, что строки в Python — это последовательностей , что означает, что вы можете использовать определенный цикл для перебора отдельных символов.Например, код

  для ч в "привет":
    печать (ch)
  

действует так же, как:

  ch = "h"
печать (ch)
ch = "e"
печать (ch)
ch = "l"
печать (ch)
ch = "l"
печать (ch)
ch = "o"
печать (ch)
  

и, следовательно, напечатает следующие строки на выходе.

Часть C: Тестирование

Тестирование ваших программ на правильность очень важно. Цель тестирования — охватить все странные случаи, которые могут привести к сбою вашей программы.В этой части вы напишете список тестов, которые, если ваша программа пройдет успешно, дадут вам уверенность в ее правильности.

Для начала создайте текстовый файл с именем shift_tests.txt , который включает следующий начальный текст.

 Ожидаемый результат сдвига фразы 
------ ----- ---------------
привет 3 хур
  

Каждая строка соответствует контрольному примеру , который сопоставляет ввод, который вводит пользователь, с правильным выводом, который они должны видеть.Добавляйте дополнительные тесты в текстовый файл, пока не будете уверены, что их достаточно для , убедитесь, что нет ошибок в вашем коде.

Пожалуйста, укажите свои имена в верхней части файла и краткое объяснение, почему вы считаете, что включенные вами тесты вселяют уверенность в правильности вашей программы.

Часть D. Документация

На этом этапе семестра вы должны привыкнуть писать строк документации для своих функций. Перед отправкой вашего задания вы должны написать подробную документацию для ваших функций shift_letter и shift_phrase .Строки документации должны быть завершены с указанием цели вверху и разделами для параметров, возвратов, предварительных условий и постусловий. Вы должны смоделировать свой формат строки документации по образцу тех, которые мы видели ранее в классе, например, bound_between docstring из предыдущей лабораторной работы.

Как сдать код

  1. После того, как вы закончите задание, перейдите на https://www.gradescope.com и войдите в свою учетную запись.
  2. Перейдите на курс CS 65 .
  3. Перейдите к Assignment 7 и загрузите все свои файлы.
  4. После того, как вы отправите задание, вы должны увидеть кнопку с именем Group Members внизу страницы. Используйте это, чтобы добавить вашего партнера к представлению.
  5. Вот и все! Вы только что сдали задание.

Важные критерии оценки

Я буду оценивать вашу работу по следующим критериям.

  1. Правильность .Ваш код делает то, что просят? (например, правильно названо, вводятся и выводятся правильные значения и т. д.)
  2. Форматирование . Ваш код отформатирован так, чтобы его было легко понять?
  3. Элегантность . Ваш код лаконичный и элегантный?

Caesar Cipher в Python (учебник по шифрованию текста)

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

Caesar Cipher — один из старейших методов шифрования, на котором мы сосредоточимся в этом руководстве, и реализуем то же самое в Python.
Хотя Caesar Cipher — это очень слабый метод шифрования и редко используется сегодня, мы делаем это руководство, чтобы познакомить наших читателей, особенно новичков, с шифрованием.
Считайте это «привет миром» криптографии.

Что такое шифр Цезаря?

Цезарь Шифр ​​- это тип шифра подстановки, в котором каждая буква в простом тексте заменяется другой буквой в некоторых фиксированных позициях от текущей буквы в алфавите.

Например, если мы сдвинем каждую букву на три позиции вправо, каждая из букв в нашем простом тексте будет заменена буквой в трех позициях справа от буквы в простом тексте.
Давайте посмотрим на это в действии — давайте зашифруем текст «HELLO WORLD», используя сдвиг вправо на 3.

Таким образом, буква H будет заменена на K, E будет заменена на H, и так далее. Последнее зашифрованное сообщение для HELLO WORLD будет KHOOR ZRUOG. Эта тарабарщина бессмысленна, не так ли?

Обратите внимание, что буквы на краю, то есть X, Y, Z, обтекают и заменяются на A, B, C соответственно, в случае сдвига вправо. Аналогично буквы в начале — A, B, C и т. Д.будет оборачиваться в случае сдвига влево.

Правило шифрования Caesar Cipher математически может быть выражено как:

 с = (х + п)% 26
 

Где c — закодированный символ, x — фактический символ, а n — количество позиций, на которые мы хотим сдвинуть символ x. Мы берем мод с 26, потому что в английском алфавите 26 букв.

Шифр ​​Цезаря в Python

Прежде чем мы погрузимся в определение функций для процесса шифрования и дешифрования Caesar Cipher в Python, мы сначала рассмотрим две важные функции, которые мы будем широко использовать в процессе: chr () и ord () .
Важно понимать, что алфавит, который мы знаем, по-разному хранится в памяти компьютера. Компьютер сам по себе не понимает ни алфавита нашего английского языка, ни других символов.

Каждый из этих символов представлен в памяти компьютера с помощью числа, называемого кодом ASCII (или его расширением — Unicode) символа, которое является 8-битным числом и кодирует почти все символы, цифры и знаки препинания английского языка.
Например, заглавная буква «A» представлена ​​числом 65, «B» — числом 66 и так далее.Точно так же представление строчных символов начинается с числа 97.

Поскольку возникла необходимость включить больше символов и знаков других языков, 8-битного оказалось недостаточно, поэтому был принят новый стандарт Unicode , который представляет все символы, используемые в мире, с использованием 16-бит.
ASCII — это подмножество Unicode, поэтому кодировка символов ASCII в Unicode остается неизменной. Это означает, что буква «A» по-прежнему будет представлена ​​числом 65 в Unicode.
Обратите внимание, что специальные символы, такие как пробел »«, табуляторы «\ t», символы новой строки «\ n» и т. Д.также представлены в памяти своим Unicode.

Мы рассмотрим две встроенные функции в Python, которые используются для нахождения Unicode-представления символа и наоборот.

Функция ord ()

Вы можете использовать метод ord () для преобразования символа в его числовое представление в Юникоде. Он принимает один символ и возвращает число, представляющее его Unicode. Давайте посмотрим на пример.

 c_unicode = ord ("с")

A_unicode = ord ("А")

print ("Unicode of 'c' =", c_unicode)

print ("Unicode of 'A' =", A_unicode) 

Выход:

Функция chr ()

Так же, как мы могли преобразовать символ в его числовой Unicode с помощью метода ord (), мы делаем обратное i.е. найдите символ, представленный числом, используя метод chr ().
Метод chr () принимает число, представляющее Unicode символа, и возвращает фактический символ, соответствующий числовому коду.
Давайте сначала рассмотрим несколько примеров:

 character_65 = chr (65)

character_100 = chr (100)

print ("Unicode 65 представляет", character_65)

print ("Unicode 100 представляет", character_100)

character_360 = chr (360)

print («Unicode 360 ​​представляет», character_360) 

Выход:

Обратите внимание, что немецкая буква Ü (умляут) также представлена ​​в Юникоде числом 360.

Мы также можем применить связанную операцию (ord, за которой следует chr), чтобы вернуть исходный символ.

 c = chr (ord ("Ũ"))

печать (с) 

Выход: Ũ

Шифрование заглавных букв

Теперь, когда мы понимаем два основных метода, которые мы будем использовать, давайте реализуем технику шифрования заглавных букв в Python. Мы зашифруем в тексте только прописные буквы, остальные оставим без изменений.
Давайте сначала посмотрим на пошаговый процесс шифрования заглавных букв:

  1. Определите значение сдвига, то есть количество позиций, которые мы хотим сдвинуть от каждого символа.
  2. Перебрать каждый символ простого текста:
    1. Если символ в верхнем регистре:
      1. Вычислить позицию / индекс символа в диапазоне 0-25.
      2. Выполните положительный сдвиг , используя операцию по модулю.
      3. Найдите символ в новой позиции.
      4. Заменить текущую заглавную букву новым символом.
    2. Иначе, если символ не в верхнем регистре, оставьте его без изменений.

Давайте теперь посмотрим на код:

 shift = 3 # определение количества смен

text = "ПРИВЕТ, МИР"

encryption = ""

для c в тексте:

    # проверяем, является ли символ заглавной буквой
    если c.isupper ():

        # найти позицию в 0-25
        c_unicode = ord (с)

        c_index = ord (c) - ord ("A")

        # выполнить смену
        new_index = (c_index + shift)% 26

        # преобразовать в новый символ
        new_unicode = new_index + ord («А»)

        new_character = chr (новый_unicode)

        # добавить к зашифрованной строке
        encryption = encryption + new_character

    еще:

        # поскольку символ не в верхнем регистре, оставьте его как есть
        шифрование + = c
        
print ("Обычный текст:", текст)

print ("Зашифрованный текст:", шифрование) 

Выход:

Как мы видим, зашифрованный текст для «HELLO WORLD» — «KHOOR ZRUOG», и он соответствует тому, к которому мы пришли вручную в разделе «Введение».
Кроме того, этот метод не шифрует пробел, и он продолжает оставаться пробелом в зашифрованной версии.

Расшифровка заглавных букв

Теперь, когда мы разобрались с шифрованием заглавных букв обычного текста с помощью Ceaser Cipher, давайте посмотрим, как мы будем расшифровывать зашифрованный текст в простой текст.

Ранее мы рассмотрели математическую формулировку процесса шифрования. Давайте теперь проверим то же самое для процесса дешифрования.

 х = (с - п)% 26 

Значение обозначений остается таким же, как в предыдущей формуле.
Если после вычитания какое-либо значение становится отрицательным, об этом позаботится оператор по модулю, который обернет его.

Давайте посмотрим на пошаговую реализацию процесса дешифрования, который будет более или менее обратным шифрованию:

  • Определить количество смен
  • Перебрать каждый символ в зашифрованном тексте:
    • Если символ — заглавная буква:
      1. Вычислить позицию / индекс символа в диапазоне 0-25.
      2. Выполните отрицательный сдвиг , используя операцию по модулю.
      3. Найдите символ в новой позиции.
      4. Заменить текущую зашифрованную букву этим новым символом (который также будет заглавной буквой).
      5. Иначе, если символ не заглавный, оставьте его без изменений.

Напишем код для описанной выше процедуры:

 shift = 3 # определение количества смен

encrypted_text = "ХОР ЗРУОГ"

plain_text = ""

для c в encrypted_text:

    # проверяем, является ли символ заглавной буквой
    если c.isupper ():

        # найти позицию в 0-25
        c_unicode = ord (с)

        c_index = ord (c) - ord ("A")

        # выполнить отрицательный сдвиг
        new_index = (c_index - сдвиг)% 26

        # преобразовать в новый символ
        new_unicode = new_index + ord («А»)

        new_character = chr (новый_unicode)

        # добавить к простой строке
        plain_text = plain_text + новый_символ

    еще:

        # поскольку символ не в верхнем регистре, оставьте его как есть
        простой_текст + = c

print ("Зашифрованный текст:", encrypted_text)

print ("Расшифрованный текст:", plain_text) 

Выход:

Обратите внимание, как мы успешно восстановили исходный текст «HELLO WORLD» из его зашифрованной формы.

Шифрование цифр и знаков препинания

Теперь, когда мы увидели, как мы можем кодировать и декодировать заглавные буквы английского алфавита с помощью Caesar Cipher, возникает важный вопрос: а как насчет других символов?
А как насчет чисел? А как насчет специальных символов и знаков препинания?

Итак, оригинальный алгоритм Caesar Cipher не должен был иметь дело ни с чем, кроме 26 букв алфавита — ни в верхнем, ни в нижнем регистре.
Таким образом, типичный шифр Цезаря не шифрует знаки препинания или цифры, а преобразует все буквы в нижний или верхний регистр и кодирует только эти символы.

Но мы всегда можем расширить существующее хорошее решение и настроить его в соответствии с нашими потребностями — это верно для любых задач в разработке программного обеспечения.
Итак, мы попробуем кодировать символы верхнего и нижнего регистра, как это делали в предыдущем разделе, пока мы проигнорируем пунктуацию, а затем мы также будем кодировать числа в тексте.

Для чисел мы можем выполнить шифрование одним из двух способов:

  1. Сдвиньте цифровое значение на ту же величину, что и буквы алфавита, т. Е. При смещении 3 цифра 5 становится 8, 2 становится 5, 9 становится 2 и так далее.
  2. Сделайте числа частью алфавита, т.е. после z или Z будет 0,1,2. до 9, и на этот раз наш делитель для операции по модулю будет 36 вместо 26.

Мы реализуем наше решение, используя первую стратегию.Кроме того, на этот раз мы реализуем наше решение как функцию, которая принимает значение сдвига (которое служит ключом в Caesar Cipher) в качестве параметра.
Мы реализуем 2 функции — cipher_encrypt () и cipher_decrypt ()
Давайте запачкаем руки!

Решение

 # Функция шифрования
def cipher_encrypt (простой_текст, ключ):

    encrypted = ""

    для c в plain_text:

        if c.isupper (): # проверьте, является ли это символом верхнего регистра

            c_index = ord (c) - ord ('А')

            # сдвинуть текущий символ по позициям клавиш
            c_shifted = (c_index + ключ)% 26 + ord ('A')

            c_new = chr (c_shifted)

            зашифрованный + = c_new

        Элиф с.islower (): # проверьте, является ли это символом нижнего регистра

            # вычтите юникод из 'a', чтобы получить индекс в диапазоне [0-25)
            c_index = ord (c) - ord ('а')

            c_shifted = (c_index + ключ)% 26 + ord ('a')

            c_new = chr (c_shifted)

            зашифрованный + = c_new

        Элиф c.isdigit ():

            # если это число, сдвинуть его фактическое значение
            c_new = (int (c) + ключ)% 10

            зашифрованный + = str (c_new)

        еще:

            # если здесь нет ни алфавита, ни числа, просто оставьте это так
            зашифрованный + = c

    вернуть зашифрованный

# Функция дешифрования
def cipher_decrypt (зашифрованный текст, ключ):

    decrypted = ""

    для c в зашифрованном тексте:

        если c.isupper ():

            c_index = ord (c) - ord ('А')

            # сдвинуть текущий символ влево по позициям клавиш, чтобы получить его исходное положение
            c_og_pos = (c_index - ключ)% 26 + ord ('A')

            c_og = chr (c_og_pos)

            расшифрованный + = c_og

        elif c.islower ():

            c_index = ord (c) - ord ('а')

            c_og_pos = (c_index - ключ)% 26 + ord ('a')

            c_og = chr (c_og_pos)

            расшифрованный + = c_og

        Элиф с.isdigit ():

            # если это число, сдвинуть его фактическое значение
            c_og = (int (c) - ключ)% 10

            расшифрованный + = str (c_og)

        еще:

            # если здесь нет ни алфавита, ни числа, просто оставьте это так
            расшифровано + = c

    вернуть расшифрованный 

Теперь, когда мы определили наши две функции, давайте сначала воспользуемся функцией шифрования, чтобы зашифровать секретное сообщение, которым друг отправляет текстовое сообщение своему приятелю.

 plain_text = "Приятель, приключенческая поездка по Канберре была такой веселой. Мы были так пьяны, что в итоге позвонили в службу 911!"

ciphertext = cipher_encrypt (простой_текст, 4)

print ("Обычное текстовое сообщение: \ n", простой_текст)

print ("Зашифрованный зашифрованный текст: \ n", зашифрованный текст) 

Выход:

Обратите внимание, как было зашифровано все, кроме знаков препинания и пробелов.

Теперь давайте посмотрим на зашифрованный текст, который полковник Ник Фьюри отправил на свой пейджер: « Sr xli gsyrx sj 7, 6, 5 — Ezirkivw Ewwiqfpi!
Оказывается, это зашифрованный текст Цезаря, и, к счастью, мы получили ключ к этому зашифрованному тексту!
Давайте посмотрим, сможем ли мы раскрыть скрытое сообщение.

 ciphertext = "Sr xli gsyrx sj 7, 6, 5 - Ezirkivw Ewwiqfpi!"

decrypted_msg = cipher_decrypt (зашифрованный текст, 4)

print ("Зашифрованный текст: \ n", зашифрованный текст)

print ("Расшифрованное сообщение: \ n", decrypted_msg)
 

Выход:

Вперед, Мстители!

Использование таблицы поиска

На этом этапе мы разобрались с процессом шифрования и дешифрования Caesar Cipher и реализовали его в Python.

Теперь посмотрим, как сделать его более эффективным и гибким.
В частности, мы сосредоточимся на том, как избежать повторных вычислений смещенных позиций для каждой буквы в тексте в процессе шифрования и дешифрования, предварительно построив поисковую таблицу .

Мы также рассмотрим, как мы можем разместить любой набор определяемых пользователем символов, а не только буквы алфавита в нашем процессе шифрования.
Мы также объединим процессы шифрования и дешифрования в одну функцию и примем в качестве параметра, какой из двух процессов пользователь хочет выполнить.

Что такое таблица поиска?

Таблица поиска — это просто отображение исходных символов и символов, в которые они должны переводиться в зашифрованном виде.
До сих пор мы перебирали каждую из букв в строке и вычисляли их смещенные позиции.
Это неэффективно, потому что наш набор символов ограничен, и большинство из них встречается в строке более одного раза.
Таким образом, вычисление их зашифрованной эквивалентности каждый раз, когда они возникают, неэффективно и становится дорогостоящим, если мы шифруем очень длинный текст, содержащий сотни тысяч символов.

Этого можно избежать, вычислив сдвинутые позиции каждого из символов в нашем наборе символов только один раз перед запуском процесса шифрования.
Итак, если есть 26 прописных и 26 строчных букв, нам понадобится только 52 вычисления один раз и немного места в памяти для хранения этого отображения.
Затем во время процесса шифрования и дешифрования все, что нам нужно будет сделать, это выполнить «поиск» в этой таблице — операцию, которая каждый раз быстрее, чем выполнение операции по модулю.

Создание таблицы поиска

Модуль

Python string предоставляет простой способ не только создать таблицу поиска, но и преобразовать любую новую строку на основе этой таблицы.

Рассмотрим пример, в котором мы хотим создать таблицу из первых пяти строчных букв и их индексов в алфавите.
Затем мы использовали бы эту таблицу для перевода строки, в которой каждое из вхождений ‘a’, ‘b’, ‘c’, ‘d’ и ‘e’ заменяется на ‘0’, ‘1’, ‘2 ‘,’ 3 ‘и’ 4 ‘соответственно; а остальные символы остаются нетронутыми.

Мы будем использовать функцию maketrans () модуля str для создания таблицы.
Этот метод принимает в качестве своего первого параметра строку символов, для которой требуется перевод, и другой строковый параметр той же длины, который содержит отображенные символы для каждого символа в первой строке.

Создадим таблицу для простого примера.

 table = str.maketrans ("abcde", "01234") 

Таблица представляет собой словарь Python, в котором значения символов Unicode используются в качестве ключей, а соответствующие им сопоставления — в качестве значений.
Теперь, когда наша таблица готова, мы можем переводить строки любой длины, используя эту таблицу.
К счастью, перевод также выполняется другой функцией модуля str, которая называется translate.

Давайте воспользуемся этим методом для преобразования нашего текста с помощью нашей таблицы.

 text = "Альберт Эйнштейн, родившийся в Германии, был выдающимся физиком-теоретиком."

переведено = text.translate (таблица)

print ("Исходный текст: / n", текст)

print ("Переведенный текст: / n", переведено) 

Выход:

Как видите, каждое из первых пяти букв нижнего регистра заменено их относительными индексами.

Теперь мы воспользуемся той же техникой для создания таблицы поиска для Caesar Cipher на основе предоставленного ключа.

Реализация шифрования

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

 строка импорта

def cipher_cipher_using_lookup (текст, ключ, символы = строка.ascii_lowercase, decrypt = False):

    если ключ <0:

        print («ключ не может быть отрицательным»)

        return None

    n = len (символы)

    если расшифровать == Истина:

        key = n - ключ

    table = str.maketrans (символы, символы [ключ:] + символы [: ключ])
    
    Translated_text = text.translate (таблица)
    
    вернуть переведенный_текст 

Вот и одна мощная функция!

Вся операция переключения была сведена к операции нарезки.
Также мы используем атрибут string.ascii_lowercase - это строка символов от «a» до «z».
Еще одна важная особенность, которую мы здесь достигли, заключается в том, что одна и та же функция выполняет как шифрование, так и дешифрование; это можно сделать, изменив значение параметра «ключ».
Операция нарезки вместе с этим новым ключом гарантирует, что набор символов был сдвинут влево - то, что мы делаем при расшифровке шифротекста Цезаря со сдвигом вправо.

Давайте проверим, работает ли это, используя предыдущий пример.
Мы будем шифровать текст только заглавными буквами и передадим то же самое в параметр «characters».
Зашифруем текст: «ПРИВЕТ, МИР! Добро пожаловать в мир криптографии! »

 text = "ПРИВЕТ, МИР! Добро пожаловать в мир криптографии!"

encrypted = cipher_cipher_using_lookup (текст, 3, строка.ascii_uppercase, decrypt = False)

печать (зашифрованная) 

Выход:

Проверьте, как часть «KHOOR ZRUOG» соответствует шифрованию «HELLO WORLD» с ключом 3 в нашем первом примере.
Также обратите внимание, что мы указываем набор символов как прописные буквы, используя string.ascii_uppercase

Мы можем проверить, правильно ли работает дешифрование, используя тот же зашифрованный текст, который мы получили в нашем предыдущем результате.
Если нам удастся восстановить исходный текст, значит, наша функция работает отлично.

 text = "ХОР ЗРУОГ! Добро пожаловать в мир фриптографии!"

decrypted = cipher_cipher_using_lookup (текст, 3, строка.ascii_uppercase, decrypt = True)

печать (расшифровка) 

Выход:

Обратите внимание, как мы установили для параметра « decrypt» в нашей функции значение True.
Поскольку мы восстановили исходный текст, это признак того, что наш алгоритм шифрования-дешифрования с использованием таблицы поиска работает хорошо!

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

 набор_символов = строка.ascii_lowercase + строка.ascii_uppercase + строка.цифры + "" + строка. пунктуация

print ("Расширенный набор символов: \ n", набор_символов)

plain_text = "Меня зовут Дэйв Адамс. Я живу на 99-й улице. Пожалуйста, пришлите припасы!"

encrypted = cipher_cipher_using_lookup (plain_text, 5, character_set, decrypt = False)

print ("Обычный текст: \ n", простой_текст)

print ("Зашифрованный текст: \ n", зашифрованный) 

Выход:

Здесь мы включили все символы, которые мы обсуждали до сих пор (включая пробел), в кодируемый набор символов.
В результате все (даже пробелы) в нашем обычном тексте было заменено другим символом!
Единственное отличие состоит в том, что перенос происходит не отдельно для строчных или прописных символов, а в целом для всего набора символов.
Это означает, что «Y» со сдвигом на 3 не станет «B», но будет закодировано как «1».

Отрицательное смещение

До сих пор мы делали «положительные» или «правильные» сдвиги символов в процессе шифрования.И процесс дешифрования того же самого включал в себя «отрицательный» сдвиг или «левый сдвиг» символов.
Но что, если мы хотим выполнить процесс шифрования с отрицательным сдвигом? Изменится ли наш алгоритм шифрования-дешифрования?
Да, будет, но ненамного. Единственное изменение, которое нам нужно для сдвига влево, - это сделать знак ключа отрицательным, остальная часть процесса останется прежней и достигнет результата сдвига влево при шифровании и сдвига вправо в процессе дешифрования.

Давайте попробуем это, изменив нашу предыдущую функцию, добавив еще один параметр - ‘shift_type’ к нашей функции cipher_cipher_using_lookup () .

 строка импорта

def cipher_cipher_using_lookup (текст, ключ, символы = строка.ascii_lowercase, decrypt = False, shift_type = "right"):

    если ключ <0:

        print («ключ не может быть отрицательным»)

        return None

    n = len (символы)

    если расшифровать == Истина:

        key = n - ключ

    если shift_type == "left":

        # если требуется сдвиг влево, мы просто инвертируем знак ключа
        ключ = -ключ

    table = str.maketrans (символы, символы [ключ:] + символы [: ключ])

    Translated_text = text.translate (таблица)

    вернуть переведенный_текст 

Давайте протестируем этот модифицированный метод на простом тексте.

 text = "Привет, мир!"

encrypted = cipher_cipher_using_lookup (текст, 3, символы = (string.ascii_lowercase + string.ascii_uppercase), decrypt = False, shift_type = "left")

print ("простой текст:", текст)

print ("зашифрованный текст с отрицательным сдвигом:", зашифрованный) 

Выход:

Обратите внимание, как каждый из символов в нашем обычном тексте сдвинут влево на три позиции.
Давайте теперь проверим процесс дешифрования, используя ту же строку.

 text = "Эбиил Тлоя!"

decrypted = cipher_cipher_using_lookup (текст, 3, символы = (string.ascii_lowercase + string.ascii_uppercase), decrypt = True, shift_type = "left")

print ("зашифрованный текст с отрицательным смещением:", текст)

print ("восстановленный текст:", расшифровано) 

Выход:

Таким образом, мы могли зашифровать и расшифровать текст, используя таблицу поиска и отрицательный ключ.

Шифрование файлов

В этом разделе мы рассмотрим использование Caesar Cipher для шифрования файла.
Обратите внимание, что мы можем шифровать только простые текстовые файлы, но не двоичные файлы, потому что мы знаем набор символов для простых текстовых файлов.
Итак, вы можете зашифровать файл одним из следующих двух подходов:

  1. Прочитать весь файл в строку, зашифровать строку и записать ее в другой файл.
  2. Итеративно считайте файл по одной строке за раз, зашифруйте строку и запишите ее в другой текстовый файл.

Мы воспользуемся вторым подходом, потому что первый применим только для небольших файлов, содержимое которых легко помещается в память.
Итак, давайте определим функцию, которая принимает файл и шифрует его с помощью Caesar Cipher со сдвигом вправо 3. Мы будем использовать набор символов по умолчанию, состоящий из строчных букв.

 def fileCipher (fileName, outputFileName, key = 3, shift_type = "right", decrypt = False):

    с open (fileName, "r") как f_in:

        с open (outputFileName, "w") как f_out:

            # перебираем каждую строку во входном файле
            для строки в f_in:

                # зашифровать / расшифровать строку
                lineNew = cipher_cipher_using_lookup (строка, ключ, дешифровать = дешифровать, shift_type = shift_type)

                # записываем новую строку в выходной файл
                f_out.написать (lineNew)
                    
    print ("Файл {} был успешно переведен и сохранен в {}". format (fileName, outputFileName)) 

Функция принимает имя входного файла, имя выходного файла и параметры шифрования / дешифрования, которые мы видели в предыдущем разделе.

Давайте зашифруем файл « milky_way.txt » (есть вводный абзац на странице «Млечный путь» в Википедии).
Мы выведем зашифрованный файл в « milky_way_encrypted.txt ‘.

Давайте зашифруем его, используя функцию, которую мы определили выше:

 inputFile = "./milky_way.txt"

outputFile = "./milky_way_encrypted.txt"

fileCipher (inputFile, outputFile, key = 3, shift_type = "right", decrypt = False) 

Выход:

Давайте посмотрим, как сейчас выглядит наш зашифрованный файл « milky_way_encrypted.txt »:

 Tkh Mlonb Wdb lv wkh jdodab wkdw frqwdlqv rxu Srodu Sbvwhp, zlwk wkh qdph ghvfulelqj wkh jdodab'v dsshdudqfh iurp Eduwk: d kdcb edqg ri
oljkw vhhq lq wkh qljkw vnb iruphg iurp vwduv wkdw fdqqrw eh lqglylgxdoob glvwlqjxlvkhg eb wkh qdnhg hbh.Tkh whup Mlonb Wdb lv d ...
...
... 

Значит, наша функция правильно шифрует файл.
В качестве упражнения вы можете попробовать функцию дешифрования, передав путь зашифрованного файла в качестве входных данных и установив для параметра «дешифровать» значение True.
Проверьте, сможете ли вы восстановить исходный текст.

Убедитесь, что вы не передаете один и тот же путь к файлу как для ввода, так и для вывода, что может привести к нежелательным результатам, поскольку программа будет выполнять операции чтения и записи в одном файле одновременно.

Множественные смены (шифр Виженера)

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

Например, предположим, что мы используем последовательность из 4 ключей: [1,5,2,3] При использовании этого метода наш 1-й символ в тексте будет сдвинут на одну позицию, второй символ будет сдвинут на пять позиции,
3-й символ на две позиции, 4-й символ на три позиции, а затем снова 5-й символ будет сдвинут на одну позицию и так далее.
Это улучшенная версия Caesar Cipher, которая называется Vigen è re Cipher.

Давайте реализуем шифр Виженера.

 def vigenere_cipher (текст, ключи, decrypt = False):

    # vigenere cipher для строчных букв
    n = len (ключи)

    translatedText = ""

    i = 0 # используется для записи количества обработанных символов нижнего регистра

    # перебираем каждый символ в тексте
    для c в тексте:

        # переводить, только если c в нижнем регистре
        если c.islower ():

            shift = keys [i% n] # решить, какой ключ использовать

            если расшифровать == Истина:

                # если нужно расшифровать, сделайте ключ отрицательным
                shift = -shift

            # Выполните операцию сдвига
            shift_c = chr ((ord (c) - ord ('а') + сдвиг)% 26 + ord ('а'))

            TranslatedText + = сдвинутый_c

            я + = 1

        еще:

            TranslatedText + = c
            
    вернуть переведенный текст 

Функция выполняет как шифрование, так и дешифрование, в зависимости от значения логического параметра «дешифровать».
Мы ведем подсчет общего количества строчных букв, закодированных / декодированных с использованием переменной i, мы используем это с оператором по модулю, чтобы определить, какой ключ из списка будет использоваться следующим.
Обратите внимание, что мы сделали операцию смены очень компактной; это эквивалентно многоступенчатому процессу преобразования между Unicode и символьными значениями и вычислению сдвига, который мы видели ранее.

Давайте проверим эту функцию, используя другой простой текст:

 text = "мы будем называть первую пилотируемую лунную миссию Проектом Аполлон"

encrypted_text = vigenere_cipher (текст, [1,2,3])

print ("Обычный текст: \ n", текст)

print ("Зашифрованный текст: \ n", encrypted_text) 

Выход:

Здесь мы выполняем шифрование с использованием ключей [1,2,3] и, как и ожидалось, первый символ 'w' был сдвинут на одну позицию в 'x',
второй символ 'e' был сдвинут на две позиции до «г»; третий символ «w» сдвинут на три позиции в «z».
Этот процесс повторяется с последующими символами.
Выполните процесс расшифровки с теми же ключами и посмотрите, сможете ли вы восстановить исходный оператор.

Почему Caesar Cipher слаб?

Каким бы простым он ни был для понимания и реализации шифра Цезаря, он упрощает расшифровку для всех без особых усилий.
Caesar Cipher - это метод подстановочного шифра, при котором мы заменяем каждый символ в тексте некоторым фиксированным символом.

Если кто-то определит регулярность и закономерность появления определенных символов в зашифрованном тексте, он быстро определит, что для шифрования текста использовался шифр Цезаря.
После того, как вы убедились, что для шифрования текста использовалась техника Caesar Cipher, восстановление исходного текста без владения ключом становится легкой прогулкой.
Простой алгоритм BruteForce находит исходный текст за ограниченное время.

Атака BruteForce

Взлом зашифрованного текста, закодированного с помощью Caesar Cipher, - это всего лишь опробование всех возможных ключей.
Это возможно, потому что может быть только ограниченное количество ключей, которые могут генерировать уникальный зашифрованный текст.

Например, если в зашифрованном тексте закодирован весь текст в нижнем регистре, все, что нам нужно сделать, это запустить этап дешифрования со значениями ключей от 0 до 25.
Даже если пользователь предоставил ключ больше 25, он создаст зашифрованный текст, который совпадает с одним из тех, которые сгенерированы с использованием ключей от 0 до 25.

Давайте проверим зашифрованный текст, в котором все символы нижнего регистра закодированы, и посмотрим, сможем ли мы извлечь из него разумный текст с помощью атаки BruteForce.
Текст у нас под рукой:

 "кс gvozz ohhoqy hvsa tfca hvs tfcbh oh bccb cb Tisgrom" 

Давайте сначала определим функцию дешифрования, которая принимает зашифрованный текст и ключ и расшифровывает все его строчные буквы.

 def cipher_decrypt_lower (зашифрованный текст, ключ):

    decrypted = ""

    для c в зашифрованном тексте:

        если c.islower ():

            c_index = ord (c) - ord ('а')

            c_og_pos = (c_index - ключ)% 26 + ord ('a')

            c_og = chr (c_og_pos)

            расшифрованный + = c_og

        еще:

            расшифровано + = c

    вернуть расшифрованный 

Теперь у нас есть текст, но мы не знаем ключа i.е., величина сдвига. Давайте напишем атаку грубой силы, которая перебирает все ключи от 0 до 25 и отображает каждую из расшифрованных строк:

 cryptic_text = "ks gvozz ohhoqy hvsa tfca hvs tfcbh oh bccb cb Tisgrom"

для i в диапазоне (0,26):

    plain_text = cipher_decrypt_lower (cryptic_text, я)

    print ("Для ключа {}, расшифрованный текст: {}". format (i, plain_text)) 

Выход:

В выводе перечислены все строки, которые можно сгенерировать при расшифровке.
Если вы посмотрите внимательно, строка с ключом 14 является допустимым английским утверждением и, следовательно, является правильным выбором.

Теперь вы знаете, как взломать зашифрованный текст Caesar Cipher.
Мы могли бы использовать другие, более сильные варианты шифра Цезаря, например, использование нескольких сдвигов (шифр Виженера), но даже в этих случаях решительные злоумышленники могут легко вычислить правильное дешифрование.
Итак, алгоритм Caesar Cipher относительно намного слабее, чем современные алгоритмы шифрования.

Заключение

В этом руководстве мы узнали, что такое Caesar Cipher, как легко реализовать его на Python и как его реализацию можно оптимизировать с помощью того, что мы называем «поисковыми таблицами».
Мы написали функцию Python для реализации универсального алгоритма шифрования / дешифрования Caesar Cipher, который принимает различные пользовательские данные в качестве параметра без особых предположений.

Затем мы рассмотрели, как зашифровать файл с помощью Caesar Cipher, а затем как можно усилить Caesar Cipher с помощью нескольких сдвигов.
Наконец, мы рассмотрели, насколько уязвим Caesar Cipher для атак BruteForce.

Основатель LikeGeeks. Я работаю системным администратором Linux с 2010 года. Я отвечаю за обслуживание, защиту и устранение неполадок серверов Linux для множества клиентов по всему миру.Я люблю писать сценарии оболочки и Python для автоматизации моей работы.

% PDF-1.6 % 11318 0 obj> endobj xref 11318 947 0000000016 00000 н. 0000027985 00000 п. 0000028190 00000 п. 0000028220 00000 п. 0000028270 00000 п. 0000028403 00000 п. 0000028441 00000 п. 0000028597 00000 п. 0000028687 00000 п. 0000028772 00000 п. 0000028860 00000 п. 0000028949 00000 п. 0000029037 00000 н. 0000029126 00000 п. 0000029214 00000 п. 0000029303 00000 п. 0000029391 00000 п. 0000029480 00000 п. 0000029568 00000 п. 0000029657 00000 п. 0000029745 00000 п. 0000029834 00000 п. 0000029922 00000 н. 0000030011 00000 п. 0000030099 00000 п. 0000030188 00000 п. 0000030276 00000 п. 0000030365 00000 п. 0000030453 00000 п. 0000030542 00000 п. 0000030630 00000 п. 0000030719 00000 п. 0000030807 00000 п. 0000030896 00000 п. 0000030984 00000 п. 0000031073 00000 п. 0000031161 00000 п. 0000031250 00000 п. 0000031338 00000 п. 0000031427 00000 п. 0000031515 00000 п. 0000031604 00000 п. 0000031692 00000 п. 0000031781 00000 п. 0000031869 00000 п. 0000031958 00000 п. 0000032046 00000 п. 0000032135 00000 п. 0000032223 00000 п. 0000032312 00000 п. 0000032400 00000 п. 0000032489 00000 н. 0000032577 00000 п. 0000032666 00000 п. 0000032754 00000 п. 0000032843 00000 п. 0000032931 00000 п. 0000033020 00000 н. 0000033108 00000 п. 0000033197 00000 п. 0000033285 00000 п. 0000033374 00000 п. 0000033462 00000 п. 0000033551 00000 п. 0000033639 00000 п. 0000033728 00000 п. 0000033816 00000 п. 0000033905 00000 п. 0000033993 00000 п. 0000034082 00000 п. 0000034170 00000 п. 0000034259 00000 п. 0000034347 00000 п. 0000034436 00000 п. 0000034524 00000 п. 0000034613 00000 п. 0000034701 00000 п. 0000034790 00000 н. 0000034878 00000 п. 0000034967 00000 п. 0000035055 00000 п. 0000035144 00000 п. 0000035232 00000 п. 0000035321 00000 п. 0000035409 00000 п. 0000035498 00000 п. 0000035586 00000 п. 0000035675 00000 п. 0000035763 00000 п. 0000035852 00000 п. 0000035940 00000 п. 0000036029 00000 п. 0000036117 00000 п. 0000036206 00000 п. 0000036294 00000 п. 0000036383 00000 п. 0000036471 00000 п. 0000036560 00000 п. 0000036648 00000 н. 0000036737 00000 п. 0000036825 00000 п. 0000036914 00000 п. 0000037002 00000 п. 0000037091 00000 п. 0000037179 00000 п. 0000037268 00000 п. 0000037356 00000 п. 0000037445 00000 п. 0000037533 00000 п. 0000037622 00000 п. 0000037710 00000 п. 0000037799 00000 н. 0000037887 00000 п. 0000037976 00000 п. 0000038064 00000 п. 0000038153 00000 п. 0000038241 00000 п. 0000038330 00000 п. 0000038418 00000 п. 0000038507 00000 п. 0000038595 00000 п. 0000038684 00000 п. 0000038772 00000 п. 0000038861 00000 п. 0000038949 00000 п. 0000039038 00000 п. 0000039126 00000 п. 0000039215 00000 п. 0000039303 00000 п. 0000039392 00000 п. 0000039480 00000 п. 0000039569 00000 п. 0000039657 00000 п. 0000039746 00000 п. 0000039834 00000 п. 0000039923 00000 н. 0000040011 00000 п. 0000040100 00000 п. 0000040188 00000 п. 0000040277 00000 п. 0000040365 00000 п. 0000040454 00000 п. 0000040542 00000 п. 0000040631 00000 п. 0000040719 00000 п. 0000040808 00000 п. 0000040896 00000 п. 0000040985 00000 п. 0000041073 00000 п. 0000041162 00000 п. 0000041250 00000 п. 0000041339 00000 п. 0000041427 00000 п. 0000041516 00000 п. 0000041604 00000 п. 0000041693 00000 п. 0000041781 00000 п. 0000041870 00000 п. 0000041958 00000 п. 0000042047 00000 п. 0000042135 00000 п. 0000042224 00000 п. 0000042312 00000 п. 0000042401 00000 п. 0000042489 00000 п. 0000042578 00000 п. 0000042666 00000 п. 0000042755 00000 п. 0000042843 00000 п. 0000042932 00000 п. 0000043020 00000 п. 0000043109 00000 п. 0000043197 00000 п. 0000043286 00000 п. 0000043374 00000 п. 0000043463 00000 п. 0000043551 00000 п. 0000043640 00000 п. 0000043728 00000 п. 0000043817 00000 п. 0000043905 00000 п. 0000043994 00000 п. 0000044082 00000 п. 0000044171 00000 п. 0000044259 00000 п. 0000044348 00000 п. 0000044436 00000 п. 0000044525 00000 п. 0000044613 00000 п. 0000044702 00000 п. 0000044790 00000 н. 0000044879 00000 п. 0000044967 00000 п. 0000045056 00000 п. 0000045144 00000 п. 0000045233 00000 п. 0000045321 00000 п. 0000045410 00000 п. 0000045498 00000 п. 0000045587 00000 п. 0000045675 00000 п. 0000045764 00000 п. 0000045852 00000 п. 0000045941 00000 п. 0000046029 00000 п. 0000046118 00000 п. 0000046206 00000 п. 0000046295 00000 п. 0000046383 00000 п. 0000046472 00000 н. 0000046560 00000 п. 0000046649 00000 п. 0000046737 00000 п. 0000046826 00000 п. 0000046914 00000 п. 0000047003 00000 п. 0000047091 00000 п. 0000047180 00000 п. 0000047268 00000 п. 0000047357 00000 п. 0000047445 00000 п. 0000047534 00000 п. 0000047622 00000 п. 0000047711 00000 п. 0000047799 00000 н. 0000047888 00000 п. 0000047976 00000 п. 0000048065 00000 п. 0000048153 00000 п. 0000048242 00000 н. 0000048330 00000 н. 0000048419 00000 п. 0000048507 00000 п. 0000048596 00000 н. 0000048684 00000 п. 0000048773 00000 п. 0000048861 00000 п. 0000048950 00000 п. 0000049038 00000 п. 0000049127 00000 п. 0000049215 00000 п. 0000049304 00000 п. 0000049392 00000 п. 0000049481 00000 п. 0000049569 00000 п. 0000049658 00000 п. 0000049746 00000 п. 0000049835 00000 п. 0000049923 00000 н. 0000050012 00000 п. 0000050100 00000 н. 0000050189 00000 п. 0000050277 00000 п. 0000050366 00000 п. 0000050454 00000 п. 0000050543 00000 п. 0000050631 00000 п. 0000050720 00000 п. 0000050808 00000 п. 0000050897 00000 п. 0000050985 00000 п. 0000051074 00000 п. 0000051162 00000 п. 0000051251 00000 п. 0000051339 00000 п. 0000051428 00000 п. 0000051516 00000 п. 0000051605 00000 п. 0000051693 00000 п. 0000051782 00000 п. 0000051870 00000 п. 0000051959 00000 п. 0000052047 00000 п. 0000052136 00000 п. 0000052224 00000 п. 0000052313 00000 п. 0000052401 00000 п. 0000052490 00000 п. 0000052578 00000 п. 0000052667 00000 п. 0000052755 00000 п. 0000052844 00000 п. 0000052932 00000 п. 0000053021 00000 п. 0000053109 00000 п. 0000053198 00000 п. 0000053286 00000 п. 0000053375 00000 п. 0000053463 00000 п. 0000053552 00000 п. 0000053640 00000 п. 0000053729 00000 п. 0000053817 00000 п. 0000053906 00000 п. 0000053994 00000 п. 0000054083 00000 п. 0000054171 00000 п. 0000054260 00000 п. 0000054348 00000 п. 0000054437 00000 п. 0000054525 00000 п. 0000054614 00000 п. 0000054702 00000 п. 0000054791 00000 п. 0000054879 00000 п. 0000054968 00000 п. 0000055056 00000 п. 0000055145 00000 п. 0000055233 00000 п. 0000055322 00000 п. 0000055410 00000 п. 0000055499 00000 п. 0000055587 00000 п. 0000055676 00000 п. 0000055764 00000 п. 0000055853 00000 п. 0000055941 00000 п. 0000056030 00000 п. 0000056118 00000 п. 0000056207 00000 п. 0000056295 00000 п. 0000056384 00000 п. 0000056472 00000 п. 0000056561 00000 п. 0000056649 00000 п. 0000056738 00000 п. 0000056826 00000 п. 0000056915 00000 п. 0000057003 00000 п. 0000057092 00000 п. 0000057180 00000 п. 0000057269 00000 п. 0000057357 00000 п. 0000057446 00000 п. 0000057534 00000 п. 0000057623 00000 п. 0000057711 00000 п. 0000057800 00000 п. 0000057888 00000 п. 0000057977 00000 п. 0000058065 00000 п. 0000058154 00000 п. 0000058242 00000 п. 0000058331 00000 п. 0000058419 00000 п. 0000058508 00000 п. 0000058596 00000 п. 0000058685 00000 п. 0000058773 00000 п. 0000058862 00000 п. 0000058950 00000 п. 0000059039 00000 п. 0000059127 00000 п. 0000059216 00000 п. 0000059304 00000 п. 0000059393 00000 п. 0000059481 00000 п. 0000059570 00000 п. 0000059658 00000 п. 0000059747 00000 п. 0000059835 00000 п. 0000059924 00000 н. 0000060012 00000 п. 0000060101 00000 п. 0000060189 00000 п. 0000060278 00000 п. 0000060366 00000 п. 0000060455 00000 п. 0000060543 00000 п. 0000060632 00000 п. 0000060720 00000 п. 0000060809 00000 п. 0000060897 00000 п. 0000060986 00000 п. 0000061074 00000 п. 0000061163 00000 п. 0000061251 00000 п. 0000061340 00000 п. 0000061428 00000 п. 0000061517 00000 п. 0000061605 00000 п. 0000061694 00000 п. 0000061782 00000 п. 0000061871 00000 п. 0000061959 00000 п. 0000062048 00000 п. 0000062136 00000 п. 0000062225 00000 п. 0000062313 00000 п. 0000062402 00000 п. 0000062490 00000 п. 0000062579 00000 п. 0000062667 00000 п. 0000062756 00000 п. 0000062844 00000 п. 0000062933 00000 п. 0000063021 00000 п. 0000063110 00000 п. 0000063198 00000 п. 0000063287 00000 п. 0000063375 00000 п. 0000063464 00000 п. 0000063552 00000 п. 0000063641 00000 п. 0000063729 00000 п. 0000063818 00000 п. 0000063906 00000 п. 0000063995 00000 п. 0000064083 00000 п. 0000064172 00000 п. 0000064260 00000 п. 0000064349 00000 п. 0000064437 00000 п. 0000064526 00000 п. 0000064614 00000 п. 0000064703 00000 п. 0000064791 00000 п. 0000064880 00000 п. 0000064968 00000 н. 0000065057 00000 п. 0000065145 00000 п. 0000065234 00000 п. 0000065322 00000 п. 0000065411 00000 п. 0000065499 00000 п. 0000065588 00000 п. 0000065676 00000 п. 0000065765 00000 п. 0000065853 00000 п. 0000065942 00000 п. 0000066030 00000 п. 0000066119 00000 п. 0000066207 00000 п. 0000066296 00000 п. 0000066384 00000 п. 0000066473 00000 п. 0000066561 00000 п. 0000066650 00000 п. 0000066738 00000 п. 0000066827 00000 н. 0000066915 00000 п. 0000067004 00000 п. 0000067092 00000 п. 0000067181 00000 п. 0000067269 00000 п. 0000067357 00000 п. 0000067444 00000 п. 0000067532 00000 п. 0000067619 00000 п. 0000067707 00000 п. 0000067794 00000 п. 0000067882 00000 п. 0000067969 00000 п. 0000068057 00000 п. 0000068144 00000 п. 0000068232 00000 п. 0000068319 00000 п. 0000068407 00000 п. 0000068495 00000 п. 0000068583 00000 п. 0000068670 00000 п. 0000068758 00000 п. 0000068845 00000 п. 0000068933 00000 п. 0000069020 00000 н. 0000069108 00000 п. 0000069195 00000 п. 0000069283 00000 п. 0000069370 00000 п. 0000069458 00000 п. 0000069545 00000 п. 0000069633 00000 п. 0000069720 00000 п. 0000069808 00000 п. 0000069895 00000 п. 0000069983 00000 н. 0000070070 00000 п. 0000070158 00000 п. 0000070245 00000 п. 0000070333 00000 п. 0000070420 00000 п. 0000070508 00000 п. 0000070595 00000 п. 0000070683 00000 п. 0000070770 00000 п. 0000070858 00000 п. 0000070945 00000 п. 0000071033 00000 п. 0000071120 00000 п. 0000071208 00000 п. 0000071295 00000 п. 0000071383 00000 п. 0000071470 00000 п. 0000071558 00000 п. 0000071645 00000 п. 0000071733 00000 п. 0000071820 00000 п. 0000071908 00000 п. 0000071995 00000 п. 0000072083 00000 п. 0000072170 00000 п. 0000072258 00000 п. 0000072345 00000 п. 0000072433 00000 п. 0000072520 00000 п. 0000072608 00000 п. 0000072695 00000 п. 0000072783 00000 п. 0000072870 00000 п. 0000072958 00000 п. 0000073045 00000 п. 0000073133 00000 п. 0000073220 00000 н. 0000073308 00000 п. 0000073395 00000 п. 0000073483 00000 п. 0000073570 00000 п. 0000073658 00000 п. 0000073745 00000 п. 0000073833 00000 п. 0000073920 00000 п. 0000074008 00000 п. 0000074095 00000 п. 0000074183 00000 п. 0000074270 00000 п. 0000074358 00000 п. 0000074445 00000 п. 0000074533 00000 п. 0000074620 00000 п. 0000074708 00000 п. 0000074795 00000 п. 0000074883 00000 п. 0000074970 00000 п. 0000075058 00000 п. 0000075145 00000 п. 0000075233 00000 п. 0000075320 00000 п. 0000075408 00000 п. 0000075495 00000 п. 0000075583 00000 п. 0000075670 00000 п. 0000075758 00000 п. 0000075845 00000 п. 0000075933 00000 п. 0000076020 00000 п. 0000076108 00000 п. 0000076195 00000 п. 0000076283 00000 п. 0000076370 00000 п. 0000076458 00000 п. 0000076545 00000 п. 0000076633 00000 п. 0000076720 00000 п. 0000076808 00000 п. 0000076895 00000 п. 0000076983 00000 п. 0000077070 00000 п. 0000077158 00000 п. 0000077245 00000 п. 0000077333 00000 п. 0000077420 00000 п. 0000077508 00000 п. 0000077595 00000 п. 0000077683 00000 п. 0000077770 00000 п. 0000077858 00000 п. 0000077945 00000 п. 0000078033 00000 п. 0000078120 00000 п. 0000078208 00000 п. 0000078295 00000 п. 0000078383 00000 п. 0000078470 00000 п. 0000078558 00000 п. 0000078645 00000 п. 0000078733 00000 п. 0000078820 00000 н. 0000078908 00000 п. 0000078995 00000 п. 0000079083 00000 п. 0000079170 00000 п. 0000079258 00000 п. 0000079346 00000 п. 0000079433 00000 п. 0000079521 00000 п. 0000079608 00000 п. 0000079696 00000 п. 0000079783 00000 п. 0000079871 00000 п. 0000079958 00000 н. 0000080046 00000 п. 0000080133 00000 п. 0000080221 00000 п. 0000080308 00000 п. 0000080396 00000 п. 0000080483 00000 п. 0000080571 00000 п. 0000080658 00000 п. 0000080746 00000 п. 0000080833 00000 п. 0000080921 00000 п. 0000081008 00000 п. 0000081096 00000 п. 0000081183 00000 п. 0000081271 00000 п. 0000081358 00000 п. 0000081446 00000 п. 0000081533 00000 п. 0000081621 00000 п. 0000081708 00000 п. 0000081796 00000 п. 0000081883 00000 п. 0000081971 00000 п. 0000082058 00000 п. 0000082146 00000 п. 0000082233 00000 п. 0000082321 00000 п. 0000082408 00000 п. 0000082496 00000 п. 0000082584 00000 п. 0000082671 00000 п. 0000082759 00000 п. 0000082846 00000 п. 0000082934 00000 п. 0000083022 00000 п. 0000083109 00000 п. 0000083197 00000 п. 0000083284 00000 п. 0000083372 00000 п. 0000083459 00000 п. 0000083547 00000 п. 0000083634 00000 п. 0000083722 00000 п. 0000083809 00000 п. 0000083897 00000 п. 0000083984 00000 п. 0000084072 00000 п. 0000084159 00000 п. 0000084247 00000 п. 0000084334 00000 п. 0000084422 00000 п. 0000084509 00000 п. 0000084597 00000 п. 0000084684 00000 п. 0000084772 00000 п. 0000084859 00000 п. 0000084947 00000 п. 0000085034 00000 п. 0000085122 00000 п. 0000085209 00000 п. 0000085297 00000 п. 0000085384 00000 п. 0000085472 00000 п. 0000085559 00000 п. 0000085647 00000 п. 0000085735 00000 п. 0000085822 00000 п. 0000085910 00000 п. 0000085997 00000 п. 0000086085 00000 п. 0000086173 00000 п. 0000086261 00000 п. 0000086348 00000 п. 0000086436 00000 п. 0000086523 00000 п. 0000086610 00000 п. 0000086696 00000 п. 0000086782 00000 п. 0000086929 00000 п. 0000087466 00000 п. 0000087506 00000 п. 0000087585 00000 п. 00000

00000 п. 00000

00000 п. 00000

00000 п. 00000

00000 п. 00000

00000 п. 0000093429 00000 п. 0000093945 00000 п. 0000094301 00000 п. 0000094622 00000 п. 0000098836 00000 п. 0000099375 00000 п. 0000103226 00000 н. 0000103704 00000 н. 0000104049 00000 н. 0000104327 00000 н. 0000106999 00000 н. 0000107063 00000 н. 0000107181 00000 п. 0000107312 00000 н. 0000107451 00000 п. 0000107586 00000 п. 0000107739 00000 п. 0000107887 00000 н. 0000108025 00000 н. 0000108172 00000 н. 0000108326 00000 н. 0000108430 00000 н. 0000108573 00000 п. 0000108730 00000 н. 0000108837 00000 н. 0000108941 00000 н. 0000109093 00000 н. 0000109233 00000 п. 0000109376 00000 п. 0000109502 00000 н. 0000109668 00000 н. 0000109772 00000 п. 0000109879 00000 п. 0000110045 00000 н. 0000110145 00000 н. 0000110296 00000 п. 0000110393 00000 п. 0000110508 00000 н. 0000110626 00000 н. 0000110742 00000 н. 0000110866 00000 н. 0000110969 00000 н. 0000111066 00000 н. 0000111179 00000 п. 0000111301 00000 н. 0000111420 00000 н. 0000111537 00000 н. 0000111673 00000 н. 0000111774 00000 н. 0000111885 00000 н. 0000112001 00000 н. 0000112149 00000 н. 0000112253 00000 н. 0000112361 00000 н. 0000112483 00000 н. 0000112574 00000 н. 0000112682 00000 н. 0000112789 00000 н. 0000112948 00000 н. 0000113059 00000 н. 0000113168 00000 н. 0000113294 00000 н. 0000113416 00000 н. 0000113518 00000 н. 0000113631 00000 н. 0000113794 00000 н. 0000113927 00000 н. 0000114041 00000 н. 0000114163 00000 н. 0000114314 00000 н. 0000114422 00000 н. 0000114522 00000 н. 0000114641 00000 п. 0000114789 00000 н. 0000114888 00000 н. 0000114989 00000 н. 0000115117 00000 н. 0000115240 00000 н. 0000115353 00000 п. 0000115474 00000 н. 0000115590 00000 н. 0000115714 00000 н. 0000115836 00000 н. 0000115957 00000 н. 0000116071 00000 н. 0000116193 00000 н. 0000116312 00000 н. 0000116440 00000 н. 0000116540 00000 н. 0000116643 00000 н. 0000116759 00000 н. 0000116885 00000 н. 0000117005 00000 н. 0000117128 00000 н. 0000117245 00000 н. 0000117359 00000 н. 0000117474 00000 н. 0000117591 00000 н. 0000117717 00000 н. 0000117843 00000 н. 0000117964 00000 н. 0000118083 00000 н. 0000118216 00000 н. 0000118330 00000 н. 0000118442 00000 н. 0000118556 00000 н. 0000118669 00000 н. 0000118773 00000 н. 0000118917 00000 н. 0000119015 00000 н. 0000119126 00000 н. 0000119246 00000 н. 0000119361 00000 п. 0000119486 00000 н. 0000119602 00000 н. 0000119716 00000 н. 0000119812 00000 н. 0000119911 00000 н. 0000120035 00000 н. 0000120196 00000 н. 0000120303 00000 н. 0000120450 00000 н. 0000120612 00000 н. 0000120756 00000 н. 0000120882 00000 н. 0000121042 00000 н. 0000121164 00000 н. 0000121282 00000 н. 0000121402 00000 н. 0000121560 00000 н. 0000121652 00000 н. 0000121776 00000 н. 0000121901 00000 н. 0000122016 00000 н. 0000122132 00000 н. 0000122250 00000 н. 0000122371 00000 н. 0000122460 00000 н. 0000122574 00000 н. 0000122705 00000 н. 0000122816 00000 н. 0000122938 00000 н. 0000123059 00000 н. 0000123177 00000 н. 0000123292 00000 н. 0000123418 00000 н. 0000123527 00000 н. 0000123634 00000 н. 0000123752 00000 н. 0000123858 00000 н. 0000123970 00000 н. 0000124077 00000 н. 0000124182 00000 н. 0000124304 00000 н. 0000124440 00000 н. 0000124574 00000 н. 0000124682 00000 н. 0000124788 00000 н. 0000124898 00000 н. 0000125008 00000 н. 0000125137 00000 н. 0000125245 00000 н. 0000125353 00000 н. 0000125462 00000 н. 0000125576 00000 н. 0000125723 00000 н. 0000125830 00000 н. 0000125943 00000 н. 0000126056 00000 н. 0000126161 00000 н. 0000126277 00000 н. 0000126403 00000 н. 0000126512 00000 н. 0000126618 00000 н. 0000126758 00000 н. 0000126864 00000 н. 0000127012 00000 н. 0000127119 00000 н. 0000127228 00000 н. 0000127334 00000 н. 0000127443 00000 н. 0000127552 00000 н. 0000127661 00000 н. 0000127776 00000 н. 0000127883 00000 н. 0000128016 00000 н. 0000128123 00000 н. 0000128229 00000 н. 0000128388 00000 н. 0000128494 00000 н. 0000128611 00000 н. 0000128721 00000 н. 0000128830 00000 н. 0000128938 00000 н. 0000129051 00000 н. 0000129162 00000 н. 0000129275 00000 н. 0000129386 00000 н. 0000129495 00000 н. 0000129605 00000 н. 0000129714 00000 н. 0000129822 00000 н. 0000129931 00000 н. 0000130042 00000 н. 0000130155 00000 н. 0000130267 00000 н. 0000130378 00000 н. 0000130490 00000 н. 0000130602 00000 н. 0000130711 00000 н. 0000130823 00000 п. 0000130932 00000 н. 0000131050 00000 н. 0000131163 00000 н. 0000131272 00000 н. 0000131383 00000 н. 0000131493 00000 н. 0000131602 00000 н. 0000131714 00000 н. 0000131826 00000 н. 0000131941 00000 н. 0000132048 00000 н. 0000132158 00000 н. 0000132269 00000 н. 0000132378 00000 н. 0000132491 00000 п. 0000132601 00000 н. 0000132712 00000 н. 0000132828 00000 н. 0000132952 00000 н. 0000133073 00000 н. 0000133187 00000 п. 0000133307 00000 н. 0000133418 00000 н. 0000133535 00000 н. 0000133653 00000 п. 0000133773 00000 н. 0000133900 00000 н. 0000134020 00000 н. 0000134140 00000 н. 0000134246 00000 н. 0000134353 00000 п. 0000134467 00000 н. 0000134576 00000 н. 0000134690 00000 н. 0000134801 00000 н. 0000134913 00000 н. 0000135025 00000 н. 0000135136 00000 н. 0000135247 00000 н. 0000135360 00000 н. 0000135472 00000 н. 0000135583 00000 н. 0000135693 00000 п. 0000135803 00000 н. 0000135914 00000 н. 0000136023 00000 н. 0000136133 00000 п. 0000136241 00000 н. 0000136390 00000 н. 0000136491 00000 н. 0000136583 00000 н. 0000136695 00000 н. 0000136793 00000 н. 0000136942 00000 н. 0000137066 00000 н. 0000137159 00000 н. 0000137268 00000 н. 0000137403 00000 н. 0000019236 00000 п. трейлер ] >> startxref 0 %% EOF 12264 0 obj> поток х = t չ 3 K ~ vCBL²! ٤INpWMaTavA4t6h6EKn4 n "* FJqkmDRM ܹ3 srzN; d3? ~ E (SO) e ׬28 K ם o; bG:] ᔦX, = Ϳ [Ļj" zU] 88JT 6 "nf] E!" \ + (PhFE ᨌ ҆Cxe * -.u5% gWz ~ c},} a9; = k ޳ V ش ꉍ &% 29 CAb96: Y ی eiiF ڳ. MI.D {* TCoÐ.IO * @ "R9 @ wCu &? UdU & lO ե 7 ~ / DSk344W | &: K5 | Q᫞)! AUtSb6_-UOzR ~ O0VP`] Wƪe6 = N3 $ k-TëK`nG] & Xw-Qy [d

Взломайте Код! Сделайте шифр Цезаря

Ключевые концепции
Выкройки
Код
Пазлы
Криптография

Введение
Если вам нужно отправить секретное сообщение другу, как вы можете помешать другим людям его прочитать? Один из способов - зашифровать сообщение, то есть использовать секретный код, который знаете только вы и ваш друг.Попробуйте это упражнение, чтобы узнать, как создать свой собственный «шифр Цезаря» - популярный тип кода, который легко изучить.

Фон
Криптография - это исследование написания или решения секретных кодов, которые используются для безопасного общения. Исторически сложилось так, что коды использовались политиками, шпионами и странами в состоянии войны, чтобы помешать своим врагам узнать, что они затевают. Многие из самых ранних кодов или «шифров», таких как тот, который вы создадите в этом проекте, было легко создать вручную.Теперь криптография имеет важное значение в информатике для обеспечения безопасности всего, от электронной почты до информации о банковских счетах.

Шифр ​​Цезаря, названный в честь римского императора Юлия Цезаря, является одним из самых ранних и широко известных шифров. Это простая форма «шифра подстановки», где вы заменяете каждую букву алфавита другой буквой, сдвигая весь алфавит на определенное количество букв (переход к началу, когда вы дойдете до конца). Например, это будет ваш ключ и код, если вы сдвинете каждую букву на три пробела:

Обычная: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Шифр: XYZABCDEFGHIJKLMNOPQRSTUVW

Итак, когда вы пишете свое сообщение, буква A заменяется на X, B заменяется на Y и так далее.Например, слово «ПРИВЕТ» читается так:

.

Обычный: HELLO
Шифр: EBIIL

Чтобы расшифровать ваше сообщение, вам нужно поделиться «ключом» (цифрой 3) с вашим другом. После этого вы можете отправлять сообщения, написанные в зашифрованном виде, чтобы другие люди не могли их прочитать!

Материалы

  • Карандаш и бумага
  • Как минимум еще один человек

Подготовка

  • Расскажите другу о концепции шифра Цезаря или попросите его прочитать справочный раздел этого упражнения.
  • Запишите алфавит от А до Я.
  • Выберите число от 1 до 25. (Если вы используете 26, вы просто получите исходный алфавит.) Это число - ваш ключ.

Процедура

  • Сдвиньте весь алфавит на выбранное число и запишите его под исходным алфавитом (как показано выше).
  • Выберите сообщение, которое хотите написать другу. Возможно, проще всего будет начать с простого сообщения (например, одного слова или фразы), прежде чем пробовать более длинные предложения или абзацы.
  • Запишите закодированное сообщение, используя сдвинутый алфавит. Если это помогает, сначала запишите свое текстовое сообщение, а затем кодируйте его по одной букве за раз (например, пример «привет» выше). Просто убедитесь, что на листке бумаги, который вы даете другу, есть только закодированное сообщение!
  • Дайте другу зашифрованное сообщение, а сообщите ему ключ . Как вы думаете, почему вы не хотите записывать ключ?
  • Посмотрите, сможет ли ваш друг расшифровать ваше сообщение.Если это поможет с первой попытки, позвольте им работать в обратном направлении, используя записанный вами исходный и сдвинутый алфавиты. Используя пример из фона, буква x становится a; y становится b; и так далее.
  • Попробуйте переключить и использовать другой ключ для тех же сообщений. А что, взломать легче?
  • Extra: Попробуйте найти третьего человека, который не знает, что такое шифр Цезаря. Могут ли они взломать ваш код, если они «перехватят» ваше сообщение?
  • Extra: Что делать, если человек, который перехватывает ваше сообщение, знает о шифрах Цезаря? Это упрощает взлом кода? Поскольку существует только 25 возможных ключей, шифры Цезаря очень уязвимы для атаки «грубой силы», когда декодер просто пробует каждую возможную комбинацию букв.Это может потребовать некоторого терпения, если это делает человек, но в настоящее время компьютеры могут разгадывать код за доли секунды, поэтому шифры Цезаря не считаются безопасным методом для шифрования электронных сообщений.
  • Extra: Еще один способ взломать шифр Цезаря - это «частотный анализ», который основан на том факте, что в естественной английской речи и письме одни буквы появляются гораздо чаще, чем другие. Например, буква E встречается чаще, чем любая другая, а Z - реже всего.(Если вы когда-либо играли в настольную игру Scrabble, вы могли заметить, что это определяет, сколько очков стоит букв!) Так, например, если вы прочитали весь абзац и заметили, что буква D появляется чаще, чем любая другая, шансы заключаются в том, что он использовал шифр Цезаря со сдвигом на 1 (что сделало E в коде D). Этот метод будет более точным для длинных блоков текста и очень неточным для коротких слов или фраз, потому что есть много слов, которые вообще не содержат E. Можете ли вы попросить друга написать целый абзац шифром Цезаря, а затем попытаться взломать его с помощью частотного анализа?
  • Extra: Если вы планируете использовать шифр Цезаря для регулярной связи, есть риск, что в конечном итоге кто-то обнаружит ваш ключ.Вы можете предотвратить это, меняя ключ, например, используя новый каждую неделю. Это похоже на периодическую смену паролей вашего компьютера.
  • Дополнительно: Шифр ​​Цезаря - это всего лишь один из типов шифра подстановки. Найдите другие типы подстановочных шифров и испытайте их. Их сложнее или проще использовать и взламывать?

Наблюдения и результаты
Как только вы и ваш друг поймете, как использовать шифр Цезаря, будет относительно легко отправлять зашифрованные сообщения друг другу.Это может быть интересным способом передавать секретные сообщения между друзьями. Однако, как обсуждалось выше, хотя шифр Цезаря представляет собой отличное введение в криптографию, в компьютерную эпоху он больше не является безопасным способом отправки зашифрованных сообщений в электронном виде.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Theme: Overlay by Kaira Extra Text
Cape Town, South Africa