Министерство образования и науки, молодежи и спорта Украины
Сумской государственный университет
Кафедра компьютерных наук
Отчет по практической работе №3
по теме: ”Шифры сложной замены. Двойной квадрат Уитстона”
по дисциплине ”Криптология”
Выполнил: студент
Факультету ЕлИТ
Группы ИН-83
Третяк А. А.
Проверил: Дунь А. В.
Сумы 2011
Задание.
Ход работы
№ в-та |
А |
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);
}
}
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);
}
}
Вывод: в ходе выполнения этой практической работы, я усовершенствовал свои навыки шифрования и дешифрования сообщений шифром "Двойной квадрат Уитстона".
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.