Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_Киоки.doc
Скачиваний:
5
Добавлен:
01.05.2025
Размер:
2.08 Mб
Скачать

3.Лабораторный практикум

Лабораторный практикум содержит комплекс из 13 работ различной сложности, часть из которых являются обязательными и подлежат к непременному выполнени., другие работы позволяют набрать дополнительные баллы к подготовке к экзамену.

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

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

3.1 Симметричные алгоритмы. Шифры перестановок.

3.2 Шифры замены. Шифр Цезаря.

3.3Шифр Гронсфельда.

3.4 Шифр Вижинера

3.5 Поточное шифрование. Скремблеры на основе регистров сдвига

3.6 Поточное шифрование. Скремблеры на основе генераторов псевдослучайных последовательностей.

3.7 Блочные шрифты. Применение перемешивания и рассеивания. Раундовое шифрование

3.8 Алгоритм DES.16- ть раундов шифрования в сети Фейстеля. Начальная и конечная перестановки.

3.9 Сеть Фейстеля. Функция расширения E и функция шифрования F.

3.10. DES. Режим электронной кодовой книги ECB.

3.11 DES. Режим сцепления блоков CBC.

3.12 DES. Режим обратной связи по шифротексту CFB.

3.13 DES. Режим обратной связи по выходу OFB.

3.14 Асимметричные криптосистемы. Алгоритм RSA

3.15 Формирование ЭЦП. ХЭШ-функции.

3.2Лабораторная работа шифр цезаря.

Одним из древнейших шифров является шифр Цезаря. Этот шифр назван в честь римского императора Гая Юлия Цезаря, использовавшего его для секретной переписки со своими генералами. Идея данного шифрования заключается в замене всех букв послания на буквы, находящиеся на n позиций от текущей в алфавите. Наглядно этот процесс можно изобразить следующим образом:

 

Шифрование методом Цезаря

К слову сказать, Цезарь использовал этот шифр со сдвигом 3. Что ж, рассмотрим теперь математическую модель данного шифра. Она не представляет ничего сложного:

Здесь X представляет собой позицию исходной буквы в алфавите, K — сдвиг, которым шифруется сообщение, n — количество букв в алфавите и Y — положение зашифрованной буквы в алфавите. Данная процедура выполняется для каждой буквы послания.Материал апримера взят из Википедии и составители не меняли стиль изложения первоисточника. Переходим к реализации данного алгоритма шифрования. Весь процесс реализации алгоритма можно разбить на 3 части:

  1. Написание класса Alphabet, предоставляющего различные алфавиты.

  2. Написание класса Caesar, предоставляющего методы шифрования и дешифрования.

  3. Проверка работы на тестовых данных.

Класс Alphabet

В первую очередь разработаем класс, который предоставляет различные алфавиты символов. «Зачем это нужно?», спросите вы. Ведь достаточно лишь задать строку, к примеру, с перечислением строчных русских букв и шифровать все послания ей. По этому поводу я могу выдвинуть следующие аргументы. Во-первых, вы не можете точно утверждать, что послание, которое необходимо зашифровать будет состоять только из русских строчных букв. Ведь если в этом послании будут другие символы, то вы столкнетесь со следующей проблемой: шифрование будет происходить успешно, на первый взгляд, но дешифрование может вывести интересный результат. Что бы не быть голословным, приведу пример реакции программы шифрования по Цезарю с алфавитом только из строчных русских букв. Обратите внимание, что послание намеренно состоит не только из строчных русских букв:

С чем связано то, что все символы, не входящие в алфавит заменились на буквы я? Вернемся к математической форме и остановим наше внимание на X — позицию исходной буквы в алфавите. А в нашем алфавите нет ни заглавных букв, ни пробелов, ни знаков препинания. Следовательно, определить положение данных символов в алфавите попросту невозможно! В таком случае, если вы пользуетесь методом IndexOf класса String, то получаете -1. Можно конечно запретить пользователю использовать иные символы или же удалять эти символы при считывании, но в этом случае либо пользователь будет очень зол, что может использовать только строчные буквы, либо послание при расшифровке может получиться обрывочным. Во-вторых, все-таки мы живем в развивающимся мире, где программы должны быть гибкими (кроссплатформенными, мультиязычными, настраиваемыми), на случай, если вы например решили зашифровать сообщение на английском. Довольно слов, давайте рассмотрим реализацию данного класса:

Класс Alphabet на C#

static class Alphabet

{

static string alphabet;

 

///

/// Заглавные буквы английского алфавита

///

public static string EngU

{

get

{

alphabet = "";

for (char ch = 'A'; ch <= 'Z'; ch++)

{

alphabet += ch.ToString();

}

return alphabet;

}

}

 

///

/// Строчные буквы английского алфавита

///

public static string EngL

{

get

{

alphabet = "";

for (char ch = 'a'; ch <= 'z'; ch++)

{

alphabet += ch.ToString();

}

return alphabet;

}

}

 

///

/// Заглавные буквы русского алфавита

///

public static string RusU

{

get

{

alphabet = "";

for (char ch = 'А'; ch <= 'Я'; ch++)

{

alphabet += ch.ToString();

}

return alphabet;

}

}

 

///

/// Строчные буквы русского алфавита

///

public static string RusL

{

get

{

alphabet = "";

for (char ch = 'а'; ch <= 'я'; ch++)

{

alphabet += ch.ToString();

}

return alphabet;

}

}

 

///

/// Числа

///

public static string Numbers

{

get

{

alphabet = "";

for (char ch = '0'; ch <= '9'; ch++)

{

alphabet += ch.ToString();

}

return alphabet;

}

}

 

///

/// Скобки и знаки препинания

///

public static string SpecialCharacters

{

get

{

alphabet = "";

for (char ch = ' '; ch <= '/'; ch++)

{

alphabet += ch.ToString();

}

for (char ch = ':'; ch <= '?'; ch++)

{

alphabet += ch.ToString();

}

return alphabet;

}

}

 

///

/// Все доступные символы

///

public static string Everything

{

get

{

alphabet = "";

alphabet+=RusL;

alphabet+=RusU;

alphabet+=EngL;

alphabet+=EngU;

alphabet+=Numbers;

alphabet+=SpecialCharacters;

return alphabet;

}

}

}

}

Класс Alphabet на Java

public class Alphabet {

 

static String alphabet;

/**

* Метод, возвращающий алфавит заглавных

* английских букв

* @return Алфавит заглавных английских букв

*/

public static String getEnglishU(){

alphabet = "";

for(char ch='A';ch<='Z';ch++){

alphabet+=ch;

}

return alphabet;

}

 

/**

* Метод, возвращающий алфавит строчных

* английских букв

* @return Алфавит строчных английских букв

*/

public static String getEnglishL(){

alphabet = "";

for(char ch='a';ch<='z';ch++){

alphabet+=ch;

}

return alphabet;

}

 

/**

* Метод, возвращающий алфавит заглавных

* русских букв

* @return Алфавит заглавных русских букв

*/

public static String getRussianU(){

alphabet = "";

for(char ch='А';ch<='Я';ch++){

alphabet+=ch;

}

return alphabet;

}

 

/**

* Метод, возвращающий алфавит строчных

* русских букв

* @return алфавит строчных русских букв

*/

public static String getRussianL(){

alphabet = "";

for(char ch='а';ch<='я';ch++){

alphabet+=ch;

}

return alphabet;

}

 

/**

* Метод, возвращающий строку цифр

* @return строку цифр

*/

public static String getNumbers(){

alphabet = "";

for(char ch='0';ch<='9';ch++){

alphabet+=ch;

}

return alphabet;

}

 

/**

* Метод, возвращающий скобки и знаки препинания

* @return строка скобок и знаков препинания

*/

public static String getSpecialCharacters(){

alphabet = "";

for(char ch=' ';ch<='/';ch++){

alphabet+=ch;

}

for(char ch=':';ch<='?';ch++){

alphabet+=ch;

}

return alphabet;

}

 

/**

* Метод, возвращает набор всех возможных символов

* @return строка всех символов

*/

public static String getEverything(){

alphabet="";

alphabet+=Alphabet.getRussianL();

alphabet+=Alphabet.getRussianU();

alphabet+=Alphabet.getEnglishL();

alphabet+=Alphabet.getEnglishU();

alphabet+=Alphabet.getNumbers();

alphabet+=Alphabet.getSpecialCharacters();

return alphabet;

}

}

Как вы можете заметить, это статический класс, членами которого являются свойства, доступные только для чтения. Каждое свойство содержит в себе некоторый алфавит или другой однотипный набор символов. Данный данный класс довольно просто расширяется. Итак, этот этап закончен.