Шифры сложной замены. Двойной квадрат Уитстона (Отчет по практической работе № 3)

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

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

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

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

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

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

по теме: ”Шифры сложной замены. Двойной квадрат Уитстона”

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

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

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

Группы ИН-83

Третяк А. А.

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

Сумы 2011


Задание.

1. Ознакомиться с теоретическими сведениями о шифре "Двойной квадрат Уитстона"

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

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

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

Ход работы

1. Ознакомиться с теоретическими сведениями о шифре "Двойной квадрат Уитстона"

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

№ в-та

А

Size

17

Заглавные русские буквы, строчные английские буквы, числа из диапазона 0..7

8x8

Код программы:

using System;

using System.Collections.Generic;

using System.Text;

namespace Cripto.CodeAlgorithm

{

  class Wheatstone : Code

  {

  int key;

  private List<char> firstTable;

  private List<char> secondTable;

  public class Randomizer : IComparer<Char>

  {

    private static Random rand = new Random();

    public int Compare(Char x, Char y)

    {

    if (x.Equals(y)) return 0;

    return rand.Next(3) - 1;

    }

  }

  public Wheatstone(int key, String alphabet)

  {

    this.key = key;

    firstTable = new List<Char>(alphabet);

    secondTable = new List<Char>(alphabet);

    Randomizer rand = new Randomizer();

    firstTable.Sort(rand);

    secondTable.Sort(rand);

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

    {

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

    {

      Console.Write(firstTable[GetIndex(j, i)] + " ");

    }

    Console.Write(" ");

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

    {

      Console.Write(secondTable[GetIndex(j, i)] + " ");

    }

    Console.WriteLine();

    }

  }

  private int Height(int index) { return index / key; }

  private int Width(int index) { return index % key; }

  private int GetIndex(int weight, int height)

  {

    return height * key + weight;

  }

  private String Replace(List<char> firstTable, List<char> secondTable, String message)

  {

    StringBuilder code = new StringBuilder();

    int fCodedIndex;

    int sCodedIndex;

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

    {

    int fCharIndex = firstTable.IndexOf(message[i]);

    if (fCharIndex == -1) throw new Exception("Unknown char '" + message[i] + "'.");

    int sCharIndex = secondTable.IndexOf(message[i + 1]);

    if (sCharIndex == -1) throw new Exception("Unknown char '" + message[i + 1] + "'.");

    if (Height(fCharIndex) == Height(sCharIndex))

    {

      fCodedIndex = fCharIndex;

      sCodedIndex = sCharIndex;

    }

    else

    {

      fCodedIndex = GetIndex(Width(sCharIndex), Height(fCharIndex));

      sCodedIndex = GetIndex(Width(fCharIndex), Height(sCharIndex));

    }

    code.Append(secondTable[fCodedIndex]);

    code.Append( firstTable[sCodedIndex]);

    }

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

    {

    Console.Write(" " + message[i] + message[i+1]);

    }

    Console.WriteLine();

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

    {

    Console.Write(" " + code[i] + code[i + 1]);

    }

    Console.WriteLine();

    return code.ToString();

  }

  public String Code(String message)

  {

    if (message.Length % 2 != 0) message += ' ';

    return Replace(firstTable, secondTable, message);

  }

  public String Decode(String message)

  {

    if (message.Length % 2 != 0)

    throw new Exception("Code message size should be odd.");

    return Replace(secondTable, firstTable, message);

  }

  }

}

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

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 alphabet = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЪЬЭЮЯabcdefghiklmnopqrstvxyz01234567 ";

    Console.WriteLine("Aлфавит: " + alphabet);

    int key = 8;

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

    Wheatstone wheatstone = new Wheatstone(key, alphabet);

    String c;

    do

    {

      try

      {

         CodeTest(wheatstone);

         Console.WriteLine("Повторить? (Y/N)");

         c = Console.ReadLine().ToUpper();

      }

      catch (Exception e)

      {

         Console.WriteLine(e.Message);

       }

    }

    while (c.Equals("Y"));

  }

  static void CodeTest(Code code)

  {

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

    String message = Console.ReadLine();

    Console.WriteLine("Зашифрование : ");

    String coded = code.Code(message);   

    Console.WriteLine("Расшифрование: ");

    String decoded = code.Decode(coded);

  }

  }

}


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

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

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

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

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