Ознакомление с алгоритмом работы и алгоритмом криптоанализа шифра Цезаря. Выполнение программной реализации на любом языке программирования

Страницы работы

Содержание работы

Министерство образования и науки, молодежи и спорта Украины

Сумской государственный университет

Кафедра компьютерных наук

Отчет по практической  работе №1

по теме:” Шифры простой замены. Шифр Цезаря ”

по дисциплине ”Криптология”

Выполнил: студент

Факультету ЕлИТ

Группы ИН-83

Третяк А. А.

Проверил: Дунь А. В.

Сумы 2011


Задание.

1.  Ознакомиться с алгоритмом работы шифра Цезаря.

2.  Ознакомиться с алгоритмом криптоанализа шифра Цезаря.

3.  Выполнить программную реализацию на любом языке программирования

а.  шифрования данных с помощью шифра Цезаря, а также

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

4.  Протестировать работу программы.

5.  Оформить отчёт.

Ход работы

1.  Ознакомиться с алгоритмом работы шифра Цезаря.

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

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

а расшифрование выражается формулой:

где  — номер в алфавите -го символа открытого текста,

 — номер в алфавите -го символа шифрованного текста,

 — мощность алфавита, 

 — ключ ,

  - длина открытого/зашифрованного текста

2.  Ознакомиться с алгоритмом криптоанализа шифра Цезаря.

Для криптоанализа шифра Цезаря необходимо:

a.  Определить частоты символов алфавита. Занести их в массив .

b.  Определить частоты символов шифртекста. Занести их в массив :

c.   Найти такое значение при котором сумма одноименных разностей d  была бы минимальной.

o  Вычислить для всех значений  суммы разностей

где ,   – мощность алфавита.

o  Найти значение , при котором сумма разностей d будет минимальной.

d.  Расшифровать шифртекст с ключом  .

3.  Выполнить программную реализацию на любом языке программирования.

а.  Шифрование и расшифрование данных с помощью шифра Цезаря.

Код программы для шифрования и расцифрования:

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

namespace Cripto.CodeAlgorithm

{

  class Caesar : Code

  {

    int key;

    String alphabet;

    Dictionary<char, int> dict;

    public Caesar(int key, String alphabet)

    {

      this.key = key;

      this.alphabet = alphabet;

      dict = new Dictionary<char, int>();

      for (int i = 0; i < alphabet.Length; i++)

      {

        dict.Add(alphabet[i], i);

      }

    }

    public String Code(String message)

    {

      StringBuilder coded = new StringBuilder();

      for (int i = 0; i < message.Length; i++)

      {

        if (!dict.ContainsKey(message[i]))

          throw new Exception("Неизвестный символ '"+message[i]+"', номер в строке:" + i + ".");

        coded.Append(alphabet[(dict[message[i]] + key) % alphabet.Length]);

      }

      return coded.ToString();

    }

    public String Decode(String coded)

    {

      StringBuilder message = new StringBuilder();

      for (int i = 0; i < coded.Length; i++)

      {

        if (!dict.ContainsKey(coded[i]))

          throw new Exception("Неизвестный символ '" + coded[i] + "', номер в строке:" + i + ".");

        message.Append(alphabet[(dict[coded[i]] - key + alphabet.Length) % alphabet.Length]);

      }

      return message.ToString();

    }

    public void PrintInfo(TextWriter outputStream)

    {

      outputStream.WriteLine("Алфавит: " + alphabet);

      outputStream.WriteLine("Мощность алфавита: " + alphabet.Length);

    }

  }

}

б.   криптоанализ шифра Цезаря.

Код программы  для криптоанализа:

using System;

using System.Collections.Generic;

using System.Text;

using Cripto.CodeAlgorithm;

namespace Cripto.CriptoAnalyze

{

  class CaesarAnalizer

  {

    private String alphabet;

    private Dictionary<char, int> dict;

    public CaesarAnalizer(String alphabet)

    {

      this.alphabet = alphabet;

      dict = new Dictionary<char, int>();

      for (int i = 0; i < alphabet.Length; i++)

      {

        dict.Add(alphabet[i], i);

      }

    }

    public String StaticDecriptor(double[] probability, String coded)

    {

      double[] countProb = new double[alphabet.Length];

      foreach (char c in coded) countProb[dict[c]]++;

      foreach (char c in coded) countProb[dict[c]] /= coded.Length;

      int key = -1;

      double minPDif = Double.MaxValue;

      for (int k = 0; k < alphabet.Length; k++)

      {

        double kp = 0;

        for (int i = 0; i < probability.Length; i++)

        {

          kp += Math.Abs(probability[i] - countProb[(i + k) % alphabet.Length]);

        }

        if (kp < minPDif)

        {

          minPDif = kp;

          key = k;

        }

      }

      Console.WriteLine("Ключь = " + key);

      Caesar caesar = new Caesar(key, alphabet);

      return caesar.Decode(coded);

    }

  }

}

4.  Протестировать работу программы.

Код программы для тестирования:

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

using Cripto.CodeAlgorithm;

using Cripto.CriptoAnalyze;

namespace Cripto

{

  class Program

  {

    static void Main(string[] args)

    {

      String alphabet1 = "0123456789+АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЪЬЭЮЯ ";

      String alphabet2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ";

      Caesar caesar = new Caesar(17, alphabet1);

      caesar.PrintInfo(Console.Out);

      CodeTest(caesar);

      caesar = new Caesar(17, alphabet2);

      caesar.PrintInfo(Console.Out);

      Console.WriteLine("Криптоанализ шифра Цезаря");

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

      String coded = caesar.Code(sr.ReadToEnd());

      Console.WriteLine("Зашифрованый : " + coded);

      CaesarAnalizer ka = new CaesarAnalizer(alphabet2);

      double[] p = { 0.079, 0.017, 0.041, 0.033, 0.122, 0.022, 0.018, 0.038, 0.075,

              0.001, 0.008, 0.037, 0.027, 0.068, 0.071, 0.028, 0.002, 0.069,

              0.071, 0.091, 0.031, 0.011, 0.013, 0.003, 0.020, 0.002, 0.222 };

      Console.WriteLine("Расцифрованый: " + ka.StaticDecriptor(p, coded));

    }

    static void CodeTest(Code code)

    {

      Console.Write("Введите сообщение: ");

      String coded = code.Code(Console.ReadLine());

      Console.WriteLine("Зашифрованый : " + coded);

      Console.WriteLine("Расцифрованый: " + code.Decode(coded));

    }

  }

}

Результат работы программы:

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

Похожие материалы

Информация о работе

Предмет:
Криптология
Тип:
Отчеты по лабораторным работам
Размер файла:
223 Kb
Скачали:
0