Министерство образования и науки, молодежи и спорта Украины
Сумской государственный университет
Кафедра компьютерных наук
Отчет по практической работе №2
по теме:” Шифры сложной замены. Шифр Виженера ”
по дисциплине ”Криптология”
Выполнил: студент
Факультету ЕлИТ
Группы ИН-83
Третяк А. А.
Проверил: Дунь А. В.
Сумы 2011
Задание.
Ход работы
№ в-та |
А1 |
Тип шифрования |
17 |
Строчные буквы русского алфавита, цифры и спецсимвол (@) |
С помощью формулы |
using System;
using System.Collections.Generic;
using System.Text;
namespace Cripto.CodeAlgorithm
{
class Vyzhener : Code
{
String key;
String alphabet;
Dictionary<char, int> dict;
public Vyzhener(String key, String alphabet)
{
this.key = key;
this.alphabet = alphabet;
dict = new Dictionary<char, int>();
String[] result = new String[2];
for (int i = 0; i < alphabet.Length; i++)
{
dict.Add(alphabet[i], i);
result[0] += alphabet[i].ToString().PadLeft(3);
result[1] += i.ToString().PadLeft(3);
if (result[0].Length > 75)
{
for (int j = 0; j < result.Length; j++)
{
Console.WriteLine(result[j]);
result[j] = "";
}
}
}
for (int i = 0; i < result.Length; i++)
{
Console.WriteLine(result[i]);
}
}
public String Code(String message)
{
String[] result = new String[6];
StringBuilder code = new StringBuilder();
for (int i = 0; i < message.Length; i++)
{
if (!dict.ContainsKey(message[i])) throw new Exception("Unknown char " + message[i] + ".");
code.Append(alphabet[ (dict[message[i]] + dict[key[i % key.Length]]) % alphabet.Length]);
result[0] += message[i].ToString().PadLeft(3);
result[1] += dict[message[i]].ToString().PadLeft(3);
result[2] += key[i % key.Length].ToString().PadLeft(3);
result[3] += dict[key[i % key.Length]].ToString().PadLeft(3);
result[4] += ((dict[message[i]] + dict[key[i % key.Length]]) % alphabet.Length).ToString().PadLeft(3);
result[5] += alphabet[(dict[message[i]] + dict[key[i % key.Length]]) % alphabet.Length].ToString().PadLeft(3);
}
for (int i = 0; i < result.Length; i++)
{
Console.WriteLine(result[i]);
}
return code.ToString();
}
public String Decode(String message)
{
String[] result = new String[6];
StringBuilder decode = new StringBuilder();
for (int i = 0; i < message.Length; i++)
{
if (!dict.ContainsKey(message[i])) throw new Exception("Unknown char " + message[i] + ".");
decode.Append(alphabet[ (dict[message[i]] - dict[key[i % key.Length]] + alphabet.Length) % alphabet.Length]);
result[0] += message[i].ToString().PadLeft(3);
result[1] += dict[message[i]].ToString().PadLeft(3);
result[2] += key[i % key.Length].ToString().PadLeft(3);
result[3] += dict[key[i % key.Length]].ToString().PadLeft(3);
result[4] += ((dict[message[i]] - dict[key[i % key.Length]] + alphabet.Length) % alphabet.Length).ToString().PadLeft(3);
result[5] += alphabet[(dict[message[i]] - dict[key[i % key.Length]] + alphabet.Length) % alphabet.Length].ToString().PadLeft(3);
}
for (int i = 0; i < result.Length; i++)
{
Console.WriteLine(result[i]);
}
return decode.ToString();
}
}
}
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 = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЪЬЭЮЯ0123456789@ ";
Console.Write("Введите ключь: ");
String key = Console.ReadLine();
Code vyzhener = new Vyzhener(key, alphabet);
CodeTest(vyzhener);
}
static void CodeTest(Code code)
{
Console.Write("Введите сообщение: ");
String message = Console.ReadLine();
Console.WriteLine("Зашифрование : ");
String coded = code.Code(message);
Console.WriteLine("Расшифрование: ");
code.Decode(coded);
}
}
Вывод: в ходе выполнения этой практической работы, я усовершенствовал свои навыки шифрования и дешифрования сообщений шифром Виженера.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.