Академический Документы
Профессиональный Документы
Культура Документы
Лабораторная работа № 4
Методы криптографии. Реализация процедур стандарта DES
Тула 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;
char B12;
int mask2 = 0;
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);
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);
if (x == 1)
{
B1[k1 - x] = Convert.ToChar((byte)(B1[k1 - x] & mask1));
}
x++;
}
if (x == 1)
{
B1[k1 - x] = Convert.ToChar((byte)(B1[k1 - x] & mask1));
}
return B1;
}
5
string st; //Входная строка
Console.WriteLine("Введите строку, над которой необходимо произвести
преобразование:");
st = Console.ReadLine();
int l1;
l1 = l % n;
b1 = R_Sdvig(b, n, l1);
Console.WriteLine("Результат:");
for (int i = 0; i < b1.Length; i++)
Console.Write(b1[i]);
Console.WriteLine();
6. Инструкция пользователю
Программа, созданная при выполнении данной лабораторной работы,
реализует процедуру циклического сдвига вправо блока данных на заданное
количество разрядов. При запуске программы на экран выводятся сообщения
о необходимости ввода входных данных. Входные данные программы: блок
данных (строка, над которой необходимо произвести преобразование);
количество битов, которые будут сдвинуты; количество разрядов сдвига.
После ввода корректных входных данных происходит выполнение
программы. В результате выполнения программы на экран выводится
преобразованный блок данных.
6
7. Инструкция программисту
Программа, созданная при выполнении данной лабораторной работы,
реализует процедуру циклического сдвига вправо блока данных на заданное
количество разрядов.
Программа содержит функцию циклического сдвига вправо char[]
R_Sdvig(char[] B, int N, int L). Аргументы функции: char[] B - массив блока
данных; int N - длина блока данных в битах; int L - количество разрядов
сдвига.
9. Вывод
В процессе выполнения лабораторной работы мы ознакомились с
методами реализации основных процедур стандарта DES, приобрели навыки
программирования криптографических процедур. Программа, созданная в
данной лабораторной работе, позволяет осуществлять циклический сдвиг
вправо блока данных. Процедура циклического сдвига вправо блока данных
на заданное количество разрядов используется в алгоритме DES на этапе
расшифрования.
8
9