Пятница, 03.05.2024, 05:35
Блог учителя информатики и математики
О блогеМой профильРегистрацияВыходВход
Вы вошли как Гость · Группа "Гости" Приветствую Вас, Гость · RSS
Меню блога
Погода в нашем районе.

НАГРАДА

Как Вы считаете, должны ли дети ходить в школу в школьной форме?
Всего ответов: 2807
 
 Блог учителя
Главная » Статьи » Информатика » В помощь ученику

Система шифрования Цезаря.

Система шифрования Цезаря. При шифровании каждая буква открытого текста заменяется на другую букву того же алфавита путем смещения по алфавиту от исходной буквы на K букв. Таким образом K – ключ системы Цезаря. Если при смещении выходим за пределы алфавита, то выполняется циклический переход к его началу.

Пример 7. Зашифруем слово «ЦЕЗАРЬ» с помощью системы Цезаря при смещении K=5.

Данный шифр можно задать таблицей замен букв открытого текста на буквы шифртекста (табл. 1). С помощью полученной таблицы заменяем каждую букву слова «ЦЕЗАРЬ». В результате получаем шифртекст «ЫКМЕХБ».

Таблица 1. Одноалфавитные замены по системе Цезаря

Математическая модель

Если сопоставить каждому символу алфавита его порядковый номер (нумеруя с 0), то шифрование и дешифрование можно выразить формулами:

у=х+k(mod n), x=y-k(mod n)
где x — символ открытого текста 
y — символ шифрованного текста 
n — мощность алфавита (кол-во символов) 
k — ключ. 
Можно заметить, что суперпозиция двух шифрований на ключах k1 и k2 — есть просто шифрование на ключе k1+k2. Более общее, множество шифрующих преобразований шифра Цезаря образует группу Z.

На Паскале

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

Текст программы          program z1;

uses crt;

var a,b,c:string;

i,j,k,d:integer;

begin

clrscr;

writeln('шифр ');

readln(a);

writeln('ключ');

readln(d);

c:='';

b:='абвгдежзийклмнопрстуфхцчшщъыьэюя';

for i:=1 to length(a) do

for j:=1 to length(b) do

begin

k:=(j+d) mod 32;

if a[i]=b[j] then c:=c+b[k];

end;

writeln(c);

readkey;

end.

 

Код C++

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

 

Код C++

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

#include "stdafx.h"

#include <conio.h>

#include <iostream>

#include <iomanip>

using namespace std;

 

int main()

{

    char buff[50]={0};

    cout<<"Введите сообщение,которое будет закодированно"<<endl;

    char n=0;

    int i=0;

    for(;;)

    {

        n=getch();

        if(n==13)break;

        printf("%c",n);

        buff[i]=n;

        i++;

    }

    printf("\n");

    for(int k=0;k<i;k++)

    {

        if(buff[k]<=char(162)&&buff[k]>=char(160))

            buff[k]=buff[k]+3;

        if(buff[k]<=char(130)&&buff[k]>=char(128))

            buff[k]=buff[k]+3;

        if(buff[k]==char(163))

            buff[k]=buff[k]+78;

        if(buff[k]==char(131))

            buff[k]=buff[k]+109;

        if(buff[k]<=char(165)&&buff[k]>=char(164))

            buff[k]=buff[k]+2;

        if(buff[k]<=char(133)&&buff[k]>=char(132))

            buff[k]=buff[k]+2;

        if(buff[k]==char(241))

            buff[k]=buff[k]-73;

        if(buff[k]==char(240))

            buff[k]=buff[k]-104;

        if(buff[k]<=char(156)&&buff[k]>=char(134))

            buff[k]=buff[k]+3;

        if(buff[k]<=char(172)&&buff[k]>=char(166))

            buff[k]=buff[k]+3;

        if(buff[k]<=char(175)&&buff[k]>=char(173))

            buff[k]=buff[k]+51;

        if(buff[k]<=char(236)&&buff[k]>=char(224))

            buff[k]=buff[k]+3;

        if(buff[k]<=char(239)&&buff[k]>=char(237))

            buff[k]=buff[k]-77;

        if(buff[k]<=char(159)&&buff[k]>=char(157))

            buff[k]=buff[k]-29;

    }

    for(int j=0;j<i;j++)

    {

        printf("%c",buff[j]);

    }

    printf("\n");

    getch();

    return 0;

}

 

 

Пример вскрытия шифра Цезаря

 

Пусть дана следующая криптограмма:

 

Цярснсмщи ямякзж онкдждм мд снкыйн гкю онгрсямнбнцмщф

йпзоснвпялл мн б гптвзф рктцяюф нм ркнемдд

 

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

 

Буква

н

м

я

к

д

с

р

г

о

п

з

ф

ц

б

в

ж

й

л

т

щ

ю

е

и

ы

Число вхождений

11

9

6

6

5

5

4

3

3

3

3

3

3

2

2

2

2

2

2

2

2

1

1

1

 

Наиболее часто встречающийся символ "и" скорее всего, означает букву "о". Сделав такое предположение, рассмотрим следующий по частоте символ "м". В криптограмме имеется двухбуквенное сочетание "мн", и так как "н" - это "о", то символ "м" соответствует согласной.

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

Если "м" - это "н", то в сочетании "мд", встречающемся в криптограмме, "д" означает скорее всего гласную. Из наиболее вероятных для "д" вариантов "а", "е", "и" выбираем "е", потому что лишь в этом случае имеющееся в криптограмме слово "ркнемдд" допускает осмысленную расшифровку. Итак, три знака разгаданы: "н" - это "о", "м" - "н", "д" - "е". Обращаемся к сочетанию "ямякзж". В нем "я" может означать лишь гласную "а" или "и". Любые другие возможности заведомо не допускают разумного прочтения слова "ямякзж". Испытаем букву "а". Подставляя вместо "я" букву "а", вместо "м" — "н", вместо других знаков - точки, получим недописанное слово "ана...". В словаре имеется всего лишь несколько слов из 6 букв с таким началом: "анализ", "аналог", "ананас", "анатом". Из них годится лишь первое. Если вместо "я" подставить букву "и", то получится шестибуквенное сочетание с началом "ини", но в словаре нет ни одного такого слова. Расшифрованы еще четыре буквы: "я", "к", "з", "ж". Они означают соответственно "а", "л", "и", "э".

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

Не разгаданы еще два сравнительно часто встречающиеся знака "о" и "р". Рассмотрим сочетание "ркнемдд", означающее ".ло.нее". Имеется немного вариантов его прочтения, один из них - "сложнее", и, следовательно, скорее всего "р" - это "с", "е" - это "ж".

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

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

.астотн.. анализ полезен не то..ко .л. по.стано.о.н.. ..ипто..а..

но . ….и. сл..а.. он сложнее

 

Ясны (по контексту), по крайней мере: ".астотн.." означает "частотный", "тол..о" – "только", ".л." – "для". С учетом новой информации текст примет следующую форму:

 

Частотный анализ полезен не только для подстано.очны. к.ипто..а..

но . д...и. сл.чая. он сложнее

 

Окончательная расшифровка не представляет труда. Текст таков:

 

Частотный анализ полезен не только для подстановочных крипто­грамм, но в других случаях он сложнее

 

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

 

 

 

ж

 

 

 

э

 

я

 

э

 

Е

и

 

з

 

д

 

ю

 

а

 

ю

 

ж

й

 

и

 

е

 

я

 

б

 

я

 

З

к

 

й

 

ж

 

а

 

в

 

а

 

и

л

 

к

 

з

 

б

 

г

 

б

 

й

м

 

л

 

и

 

в

 

д

 

в

 

к

н

 

м

 

й

 

г

 

е

 

г

 

л

о

 

н

 

к

 

д

 

ж

 

д

 

м

п

 

о

 

л

 

е

 

з

 

е

 

н

р

 

п

 

м

 

ж

 

и

 

ж

 

о

с

 

р

 

н

 

з

 

й

 

з

 

п

т

 

с

 

о

 

и

 

к

 

и

 

р

у

 

т

 

п

 

й

 

л

 

й

 

с

х

 

ф

 

с

 

л

 

н

 

л

 

у

ц

 

х

 

т

 

м

 

о

 

м

 

ф

 
Категория: В помощь ученику | Добавил: Harchev (19.04.2015)
Просмотров: 5559 | Рейтинг: 4.4/25
Всего комментариев: 0
Имя *:
Email *:
Код *:
Copyright MyCorp © 2024
Блог учителя Учительский портал