Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчёт по лабораторным.docx
Скачиваний:
13
Добавлен:
18.11.2022
Размер:
494.32 Кб
Скачать

Лабораторная работа № 3. Асимметричное шифрование данных.

  1. Создать в блокноте файл с некоторым текстом и сохранить его на диске в кодировке Юникод.

  2. Создать в Visual Studio .Net программу, осуществляющую шифровку и расшифровку этого файла с помощью алгоритмов RSA и DES.

  3. Создать на форме меню из трёх пунктов: Ключи RSA, Шифрование и Дешифрование.

  4. В меню Ключи RSA реализовать следующие функции: создание новой пары ключей RSA, сохранение обоих ключей в файле секретного ключа, сохранение отктытого ключа в файле открытого ключа. Имена файлов выбираются пользователем с помощью элемента управления SaveFileDialog.

  5. Нанести на форму два элемента управления RichTextBox.

  6. В меню Шифрование создать следующие подменю: Выбрать файл, Зашифровать.

  7. В меню Выбрать файл реализовать следующие функции: выбор текстового файла и отображение данных из него в элементе управления RicTextBox. Выбор файла осуществляется с помощью элемента управления OpenFileDialog.

  1. В меню Зашифровать реализовать следующие функции: выбор файла открытого ключа, создание нового ключа симметричного шифрования по алгоритму DES, шифрование этого ключа и вектора инициализации с помощью выбранного открытого ключа, запись их в файл, шифрование информации из элемента управления RichTextBox с помощью симметричного ключа, запись зашифрованной информации в тот же файл, в который был записан зашифрованный симметричный ключ. Имя файла с зашифровнной информацией следует выбирать с помощью элемента управления SaveFileDialog. Зашифрованная информация должна отобразиться в другом элементе управления RichTextBox.

  1. В меню Дешифрование создать следующие пункты: Выбрать файл, Расшифровать.

  2. В меню Выбрать файл реализовать следующие функции: выбор текстового файла с зашифрованной информацией и отображение данных из него в элементе управления RicTextBox. Выбор файла осуществляется с помощью элемента управления OpenFileDialog.

  3. В меню Расшифровать реализовать следующие функции: выбор файла секретного ключа, расшифровка с его помощью симметричного ключа и вектора инициализации для алгоритма DES, расшифровка с помощью симметричного ключа пользовательской информации и отображение этой информации во втором элементе управления RichTextBox.

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

  5. Выбрать пункт Расшифровать. В качестве файла секретного ключа выбрать файл не секретного, а открытого ключа. Проверить работу программы (в этом случае должна выдаваться ошибка, т.к. расшифровывать информацию с помощью открытого ключа нельзя).

Текст программы:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using System.Security.Cryptography;

using System.IO;

namespace Информационная_безопасность__3

{

public partial class Form1 : Form

{

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(512);

public Form1()

{

InitializeComponent();

}

private void ключиRSAToolStripMenuItem_Click(object sender, EventArgs e)

{

SaveFileDialog save = new SaveFileDialog();

save.Filter = "Бинарные файлы|*.bin|Все файлы|*.*";

save.Title = "Сохранение открытого и секретного ключа";

if(save.ShowDialog()==DialogResult.OK)

{

FileStream fs = new FileStream(save.FileName, FileMode.OpenOrCreate);

StreamWriter sw = new StreamWriter(fs);

sw.Write(RSA.ToXmlString(true));

sw.Flush();

fs.Close();

}

SaveFileDialog sf = new SaveFileDialog();

sf.Filter = "Бинарные файлы|*.bin|Все файлы|*.*";

sf.Title = "Сохранение открытого ключа";

if(sf.ShowDialog()==DialogResult.OK)

{

FileStream fis = new FileStream(sf.FileName, FileMode.OpenOrCreate);

StreamWriter stw = new StreamWriter(fis);

stw.Write(RSA.ToXmlString(false));

stw.Flush();

fis.Close();

label1.Text = "Пара ключей успешно создана";

}

}

private void выбратьФайлToolStripMenuItem_Click(object sender, EventArgs e)

{

richTextBox2.Clear();

richTextBox1.Clear();

richTextBox1.Visible = true;

OpenFileDialog open = new OpenFileDialog();

open.Filter= "Текстовые файлы|*.txt|Все файлы|*.*";

open.Title = "Открытие файла";

if (open.ShowDialog() == DialogResult.OK)

{

StreamReader sr = new StreamReader(open.FileName);

richTextBox1.Text = sr.ReadLine();

label1.Text = "";

зашифроватьToolStripMenuItem.Visible = true;

}

}

private void зашифроватьToolStripMenuItem_Click(object sender, EventArgs e)

{

string text;

расшифроватьToolStripMenuItem.Visible = true;

text = richTextBox1.Text;

OpenFileDialog open = new OpenFileDialog();

open.Filter = "Бинарные файлы|*.bin|Все файлы|*.*";

open.Title = "Открытие файла открытого ключа";

if(open.ShowDialog()==DialogResult.OK)

{

FileStream fs = new FileStream(open.FileName, FileMode.Open);

StreamReader sr = new StreamReader(fs);

RSA.FromXmlString(sr.ReadToEnd());

sr.Close();

fs.Close();

}

SaveFileDialog save = new SaveFileDialog();

save.Filter = "Бинарные файлы|*.bin|Все файлы|*.*";

save.Title = "Сохранение зашифрованного файла";

if(save.ShowDialog()==DialogResult.OK)

{

FileStream fs = new FileStream(save.FileName, FileMode.OpenOrCreate);

DESCryptoServiceProvider DES = new DESCryptoServiceProvider();

byte[] EK = RSA.Encrypt(DES.Key, false);

byte[] EIV = RSA.Encrypt(DES.IV, false);

fs.Write(EK, 0, EK.Length);

fs.Write(EIV, 0, EIV.Length);

ICryptoTransform trans = DES.CreateEncryptor();

CryptoStream cs = new CryptoStream(fs,trans,CryptoStreamMode.Write);

StreamWriter sw = new StreamWriter(cs);

sw.Write(text);

richTextBox1.Clear();

richTextBox2.Visible = true;

sw.Flush();

cs.FlushFinalBlock();

sw.Close();

fs.Close();

}

FileStream fis = new FileStream(save.FileName, FileMode.Open);

Int32 KBS = Convert.ToInt32(RSA.KeySize / 8);

DESCryptoServiceProvider D = new DESCryptoServiceProvider();

byte[] EnK = new byte[KBS];

byte[] EnIV = new byte[KBS];

fis.Read(EnK, 0, EnK.Length);

fis.Read(EnIV, 0, EnIV.Length);

StreamReader str = new StreamReader(fis);

richTextBox2.Text = str.ReadToEnd();

str.Close();

fis.Close();

}

private void выбратьФайлToolStripMenuItem1_Click(object sender, EventArgs e)

{

richTextBox1.Clear();

richTextBox2.Clear();

richTextBox2.Visible = true;

label1.Text = "";

расшифроватьToolStripMenuItem.Visible = true;

OpenFileDialog open = new OpenFileDialog();

open.Filter = "Бинарные файлы|*.bin|Все файлы|*.*";

open.Title = "Открытие зашифрованного файла";

if (open.ShowDialog() == DialogResult.OK)

{

FileStream fs = new FileStream(open.FileName, FileMode.Open);

Int32 KBS = Convert.ToInt32(RSA.KeySize / 8);

DESCryptoServiceProvider D = new DESCryptoServiceProvider();

byte[] EK = new byte[KBS];

byte[] EIV = new byte[KBS];

fs.Read(EK, 0, EK.Length);

fs.Read(EIV, 0, EIV.Length);

StreamReader sr = new StreamReader(fs);

richTextBox2.Text = sr.ReadToEnd();

sr.Close();

fs.Close();

}

}

private void расшифроватьToolStripMenuItem_Click(object sender, EventArgs e)

{

OpenFileDialog open = new OpenFileDialog();

open.Filter = "Бинарные файлы|*.bin|Все файлы|*.*";

open.Title = "Открытие файла секретного ключа";

if (open.ShowDialog() == DialogResult.OK)

{

FileStream fs = new FileStream(open.FileName, FileMode.Open);

StreamReader sr = new StreamReader(fs);

RSA.FromXmlString(sr.ReadToEnd());

fs.Close();

sr.Close();

}

OpenFileDialog ofd = new OpenFileDialog();

ofd.Filter = "Бинарные файлы|*.bin|Все файлы|*.*";

ofd.Title = "Расшифровка зашифрованного файла";

if (ofd.ShowDialog()==DialogResult.OK)

{

FileStream fs = new FileStream(ofd.FileName, FileMode.Open);

Int32 KBS = Convert.ToInt32(RSA.KeySize / 8);

byte[] EK = new byte[KBS];

byte[] EIV = new byte[KBS];

DESCryptoServiceProvider DES = new DESCryptoServiceProvider();

fs.Read(EK, 0, EK.Length);

fs.Read(EIV, 0, EIV.Length);

DES.KeySize = KBS;

DES.Key = RSA.Decrypt(EK, false);

DES.IV = RSA.Decrypt(EIV, false);

ICryptoTransform trans = DES.CreateDecryptor();

CryptoStream cs = new CryptoStream(fs, trans, CryptoStreamMode.Read);

StreamReader sr = new StreamReader(cs);

richTextBox1.Clear();

richTextBox1.Visible = true;

richTextBox1.Text = sr.ReadToEnd();

sr.Close();

fs.Close();

}

}

}

}

Контрольный пример:

Образец главной формы проекта:

Результат работы пункта меню «Ключи RSA»:

Результат работы пункта меню «Выбрать файл»:

Результат работы пункта меню «Зашифровать»:

Результат работы пункта меню «Расшифровать»: