Министерство образования и науки, молодежи и спорта Украины
Сумской государственный университет
Кафедра компьютерных наук
Отчет по практической работе №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));
}
}
}
Результат работы программы:
Вывод: в ходе выполнения этой практической работы, я усовершенствовал свои навыки шифрования и дешифрования сообщений шифрами простой замены, в частности шифром Цезаря, а так же криптоанализа сообщений, зашифрованных этим шифром.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.