Главная страница

ЗИ З10. Практическая работа 3 название практической работы реализация шифра вижинера


Скачать 73.25 Kb.
НазваниеПрактическая работа 3 название практической работы реализация шифра вижинера
Дата06.05.2022
Размер73.25 Kb.
Формат файлаdocx
Имя файлаЗИ З10.docx
ТипПрактическая работа
#515315

ПРАКТИЧЕСКАЯ РАБОТА № 3

НАЗВАНИЕ ПРАКТИЧЕСКОЙ РАБОТЫ

РЕАЛИЗАЦИЯ ШИФРА ВИЖИНЕРА

ВЫПОЛНИЛ: студент группы ИС-20-03 Манбаев Казбек Зельгабиденович

ЦЕЛЬ ПРАКТИЧЕСКОЙ РАБОТЫ

Получение навыков создания зашифрованного сообщения при помощи алгоритма шифрования Виженера и его расшифровки

ТЕКСТ ПРОГРАММЫ

1

2

3

4

5

char[] characters = new char[] { 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И',

                                                 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С',

                                                 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ы', 'Ъ',

                                                 'Э', 'Ю', 'Я', ' ', '1', '2', '3', '4', '5', '6', '7',

                                                 '8', '9', '0' };

Тогда мощность алфавита будет равна:

1

N = characters.Length;

Приведем реализацию метода на языке 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

//зашифровать

private string Encode(string input, string keyword)

{

    input = input.ToUpper();

    keyword = keyword.ToUpper();

 

    string result = "";

 

    int keyword_index = 0;

 

    foreach (char symbol in input)

    {

        int c = (Array.IndexOf(characters, symbol) +

            Array.IndexOf(characters, keyword[keyword_index])) % N;

 

        result += characters[c];

 

        keyword_index++;

 

        if ((keyword_index + 1) == keyword.Length)

            keyword_index = 0;

    }

 

    return result;

}

На вход поступает строка, которую нужно зашифровать (input) и ключ (keyword).

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

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

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

private string Decode(string input, string keyword)

{

    input = input.ToUpper();

    keyword = keyword.ToUpper();

 

    string result = "";

 

    int keyword_index = 0;

 

    foreach (char symbol in input)

    {

        int p = (Array.IndexOf(characters, symbol) + N -

            Array.IndexOf(characters, keyword[keyword_index])) % N;

 

        result += characters[p];

 

        keyword_index++;

 

        if ((keyword_index + 1) == keyword.Length)

            keyword_index = 0;

    }

 

    return result;

}

Кроме того, для гаммирования понадобится генерирование псевдослучайного ключа. Вот метод, который делает это:

1

2

3

4

5

6

7

8

9

10

11

private string Generate_Pseudorandom_KeyWord(int length, int startSeed)

{

    Random rand = new Random(startSeed);

 

    string result = "";

 

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

        result += characters[rand.Next(0, characters.Length)];

 

    return result;

}

length — нужная длина ключа. startSeed — число, которым инициализируется генератор случайных чисел. Это число должно быть всегда одинаковым, таким образом и ключ будет всегда один и тот же.

Программа имеет следующий интерфейс:




Код кнопки «Зашифровать» приведен ниже.

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

//зашифровать

private void buttonEncrypt_Click(object sender, EventArgs e)

{

    if (radioButtonGamma.Checked)

    {

        string s;

 

        StreamReader sr = new StreamReader("in.txt");

        StreamWriter sw = new StreamWriter("out.txt");

 

        while (!sr.EndOfStream)

        {

            s = sr.ReadLine();

            sw.WriteLine(Encode(s, Generate_Pseudorandom_KeyWord(s.Length, 100)));

        }

 

        sr.Close();

        sw.Close();

    }

    else

    {

        if (textBoxKeyWord.Text.Length > 0)

        {

            string s;

 

            StreamReader sr = new StreamReader("in.txt");

            StreamWriter sw = new StreamWriter("out.txt");

 

            while (!sr.EndOfStream)

            {

                s = sr.ReadLine();

                sw.WriteLine(Encode(s, textBoxKeyWord.Text));

            }

 

            sr.Close();

            sw.Close();

        }

        else

            MessageBox.Show("Введите ключевое слово!");

    }

}

Происходит чтение данных из файла in.txt, выполняется шифрование (в зависимости от выбранного radioButton) и запись результата в файл out.txt.

Код кнопки «Расшифровать» приводится далее.

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

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

private void buttonDecipher_Click(object sender, EventArgs e)

{

    if (radioButtonGamma.Checked)

    {

        string s;

 

        StreamReader sr = new StreamReader("in.txt");

        StreamWriter sw = new StreamWriter("out.txt");

 

        while (!sr.EndOfStream)

        {

            s = sr.ReadLine();

            sw.WriteLine(Decode(s, Generate_Pseudorandom_KeyWord(s.Length, 100)));

        }

 

        sr.Close();

        sw.Close();

    }

    else

    {

        if (textBoxKeyWord.Text.Length > 0)

        {

            string s;

 

            StreamReader sr = new StreamReader("in.txt");

            StreamWriter sw = new StreamWriter("out.txt");

 

            while (!sr.EndOfStream)

            {

                s = sr.ReadLine();

                sw.WriteLine(Decode(s, textBoxKeyWord.Text));

            }

 

            sr.Close();

            sw.Close();

        }

        else

            MessageBox.Show("Введите ключевое слово!");

    }

}

Демонстрация работы программы (шифрование и расшифровка данных методом Виженера) приведена на скриншоте ниже.



написать администратору сайта