Отчёт по лабораторной работе №4 по курсу «Безопасность программ и данных» по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ”




Скачать 244.95 Kb.
НазваниеОтчёт по лабораторной работе №4 по курсу «Безопасность программ и данных» по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ”
Дата публикации12.08.2013
Размер244.95 Kb.
ТипОтчет
lit-yaz.ru > Математика > Отчет


МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ

Донецкий Национальный технический университет

Кафедра прикладной математики и информатики


Отчёт

по лабораторной работе №4

по курсу «Безопасность программ и данных»

по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ”

Вариант 15
Выполнил: ст.гр. ПС-09б

______ Складчиков В.А.

«__» ___________ 2012 г.

Принял______________

«____» ________2012 г.


Донецк 2012

^ 1 АЛГОРИТМ DES С РЕЖИМОМ ШИФРОВАНИЯ СВС
В качестве симметричного алгоритма используется алгоритм DES с режимом шифрования CBC.

В режиме шифрования CBC происходит "сцепливание" всех блоков сообщения по шифротексту.
image50
Как видно из рисунка в алгоритме шифрования на вход функции image45 каждый раз подаётся результат суммирования по модулю 2 открытых данных очередного блока сообщения (на рисунке – PLAINTEXT) и выходных данных (на рисунке – OUTPUT BLOCK) функции image45 для предыдущего блока. Поскольку выходные данные функции image45 для очередного блока идут прямо на выход алгоритма CBC, то есть являются шифротекстом этого блока и одновременно поступают на вход этой же функции для зашифрования последующего блока, то говорят, что происходит сцепление блоков по шифротексту. Первый блок открытых данных суммируется с т.н. вектором инициализации, который становится известен как отправителю, так и получателю в самом начале сеанса связи (поэтому зачастую его называют просто синхропосылкой). Расшифрование происходит, соответственно, в обратном порядке – сначала к шифротексту применяют функцию image46, а затем суммируют с предыдущим блоком шифротекста для получения на выходе алгоритма очередного блока открытого текста. Первый блок открытого текста, опять же, восстанавливается с помощью вектора инициализации. Таким образом весь алгоритм может быть выражен в виде уравнений следующим образом:

CBC зашифрование: image51

CBC зашифрование: image52

В уравнениях приняты следующие обозначения:

^ IV – вектор инициализации (на рисунке – Initialization Vector);

Pj – очередной, j-ый блок открытого текста.

Cj – очередной, j-ый блок шифротекста.

Поскольку, как наглядно следует из рисунка, в режиме CBC при зашифровании каждая итерация алгоритма зависит от результата предыдущей итерации, то зашифрование сообщения не поддаётся распараллеливанию. Однако в режиме расшифрования, когда весь шифротекст уже получен, функции image46 вполне можно исполнять параллельно и независимо для всех блоков сообщения. Это даёт значительный выигрыш по времени. В этом режиме стоит остановиться ещё на одной детали. Дело в том, что последний блок шифротекста, который получается на выходе алгоритма режима CBC зависит как от ключа блочного шифра и вектора инициализации, так и (что важнее в данном случае) от всех бит отрытого текста сообщения. А это означает, что этот последний блок шифротекста можно использовать как своего рода идентификатор сообщения. Такой идентификатор не даёт постороннему наблюдателю никакой информации о содержимом всего сообщения в целом, и в то же время, практически однозначно определяет его (сообщение). Более того подделать этот идентификатор без знания ключа шифрования K так же трудно, как и правильно угадать сам ключ. Этот идентификатор широко используется для аутентификации сообщений и отправителей и носит название MAC (Message Authentication Code), в русскоязычной литературе – КАС (код аутентификации сообщения).

В качестве симметричного алгоритма используем RSA.

Генерирование пары ключей начинается с создания двух больших простых чисел, именуемых p и q. Эти числа перемножаются и результат называется n. Так как оба числа p и q являются простыми, единственные множители n – это 1, p, q и n.

Если учитывать только числа меньше n, то количество чисел, взаимно простых с n (не имеющих с n общих множителей), равно (p - 1)(q - 1).

Теперь выберем число e, являющееся взаимно простым с вычисленным нами значением. Открытый ключ теперь представляется в виде {e, n}.

Чтобы создать закрытый ключ, необходимо вычислить такое число d, что (d)(e) mod n = 1. В соответствии с алгоритмом Евклида закрытый ключ теперь – {d, n}.

Шифрование простого текста m в зашифрованный c определяется как c = (m ^ e) mod n. Дешифрование в таком случае определяется как m = (c ^ d) mod n.


^ 2 CТРУКТУРА ПРОГРАММЫ




Рисунок 2.1 – Структура программы

^ 3 КОД ПРОГРАММЫ

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Security.Cryptography;

using System.IO;

namespace DigitalSignature.Crypto

{

class Encryptor

{

private DESCryptoServiceProvider des; //предоставляет методы шифрования по симметричному алгоритму DES

private RSACryptoServiceProvider rsa; // криптографический алгоритм с открытым ключом

private CspParameters cspp; //Содержит параметры, передаваемые поставщику служб шифрования (CSP), который выполняет криптографические вычисления.

private string filePath; //путь к файлу
private const string keyName = "Key01";
public Encryptor()

{

des = new DESCryptoServiceProvider();

des.Mode = CipherMode.CBC; //Получает или задает режим работы алгоритма симметричного шифрования

des.BlockSize = 64; //Получает или задает размер блока криптографической операции (в битах)

des.KeySize = 64; //Получает или задает размер секретного ключа (в битах)

// des.Mode = CipherMode.CBC;

des.Padding = PaddingMode.Zeros; //Получает или задает режим заполнения, используемый в алгоритме симметричного шифрования

cspp = new CspParameters();

filePath = "";

}


public string CreateKeys()

{

string message = "Key: ";

cspp.KeyContainerName = keyName; // имя контейнера ключей
rsa = new RSACryptoServiceProvider(cspp); // инициализация экземпляра класса

rsa.PersistKeyInCsp = true; // ключ будет храниться в CSP
if (rsa.PublicOnly == true) // содержится ли в объекте RSACryptoServiceProvider

// только открытый ключ

{

message += cspp.KeyContainerName + " - Public Only";

}

else

{

message += cspp.KeyContainerName + " - Full Key Pair";

}

return message;

}
public string GetPrivateKey()

{

string message = "Key: ";

cspp.KeyContainerName = keyName;

rsa = new RSACryptoServiceProvider(cspp);

rsa.PersistKeyInCsp = true;

if (rsa.PublicOnly == true)

{

message += cspp.KeyContainerName + " - Public Only";

}

else

{

message += cspp.KeyContainerName + " - Full Key Pair";

}

return message;

}
public string ImportPublicKey(string pubKeyPath)

{

string message = "Key: ";

StreamReader streamReader = new StreamReader(pubKeyPath);
cspp.KeyContainerName = keyName; // имя контейнера ключей

rsa = new RSACryptoServiceProvider(cspp);

string keyText = streamReader.ReadToEnd();
rsa.FromXmlString(keyText); //инициализация объекта rsa из XML-строки

rsa.PersistKeyInCsp = true; // ключ будет храниться в CSP
if (rsa.PublicOnly == true)

{

message += cspp.KeyContainerName + " - Public Only";

}

else

{

message += cspp.KeyContainerName + " - Full Key Pair";

}

streamReader.Close();

return message;

}
public void ExportPublicKey(string pubKeyPath)

{

StreamWriter streamWriter = new StreamWriter(pubKeyPath);

streamWriter.Write(rsa.ToXmlString(false)); // получаем XML-строку только с открытым ключем (false),

// true - для открытого и закрытого ключей

streamWriter.Close();

}

public string getEncFilePath()

{

return filePath;

}

public void Encrypt(string pathInputFile, string pathOutputFile)

{

if (rsa == null)

{

throw new Exception("Ключи не найдены");

}
//string encPath = pathOutputFile;

filePath = pathOutputFile;
des.GenerateKey();//Создает случайный ключ (Key), используемый для данного алгоритма.

des.GenerateIV();//Создает случайный вектор инициализации (IV)

//ICryptoTransform - Определяет основные операции криптографических преобразований.

ICryptoTransform encryptor = des.CreateEncryptor(); //Создаем объект-шифратор для алгоритма симметричного шифрования с текущим свойством Key и вектором инициализации (IV)

FileStream outputStream = new FileStream(pathOutputFile, FileMode.Create);

BinaryWriter writer = new BinaryWriter(outputStream);
// CryptoStream - Определяет поток, который связывает потоки данных с криптографическими преобразованиями.

CryptoStream cryptoWriter = new CryptoStream(outputStream, encryptor, CryptoStreamMode.Write);

BinaryWriter ecryptWriter = new BinaryWriter(cryptoWriter);
byte[] encryptedKey = rsa.Encrypt(des.Key, false); // Выполняем зашифрование данных с помощью алгоритма RSA

// false — для использования заполнения по стандарту PKCS 1 v1.5.

writer.Write(encryptedKey.Length);

writer.Write(des.BlockSize / 8);

writer.Write(encryptedKey, 0, encryptedKey.Length);

writer.Write(des.IV, 0, des.BlockSize / 8);
ecryptWriter.Write(File.ReadAllBytes(pathInputFile));
ecryptWriter.Close();

writer.Close();

}
public void Decrypt(string pathInputFile, string pathOutputFile)

{

if (rsa == null)

{

throw new Exception("Ключи не найдены");

}
string decPath = pathOutputFile;

string path = pathInputFile;
ICryptoTransform decryptor = des.CreateDecryptor();
FileStream inputStream = new FileStream(path, FileMode.Open);

BinaryReader reader = new BinaryReader(inputStream);

CryptoStream cryptoWriter = new CryptoStream(new FileStream(decPath, FileMode.Create), decryptor, CryptoStreamMode.Write);

BinaryWriter decryptWriter = new BinaryWriter(cryptoWriter);
int keyLength = reader.ReadInt32();

int blockLength = reader.ReadInt32();

int length = (int)inputStream.Length;

des.Key = rsa.Decrypt(reader.ReadBytes(keyLength), false);

des.IV = reader.ReadBytes(blockLength);
reader.Close();
int offset = keyLength + blockLength + 8;

decryptWriter.Write(File.ReadAllBytes(path), offset, length - offset);
decryptWriter.Close();

reader.Close();

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Security.Cryptography;

namespace DigitalSignature.ECP

{

class DigitalSignature

{

DigitalSignatureHelper ds;

byte[] hash1;

byte[] hash2;

byte[] signedhash;

byte[] fileBytes;

byte[] signBytes;

int messageLength;

int signedLength;
public DigitalSignature()

{

ds = new DigitalSignatureHelper();

}
public void SignFile(string path)

{

FileStream fileStream = File.Open(path, FileMode.Append, FileAccess.Write);

MD5HashHelper md5 = new MD5HashHelper(); //создали объект
hash1 = md5.GetHash(fileBytes);

signBytes = fileBytes;

signedhash = ds.CreateSignature(hash1);
BinaryWriter binaryWriter = new BinaryWriter(fileStream);

binaryWriter.Write(signedhash);

signedLength = signedhash.Length;

binaryWriter.Close();

}
public bool VerifySignature()

{

MD5HashHelper md5 = new MD5HashHelper();

hash2 = md5.GetHash(signBytes);

return ds.VerifySignature(hash2, signedhash);

}
public void OpenFile(string path)

{

fileBytes = File.ReadAllBytes(path);

messageLength = fileBytes.Length;

}
public void OpenSignedFile(string path)

{

FileStream fileStream = File.OpenRead(path);

fileStream.Read(signBytes, 0, messageLength);

fileStream.Read(signedhash, 0, signedLength);

fileStream.Close();

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Security.Cryptography;
namespace DigitalSignature.ECP

{

class DigitalSignatureHelper

{

private RSAParameters m_public; //Представляет стандартные параметры для алгоритма RSA.
public byte[] CreateSignature(byte[] hash)

{

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);

RSAFormatter.SetHashAlgorithm("MD5");

m_public = RSA.ExportParameters(false);

return RSAFormatter.CreateSignature(hash);

}
public bool VerifySignature(byte[] hash, byte[] signedhash)

{

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

RSAParameters RSAKeyInfo = new RSAParameters();

RSAKeyInfo.Modulus = m_public.Modulus; //Представляет параметр Modulus для алгоритма RSA.

RSAKeyInfo.Exponent = m_public.Exponent; //Представляет параметр Exponent для алгоритма RSA.

RSA.ImportParameters(RSAKeyInfo);

RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA); //Выполняет расшифрование данных обмена ключами, зашифрованных с использованием заполнения OAEP.

RSADeformatter.SetHashAlgorithm("MD5");

return RSADeformatter.VerifySignature(hash, signedhash);

}
}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Security.Cryptography;
namespace DigitalSignature.ECP

{

class MD5HashHelper

{

public byte[] GetHash(byte[] data)

{

MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

return md5.ComputeHash(data, 0, data.Length);

}
public bool VerifyHash(byte[] data, byte[] hash)

{

MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

byte[] hashTemp = md5.ComputeHash(data, 0, data.Length);

bool equals = true;

for (int i = 0; i < hash.Length && equals; i++)

{

equals = hash[i] == hashTemp[i];

}

return equals;

}
}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using DigitalSignature.ECP;

using DigitalSignature.Crypto;

using System.IO;
namespace DigitalSignatureConsole

{

class Program

{

static void Main(string[] args)

{

DigitalSignature.ECP.DigitalSignature digitalSignature = new DigitalSignature.ECP.DigitalSignature();;

Encryptor encryptor = new Encryptor();

const string keyName = "Key01";

while (true)

{

Console.WriteLine("1 - Создать ключи");

Console.WriteLine("2 - Шифровать");

Console.WriteLine("3 - Дешифровать");

Console.WriteLine("4 - Импортировать открытый ключ");

Console.WriteLine("5 - Экспортировать открытый ключ");

Console.WriteLine("6 - Получить закрытый ключ");

Console.WriteLine("7 - Открыть файл");

string state = Console.ReadLine();

switch (state)

{

case "2": try

{

Console.Clear();

Console.WriteLine("1 - Просто шифрование");

Console.WriteLine("2 - Шифрование + ЭЦП");

string state2 = Console.ReadLine();

switch(state2)

{

case "2":

encryptor.Encrypt(getFilePath(1),getFilePath(2)); //шифрую указанный файл

digitalSignature.OpenFile(encryptor.getEncFilePath()); //"связь" файла и ЭЦП

digitalSignature.SignFile(encryptor.getEncFilePath());//установка ЭЦП для файла

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

break;
case "1":

encryptor.Encrypt(getFilePath(1), getFilePath(2)); //шифрую указанный файл

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

break;
}

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

Console.ReadLine();

}

break;
case "1":

Console.WriteLine(encryptor.CreateKeys());

break;
case "3":

try

{

Console.Clear();

Console.WriteLine("1 - Просто дешифрование");

Console.WriteLine("2 - Дешифрование + ЭЦП");

string state2 = Console.ReadLine();

switch(state2)

{

case "2":

string pathInputFile = getFilePath(1);

string pathOutputFile = getFilePath(2);

digitalSignature.OpenSignedFile(pathInputFile);//"связь " ЭЦП и файла

if (digitalSignature.VerifySignature())

{

encryptor.Decrypt(pathInputFile,pathOutputFile);

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

}

else

{

Console.WriteLine("Подпись неверная!");

}

break;
case "1": encryptor.Decrypt(getFilePath(1), getFilePath(2));

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

break;
}

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

break;

case "4":

try

{

Console.WriteLine(encryptor.ImportPublicKey(getFilePath(3)));

}

catch (Exception ex)

{

Console.WriteLine(ex);

}

break;
case "5":

try

{

encryptor.ExportPublicKey(getFilePath(3));

}

catch (Exception ex)

{

Console.WriteLine(ex.Message);

}

break;
case "6":

Console.WriteLine(encryptor.GetPrivateKey());

break;

case "7":

Console.Write("Введите имя файла:");

openFile(Console.ReadLine());

break;

}

Console.ReadLine();

Console.Clear();

}

}


static string getFilePath(int state)

{

if (state == 1)

{

Console.Write("Введите имя входного файла:");

return Console.ReadLine();

}

else if (state == 2)

{

Console.Write("Введите имя выходного файла:");

return Console.ReadLine();

}

else

{

Console.Write("Введите имя файла:");

return Console.ReadLine();

}

}
static void openFile(string path)

{

StreamReader sr = new StreamReader(path);

string str;

while ((str = sr.ReadLine()) != null)

Console.WriteLine(str);
sr.Close();

}

}

}

4 ПРИМЕРЫ РАБОТЫ ПРОГРАММЫ



Рисунок 4.1 – Главное меню



Рисунок 4.2 – Создание ключей


Рисунок 4.3 – Шифрование с ЭЦП


Добавить документ в свой блог или на сайт

Похожие:

Отчёт по лабораторной работе №4 по курсу «Безопасность программ и данных» по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ” iconОтчет по лабораторной работе должен содержать введение, отражающее...
Для каждой лабораторной работы приведены перечень теоретических вопросов для сдачи коллоквиумов и перечень вопросов для сдачи отчетов....

Отчёт по лабораторной работе №4 по курсу «Безопасность программ и данных» по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ” iconМиллард Эриксон Христианское богословие
Количество страниц: 936 наст ел формата, что равняется 1400 стандартных (250 слов), 10 данных страниц = 16 стандартных

Отчёт по лабораторной работе №4 по курсу «Безопасность программ и данных» по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ” iconУрок с презентацией по теме «Противопожарная безопасность»
На изучение данной темы по курсу обж в 4 классе по программе отведено 2 часа. Разработанный урок является уроком усвоения новых знаний....

Отчёт по лабораторной работе №4 по курсу «Безопасность программ и данных» по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ” iconОтчёт По лабораторной работе №1 По курсу «Основы проектирования систем...
Экспертные системы вместе с системами обработки естественных языков являются наиболее важными в коммерческом плане областями использования...

Отчёт по лабораторной работе №4 по курсу «Безопасность программ и данных» по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ” iconОтчет по лабораторной работе Отчет представляет собой таблицу вида
В первом окне выводятся различные элементы управления (RadioButton, CheckBox, MaskEdit – в соответствии с заданием)

Отчёт по лабораторной работе №4 по курсу «Безопасность программ и данных» по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ” iconОтчет по лабораторной работе №2 Ревизия
Лабораторная работа Разработка многопроцессного приложения для анализа логов web-сервера 5

Отчёт по лабораторной работе №4 по курсу «Безопасность программ и данных» по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ” iconОтчет о работе научно образовательного центра имагологии и мониниторинга сми
В 2011 г в Ноц велась работа в соответствии с ведущей темой исследований: «Системное изучение средств массовой коммуникации стран...

Отчёт по лабораторной работе №4 по курсу «Безопасность программ и данных» по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ” iconЮрист Романовская Нина Гумаровна
...

Отчёт по лабораторной работе №4 по курсу «Безопасность программ и данных» по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ” iconОтчет по лабораторной работе Тема: «Умножение разреженных матриц»
Государственное образовательное учреждение высшего профессионального образования Нижегородский государственный университет

Отчёт по лабораторной работе №4 по курсу «Безопасность программ и данных» по теме “ Изучение стандартных средств для реализации приложений, использующих симметричное и ассиметричное шифрование ” iconОтчет по лабораторной работе Тема: «Умножение разреженных матриц»
Государственное образовательное учреждение высшего профессионального образования Нижегородский государственный университет



Образовательный материал



При копировании материала укажите ссылку © 2013
контакты
lit-yaz.ru
главная страница