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

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

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


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

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

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


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

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

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


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

Тула 2015
1. Цель работы
Приобретение навыков шифрования и дешифрования сообщений и
файлов любого вида на основе стандарта DES.

2. Задание на работу
Вариант № 3. Кодирование и декодирование в режиме «Цифровая
обратная связь (Cipher Feedback) – CFB».

3. Теоретическая справка
Самым распространенным и наиболее известным алгоритмом
симметричного шифрования является DES (Data Encryption Standard).
Алгоритм был разработан в 1977 году.
Алгоритм шифрования DES использует ключ длиной 56 бит, при этом
блоки состоят из 64 бит каждый и используется сеть Фейштеля, состоящая из
шестнадцати циклов. При шифровании данных используются как линейные,
так и нелинейные преобразования.
Для наиболее полного удовлетворения всем требованиям,
предъявляемым к коммерческим системам шифрования, реализованы
несколько режимов работы алгоритма DES. Наиболее широкое
распространение получили режимы:
 электронный шифроблокнот (Electronic Codebook ) - ECB;
 цепочка цифровых блоков (Cipher Block Chaining) - CBC;
 цифровая обратная связь (Cipher Feedback) - CFB;
 внешняя обратная связь (Output Feedback) - OFB.

DES-CFB
В этом режиме размер блока может отличаться от 64 бит. Исходный
файл M считывается последовательными t-битовыми блоками (t <= 64): M =
M(1)M(2)...M(n) (остаток дописывается нулями или пробелами).

2
64-битовый сдвиговый регистр (входной блок) вначале содержит
вектор инициализации IV, выравненный по правому краю. Для каждого
сеанса шифрования используется новый IV.
Для всех i = 1...n блок шифртекста C(i) определяется следующим
образом: C(i) = M(i) xor P(i-1), где P(i-1) - старшие t бит операции DES(С(i-
1)), причем C(0) = IV.
Обновление сдвигового регистра осуществляется путем удаления его
старших t бит и дописывания справа C(i).
Восстановление зашифрованных данных также не представляет труда:
P(i-1) и C(i) вычисляются аналогичным образом и M(i) = C(i) xor P(i-1) .

4. Алгоритм программы
На рисунке 1 показана схема работы алгоритма DES в режиме CFB.

Рисунок 1 - Работа алгоритма DES в режиме CFB

5. Текст программы
Ниже приведен полный текст программы, реализующей кодирование и
декодирование файлов в режиме CFB.

3
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace pasoib_5_1
{
class Program
{
static void Main(string[] args)
{
try
{
//Меню
Console.WriteLine("Добро пожаловать! Выберите действие:");
Console.WriteLine("1 - Шифрование файла");
Console.WriteLine("2 - Расшифрование файла");

int v;
v = Convert.ToInt32(Console.ReadLine());
Console.WriteLine();

if (v == 1) //Шифрование
{
string FileName; //Путь к файлу, который нужно зашифровать
string Encrypted; //Путь к зашифрованному файлу
string Klutch; //Ключ

Console.WriteLine("Введите путь к файлу, который нужно зашифровать");


FileName = string.Empty;
FileName = Console.ReadLine();

Console.WriteLine("Введите путь к зашифрованному файлу");


Encrypted = string.Empty;
Encrypted = Console.ReadLine();

Console.WriteLine("Введите ключ");
Klutch = string.Empty;
Klutch = Console.ReadLine();

Coder_DES_CFB(FileName, Encrypted, Klutch);

Console.WriteLine("Шифрование прошло успешно");


Console.ReadLine();
}

if (v == 2) //Расшифрование
{
string Encrypted; //Путь к зашифрованному файлу
string Decrypted; //Путь к расшифрованному файлу
string Klutch; //Ключ

Console.WriteLine("Введите путь к зашифрованному файлу");


Encrypted = string.Empty;
Encrypted = Console.ReadLine();

Console.WriteLine("Введите путь к расшифрованному файлу");


Decrypted = string.Empty;
Decrypted = Console.ReadLine();

Console.WriteLine("Введите ключ");
Klutch = string.Empty;

4
Klutch = Console.ReadLine();

Decoder_DES_CFB(Encrypted, Decrypted, Klutch);

Console.WriteLine("Расшифрование прошло успешно");


Console.ReadLine();
}
}
catch (Exception exc)
{
Console.WriteLine("Произошла ошибка: {0}", exc.Message);
Console.ReadLine();
}
}

//Шифрование
static void Coder_DES_CFB(string FileName, string Encrypted, string Klutch)
{
try
{
int LenKlutch = Klutch.Length;
byte[] KeyBytes0 = new byte[Klutch.Length * sizeof(char)];
System.Buffer.BlockCopy(Klutch.ToCharArray(), 0, KeyBytes0, 0,
KeyBytes0.Length);
byte[] KeyBytes = new byte[Klutch.Length];
int j = 0;
for (int i = 0; i < Klutch.Length * sizeof(char); i = i + 2)
{
KeyBytes[j] = KeyBytes0[i];
j++;
}

FileStream inp = File.Open(FileName, FileMode.Open);


long Len = inp.Length;
byte[] Mass = new byte[Len];
for (long i = 0; i < Len; i++)
{
Mass[i] = (byte)inp.ReadByte();
}
inp.Close();

DESCryptoServiceProvider DESalg = new DESCryptoServiceProvider();


DESalg.Mode = CipherMode.CFB;

MemoryStream mStream = new MemoryStream();


CryptoStream cStream = new CryptoStream(mStream,
new DESCryptoServiceProvider().CreateEncryptor(KeyBytes, KeyBytes),
CryptoStreamMode.Write);

cStream.Write(Mass, 0, Mass.Length);
cStream.FlushFinalBlock();

byte[] Mass1 = mStream.ToArray();

cStream.Close();
mStream.Close();

FileInfo file = new FileInfo(Encrypted);


if (file.Exists == true)
{
file.Delete();
}

FileStream outp = File.Open(Encrypted, FileMode.Create);

5
for (long i = 0; i < Mass1.Length; i++)
{
outp.WriteByte(Mass1[i]);
}
outp.Close();
}
catch (CryptographicException exc)
{
Console.WriteLine("Произошла ошибка: {0}", exc.Message);
Console.ReadLine();
}
}

//Расшифрование
static void Decoder_DES_CFB(string Encrypted, string Decrypted, string Klutch)
{
try
{
int LenKlutch = Klutch.Length;
byte[] KeyBytes0 = new byte[Klutch.Length * sizeof(char)];
System.Buffer.BlockCopy(Klutch.ToCharArray(), 0, KeyBytes0, 0,
KeyBytes0.Length);
byte[] KeyBytes = new byte[Klutch.Length];
int j = 0;
for (int i = 0; i < Klutch.Length * sizeof(char); i = i + 2)
{
KeyBytes[j] = KeyBytes0[i];
j++;
}

FileStream inp = File.Open(Encrypted, FileMode.Open);


long Len = inp.Length;
byte[] Mass1 = new byte[Len];
for (long i = 0; i < Len; i++)
{
Mass1[i] = (byte)inp.ReadByte();
}
inp.Close();

DESCryptoServiceProvider DESalg = new DESCryptoServiceProvider();


DESalg.Mode = CipherMode.CFB;

MemoryStream msDecrypt = new MemoryStream(Mass1);


CryptoStream csDecrypt = new CryptoStream(msDecrypt,
new DESCryptoServiceProvider().CreateDecryptor(KeyBytes, KeyBytes),
CryptoStreamMode.Read);

byte[] Mass2 = new byte[Mass1.Length];


csDecrypt.Read(Mass2, 0, Mass2.Length);

FileInfo file = new FileInfo(Decrypted);


if (file.Exists == true)
{
file.Delete();
}

FileStream outp = File.Open(Decrypted, FileMode.Create);


for (long i = 0; i < Mass2.Length; i++)
{
outp.WriteByte(Mass2[i]);
}
outp.Close();
}
catch (CryptographicException exc)

6
{
Console.WriteLine("Произошла ошибка: {0}", exc.Message);
Console.ReadLine();
}
}
}
}

6. Инструкция пользователю
Программа, созданная при выполнении данной лабораторной работы,
осуществляет кодирование и декодирование файлов любого типа по
алгоритму DES в режиме «Цифровая обратная связь (Cipher Feedback) –
CFB».
При запуске программы на экран выводится меню: «Добро пожаловать!
Выберите действие: 1 – Шифрование файла; 2 – Расшифрование файла». При
выборе «1» осуществляется шифрование заданного файла по алгоритму DES
в режиме CFB. Необходимо задать следующую информацию: имя с полным
путем исходного шифруемого файла (пример ввода: D:\\test\p1.txt); имя с
полным путем результирующего зашифрованного файла (пример ввода:
D:\\test\p2.txt); 8-и символьный криптографический ключ для шифрования. В
случае успешного шифрования файла выводится сообщение: «Шифрование
прошло успешно», иначе выводится сообщение «Произошла ошибка» и
описание ошибки.
При выборе «2» осуществляется расшифрование заданного файла.
Необходимо задать следующую информацию: имя с полным путем
зашифрованного файла (пример ввода: D:\\test\p2.txt); имя с полным путем
результирующего расшифрованного файла (пример ввода: D:\\test\p3.txt); 8-и
символьный ключ для расшифрования. В случае успешного выполнения
расшифрования файла выводится сообщение: «Расшифрование прошло
успешно», иначе выводится сообщение «Произошла ошибка» и описание
ошибки.

7
7. Инструкция программисту
Программа, созданная при выполнении данной лабораторной работы,
осуществляет кодирование и декодирование файлов любого типа по
алгоритму DES в режиме «Цифровая обратная связь (Cipher Feedback) –
CFB».
Программа содержит следующие функции:
 void Coder_DES_CFB(string FileName, string Encrypted, string Klutch) –
шифрование файла. Аргументы функции: string FileName - имя с полным
путем исходного шифруемого файла, string Encrypted - имя с полным путем
результирующего зашифрованного файла, string Klutch - 8-и символьный
криптографический ключ;
 void Decoder_DES_CFB(string Encrypted, string Decrypted, string Klutch)
– расшифрование файла. Аргументы функции: string Encrypted - имя с
полным путем зашифрованного файла, string Decrypted - имя с полным путем
результирующего расшифрованного файла, string Klutch - 8-и символьный
ключ.

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


При запуске программы на экран выводится меню: «Добро пожаловать!
Выберите действие: 1 – Шифрование файла; 2 – Расшифрование файла»
(рисунок 2).

Рисунок 2 – Главное меню программы

Рисунок 3 – шифрование файла p1.txt.

8
Рисунок 3 – Шифрование файла

Рисунок 4 – содержимое исходного файла p1.txt.

Рисунок 4 – Исходный файл p1.txt

Рисунок 5 – содержимое зашифрованного файла p2.txt.

Рисунок 5 - Зашифрованный файл p2.txt

Рисунок 6 – расшифрование файла p2.txt.

Рисунок 6 – Расшифрование файла

Рисунок 7 – содержимое расшифрованного файла p3.txt.

9
Рисунок 7 – Расшифрованный файл p3.txt

Содержимое расшифрованного файла p3.txt полностью совпадает с


содержимым исходного файла p1.txt.

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

10