Вы находитесь на странице: 1из 9

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное


учреждение высшего образования
«Тульский государственный университет»

КАФЕДРА ИНФОРМАЦИОННОЙ БЕЗОПАСНОСТИ

ПРОГРАММНО-АППАРАТНЫЕ СРЕДСТВА ОБЕСПЕЧЕНИЯ


ИНФОРМАЦИОННОЙ БЕЗОПАСНОСТИ

Лабораторная работа № 4
Методы криптографии. Реализация процедур стандарта DES

Выполнили: ст. группы 230711


Акользина И. С.
Кузнецова А. В.
Кузьминова С. С.
Проверил:
Абрамов Д. А.
______________

Тула 2015
1. Цель работы
Знакомство с методами реализации основных процедур стандарта DES,
приобретение навыков программирования криптографических процедур.

2. Задание на работу
Вариант № 3. Реализовать процедуру циклического сдвига вправо
блока данных на заданное количество разрядов.

3. Теоретическая справка
Самым распространенным и наиболее известным алгоритмом
симметричного шифрования является DES (Data Encryption Standard).
Алгоритм был разработан в 1977 году.
DES является классической сетью Фейштеля с двумя ветвями. Данные
шифруются 64-битными блоками, используя 56-битный ключ. Алгоритм
преобразует за несколько раундов 64-битный вход в 64-битный выход.
Процесс шифрования состоит из четырех этапов. На первом из них
выполняется начальная перестановка (IP) 64-битного исходного текста
(забеливание), во время которой биты переупорядочиваются в соответствии
со стандартной таблицей. Следующий этап состоит из 16 раундов одной и
той же функции f, которая использует операции сдвига и подстановки. На
третьем этапе левая и правая половины выхода последней (16-й) итерации
меняются местами. Наконец, на четвертом этапе выполняется перестановка
IP-1 результата, полученного на третьем этапе. Перестановка IP-1 инверсна
начальной перестановке.
Первоначально 56-битный ключ подается на вход функции
перестановки. Затем для каждого из 16 раундов подключ Ki является
комбинацией левого циклического сдвига и перестановки. Функция
перестановки одна и та же для каждого раунда, но подключи Ki для каждого
раунда получаются разные вследствие повторяющегося сдвига битов ключа.

2
Процедура циклического сдвига вправо блока данных является одной
из основных процедур алгоритма DES.

4. Алгоритм программы
Входные данные: B – массив блока данных; N – длина блока данных в
битах; L – количество разрядов сдвига.
Результат: B1 – выходной массив блока данных.
Алгоритм работы программы при вводе корректных входных данных:
1) Определение общей длины заданной строки в байтах.
2) Определение общей длины заданной строки в битах.
3) Определение количества байтов строки, к которым применяется сдвиг.
4) Определение количества битов в последнем байте, которые сдвигаются.
5) Определение количества битов в последнем байте, которые остаются на
месте.
6) Фиксация битов последнего байта, которые не сдвигаются.
7) Циклический сдвиг вправо (шаги 8 – 16, количество повторений - L):
8) Запоминание последнего бита блока данных, который сдвигается.
9) Для каждого байта, к которому применяется сдвиг:
10) Если байт не является первым в блоке данных:
11) запоминание последнего разряда предыдущего байта;
12) сдвиг байта на 1 разряд вправо;
13) запись последнего разряда предыдущего байта в первый разряд текущего.
14) Если байт является первым в блоке данных:
15) сдвиг байта на 1 разряд вправо;
16) запись последнего разряда всего блока данных в первый разряд текущего
байта.
17) Восстановление тех битов последнего байта, к которым не применялся
сдвиг.

3
5. Текст программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
class Program
{
static char[] R_Sdvig(char[] B, int N, int L)
{
int k; //Общая длина заданной строки (биты)
int kk; //Общая длина заданной строки (байты)
kk = B.Length;
k = kk * 8;

int k1; //Количество байтов строки, к которым применяется сдвиг


if (N % 8 == 0)
k1 = N / 8;
else
k1 = ((N / 8) + 1);

int k2; //Количество битов в последнем байте, которые сдвигаются


if (N % 8 == 0)
k2 = 8;
else
k2 = N % 8;

int k3; //Количество битов в последнем байте, которые остаются на месте


k3 = 8 - k2;

char[] B1 = new char[kk]; //Копия начального массива блока данных


for (int i = 0; i < kk; i++)
B1[i] = B[i];

//Фиксация битов последнего байта, которые не сдвигаются


int mask1 = 0; //Маска для последнего байта, к которыму применяется сдвиг

for (int i = 1; i <= k2; i++)


{
mask1 = mask1 + (int)Math.Pow(2, 8 - i);
}

B1[k1 - 1] = Convert.ToChar((byte)(B1[k1 - 1] & mask1));

char B12;
int mask2 = 0;

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


{
mask2 = mask2 + (int)Math.Pow(2, i);
}

B12 = Convert.ToChar((byte)(B[k1 - 1] & mask2));

//Циклический сдвиг вправо


for (int y = 0; y < L; y++)
{
//Запоминаем последний бит блока данных, который сдвигается
int mask3 = 0;
mask3 = (int)Math.Pow(2, k3);

4
char a;
a = Convert.ToChar((byte)(B1[k1 - 1] & mask3));
byte a1 = (byte)(a >> (k3 + 1));
byte a2 = (byte)(a << (7 - k3));
a = Convert.ToChar(a1 | a2);

//Сдвиг вправо одного байта


int x = 1;

while ((k1 - x) != 0) //Если байт не является первым в блоке данных


{
//Запоминаем последний разряд предыдущего байта
int mask4 = 0;
mask4 = (int)Math.Pow(2, 0);

char d;
d = Convert.ToChar((byte)(B1[k1 - 1 - x] & mask4));
byte d1 = (byte)(d >> 1);
byte d2 = (byte)(d << 7);
d = Convert.ToChar(d1 | d2);

//Сдвигаем байт на 1 разряд вправо


byte q = (byte)(B1[k1 - x] >> 1);
B1[k1 - x] = Convert.ToChar(q);

if (x == 1)
{
B1[k1 - x] = Convert.ToChar((byte)(B1[k1 - x] & mask1));
}

//Записываем последний разряд предыдущего байта в первый разряд


текущего
B1[k1 - x] = Convert.ToChar(B1[k1 - x] | d);

x++;
}

if (x == k1) //Если байт является первым в блоке данных


{
//Сдвигаем байт на 1 разряд вправо
byte q = (byte)(B1[k1 - x] >> 1);
B1[k1 - x] = Convert.ToChar(q);

if (x == 1)
{
B1[k1 - x] = Convert.ToChar((byte)(B1[k1 - x] & mask1));
}

//Записываем последний разряд всего блока данных в первый разряд


текущего байта
B1[k1 - x] = Convert.ToChar(B1[k1 - x] | a);
}
}

//Восстанавливаем те биты последнего байта, которые не сдвигались


B1[k1 - 1] = Convert.ToChar(B1[k1 - 1] | B12);

return B1;
}

static void Main(string[] args)


{
Console.WriteLine("Добро пожаловать!");

5
string st; //Входная строка
Console.WriteLine("Введите строку, над которой необходимо произвести
преобразование:");
st = Console.ReadLine();

Encoding ascii = Encoding.ASCII;


Byte[] bytes = ascii.GetBytes(st);
char[] b = new char[bytes.Length];
for (int i = 0; i < bytes.Length; i++)
b[i] = Convert.ToChar(bytes[i]);

int n; //Длина блока данных в битах


Console.WriteLine("Введите количество битов, которые будут сдвинуты:");
n = Convert.ToInt32(Console.ReadLine());

int l; //Количество разрядов сдвига


Console.WriteLine("Введите количество разрядов сдвига:");
l = Convert.ToInt32(Console.ReadLine());
Console.WriteLine();

int l1;
l1 = l % n;

char[] b1 = new char[bytes.Length]; //Результат

b1 = R_Sdvig(b, n, l1);

Console.WriteLine("Результат:");
for (int i = 0; i < b1.Length; i++)
Console.Write(b1[i]);
Console.WriteLine();

Console.WriteLine("Для завершения работы нажмите любую клавишу... ");


Console.ReadLine();
}
}
}

6. Инструкция пользователю
Программа, созданная при выполнении данной лабораторной работы,
реализует процедуру циклического сдвига вправо блока данных на заданное
количество разрядов. При запуске программы на экран выводятся сообщения
о необходимости ввода входных данных. Входные данные программы: блок
данных (строка, над которой необходимо произвести преобразование);
количество битов, которые будут сдвинуты; количество разрядов сдвига.
После ввода корректных входных данных происходит выполнение
программы. В результате выполнения программы на экран выводится
преобразованный блок данных.

6
7. Инструкция программисту
Программа, созданная при выполнении данной лабораторной работы,
реализует процедуру циклического сдвига вправо блока данных на заданное
количество разрядов.
Программа содержит функцию циклического сдвига вправо char[]
R_Sdvig(char[] B, int N, int L). Аргументы функции: char[] B - массив блока
данных; int N - длина блока данных в битах; int L - количество разрядов
сдвига.

8. Тестовый пример работы программы


1) Блок данных: DES, N = 24, L = 2.
Результаты расчетов:
До сдвига 01000100 01000101 01010011
(68 или D) (69 или E) (83 или S)
После сдвига 11010001 00010001 01010100
(209) (17) (84)

Рисунок 1, 2 – результаты работы программы при заданных входных


данных.

Рисунок 1 - Результаты работы программы

Рисунок 2 - Результаты работы программы


2) Блок данных: DES, N = 13, L = 2.
7
Результаты расчетов:
До сдвига 01000100 01000101 01010011
(68 или D) (69 или E) (83 или S)
После сдвига 00010001 00010101 01010011
(17) (21) (83)

Рисунок 3, 4 – результаты работы программы при заданных входных


данных.

Рисунок 3 - Результаты работы программы

Рисунок 4 - Результаты работы программы

Результаты работы программы совпадают с результатами проведенных


расчетов.

9. Вывод
В процессе выполнения лабораторной работы мы ознакомились с
методами реализации основных процедур стандарта DES, приобрели навыки
программирования криптографических процедур. Программа, созданная в
данной лабораторной работе, позволяет осуществлять циклический сдвиг
вправо блока данных. Процедура циклического сдвига вправо блока данных
на заданное количество разрядов используется в алгоритме DES на этапе
расшифрования.
8
9