ВКР Чирков А.А. 24Б (1213186), страница 8
Текст из файла (страница 8)
if (!string.IsNullOrEmpty(tbx_Key.Text))
{
byte[] mess = Encoding.GetEncoding(1251).GetBytes(tbx_SetSecretMess.Text).ToArray();
byte[] keymess = Encoding.GetEncoding(1251).GetBytes(tbx_Key.Text).ToArray();
List<byte> Closemess = cipher.Encript(mess, keymess);
string strmess = Encoding.GetEncoding(1251).GetString(Closemess.GetRange(0, Closemess.Count).ToArray());
listbytes = Encoding.GetEncoding(1251).GetBytes("/" + strmess + "<e>").ToList(); //конвертирование текста из текстбокса и тегов начала и конца сообщения в байты
if (image != null) //если картинка выбрана
{
if (cript.IsLabeledPhoto(image) == 0) //если в ней нет сообщения
{
cript.WriteInPhoto(image, listbytes); //вызываем метод для запсии
listbytes.Clear(); //очищаем лист байтов
image.Save(FileStartPath, ImageFormat.Bmp); //сохраняем измененную картинку
MessageBox.Show("Текст записан успешно"); //выводим сообщение об успещной записи
}
else { MessageBox.Show("В этой фотографии уже есть текст или файл, выберите другую"); } //выводим текст об ошибки
}
else { MessageBox.Show("Для записи текста нужно открыть изображение"); } //выводим текст об ошибки
}
else { MessageBox.Show("Введите ключ шифрования"); }
}
else { MessageBox.Show("Чтобы записать текст нужно написать сообщение"); } //выводим текст об ошибки
}
private void btn_OpenFile_Click(object sender, EventArgs e) //кнопка открыть файл
{
OpenFileDialog ofd = new OpenFileDialog(); //создание объекта класса OpenFileDialog
ofd.Filter = "Все файлы (*.*)|*.*"; //задаем фильтр на отображение файлов
ofd.ShowDialog(); //открываем окно для выбора файла
if (!string.IsNullOrEmpty(ofd.FileName)) //если путь к файлу не пустой(файл выбран)
{
FileEndPath = ofd.FileName; //получаем путь к файлу
btn_BuildInFile.Enabled = true;
lbl_Path.Text = FileEndPath; //выводим путь в лейбл
lbl_Path.Visible = true;
tbx_SetSecretMess.Enabled = false;
btn_BuildInText.Enabled = false;
}
else { lbl_Path.Text = ""; MessageBox.Show("Файл не выбран"); } //выводим сообщение об ошибке
}
private void btn_BuildInFile_Click(object sender, EventArgs e) //записать файл
{
if (!string.IsNullOrEmpty(tbx_Key.Text))
{
if (image != null)
{
keymass = null;
List<byte> list = new List<byte>(); //создаем лист байтов
list.Add(Encoding.GetEncoding(1251).GetBytes("<")[0]); //добавляем байт сконвертированный из символа '<'
list.AddRange(Encoding.GetEncoding(1251).GetBytes(new FileInfo(FileEndPath).Name)); //добавляем байты сконвертированные из имени файла
list.AddRange(Encoding.GetEncoding(1251).GetBytes("<N>")); //добавляем байт сконвертированный из символа '<N>'
massbytes = File.ReadAllBytes(FileEndPath); //Счимтываем байты из файла
list.AddRange(new MD5CryptoServiceProvider().ComputeHash(massbytes)); //Добавляем хэш
list.AddRange(Encoding.GetEncoding(1251).GetBytes("<H>")); //добавляем байт сконвертированный из символа <H>
keymass = Encoding.GetEncoding(1251).GetBytes(tbx_Key.Text).ToArray();
List<byte> Closemess = cipher.Encript(massbytes, keymass);
list.AddRange(Closemess); //добавляем байты сконвертированные(считанные) из файла
list.AddRange(Encoding.GetEncoding(1251).GetBytes("<e>")); //добавляем байт сконвертированный из '<e>'
if (image.Width * image.Height >= list.Count) //если количество символов в байте не превышает количество пикселей картинки
{
cript.WriteInPhoto(image, list); //вызываем метод на запись файла в картинку
image.Save(FileStartPath, ImageFormat.Bmp); //сохраняем измененную картинку
MessageBox.Show("Файл успешно записан"); //выводим сообщение об успешной записи
}
else
MessageBox.Show("Файл слишком велик для записи"); //выводим сообщение об ошибке
}
else
MessageBox.Show("Изображение-контейнер не выбран");
}
else
MessageBox.Show("Введите ключ шифрования");
}
private void btn_SelectImageContainer_Click(object sender, EventArgs e) //Действие по нажатию на кнопку Выбрать картинку
{
btn_ExtractText.Enabled = false;
btn_ExtractFile.Enabled = false;
tbx_GetSecretMess.Text = null;
OpenFileDialog ofd = new OpenFileDialog(); //создаем объект класса OpenFileDialog
ofd.Filter = "Файлы изображений (*.bmp)|*.bmp"; //задаем фильтр типов файлов на отображение
ofd.ShowDialog(); //открываем окно выбора файла
if (!string.IsNullOrEmpty(ofd.FileName)) //если путь к файлу не пустой(файл выбран)
{
FileStartPath = ofd.FileName; //получаем путь к выбранному изображению
//tbx_SetSecretMess.Text = null; //очищаем текстбокс
FileStream fs = new FileStream(FileStartPath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); //создаем объект класса FileStream с параметрами путь к файлу, и доступом на чтение запись
image = new Bitmap(fs); //получаем картнику
fs.Dispose(); //освобождаем все ресурсы используемые объектом fs
int type = cript.IsLabeledPhoto(image); //получаем номер типа сообщения в картинке(0- нет, 1-текст, 2-файл)
if (type == 1) //если 1
{
btn_ExtractText.Enabled = true;
tbx_SetSecretMess.Enabled = false;
btn_BuildInText.Enabled = false;
btn_OpenFile.Enabled = false;
btn_BuildInFile.Enabled = false;
lbl_Path.Enabled = false;
}
else if (type == 2) //если 2
{
btn_ExtractFile.Enabled = true;
tbx_SetSecretMess.Enabled = false;
btn_BuildInText.Enabled = false;
btn_OpenFile.Enabled = false;
btn_BuildInFile.Enabled = false;
lbl_Path.Enabled = false;
}
else if (type == 0) //если 2
{
btn_ExtractText.Enabled = false;
btn_ExtractFile.Enabled = false;
tbx_SetSecretMess.Enabled = true;
lbl_Path.Enabled = true;
btn_OpenFile.Enabled = true;
if (lbl_Path.Visible == true) { btn_BuildInFile.Enabled = true; }
if (!string.IsNullOrEmpty(tbx_SetSecretMess.Text)) { btn_BuildInText.Enabled = true; }
}
pctrbx_Image.SizeMode = PictureBoxSizeMode.Zoom; //режим отображения в пикчебоксеэ
pctrbx_Image.ImageLocation = ofd.FileName; //путь к изображению в пикчебоксе
}
}
private void btn_ExtractText_Click(object sender, EventArgs e) //извлечь текст
{
if (!string.IsNullOrEmpty(tbx_Key.Text))
{
byte[] mess = Encoding.GetEncoding(1251).GetBytes(cript.GetTextFromPhoto(image)).ToArray();
byte[] keymess = Encoding.GetEncoding(1251).GetBytes(tbx_Key.Text).ToArray();
List<byte> Openmess = cipher.Decript(mess, keymess);
tbx_GetSecretMess.Text = Encoding.GetEncoding(1251).GetString(Openmess.GetRange(0, Openmess.Count).ToArray());//выводим сообщение из картинки в текстбокс ascii-20127
}
else { MessageBox.Show("Введите ключ шифрования"); }
}
private void btn_ExtractFile_Click(object sender, EventArgs e) //извлечь файл
{
if (!string.IsNullOrEmpty(tbx_Key.Text))
{
keymass = null;
List<byte> message = cript.GetFileFromPhoto(image); //получаем лист байтов из картинки
int start = 0; //индекс начала считывания массива
string name = ""; //присваиваем пустое значение
byte[] hashcode = null; //массив для хэша
for (int i = 0; i < message.Count; i++)
{
string m = Encoding.GetEncoding(1251).GetString(message.GetRange(start, i - start + 1).ToArray()); // конвертируем лист байтов в стринг
if (m.Length >= 3)
if (string.IsNullOrEmpty(name))
{
if (m.Substring(m.Length - 3, 3) == "<N>") //если последние 3 символов равны '<N>'
{
name = m.Substring(0, m.Length - 3); //получаем имя файла с расширением
start = i + 1;
}
}
else if (hashcode == null)
{
if (m.Substring(m.Length - 3, 3) == "<H>") //если последние 3 символов равны '<H>'
{
hashcode = message.GetRange(start, i - start - 2).ToArray(); //получаем хэш
start = i + 1;
}
}
else if (hashcode != null) //если name не равен null
{
List<byte> Openmess = cipher.Decript(message.GetRange(start, message.Count - start - 3).ToArray(), Encoding.GetEncoding(1251).GetBytes(tbx_Key.Text).ToArray());
massbytes = Openmess.ToArray(); //получаем массив байтов файла
break;
}
}
if (!EqualMass(hashcode, new MD5CryptoServiceProvider().ComputeHash(massbytes))) //сравниваем хэш полученный из картинки и хэш полученного файла
{
MessageBox.Show("Файл отличается от перваначально записанного"); //сообщение что файл был изменен
return;
}
else
{
File.WriteAllBytes(name, massbytes.ToArray()); //записываем указанный массив байт под указанным именем как файл в папку с программой
//File.Create(
MessageBox.Show("Файл извлечен в пакпу с программой"); //вывод сообщения об извлечениее файла из картнки
}
}
else
MessageBox.Show("Введите ключ шифрования");
}
bool EqualMass(byte[] mass1, byte[] mass2) //Метод сравнения двух массивов
{
bool bEqual = false;
if (mass1.Length == mass2.Length)
{
int i = 0;
while ((i < mass1.Length) && (mass1[i] == mass2[i]))
{
i += 1;
}
if (i == mass1.Length)
{
bEqual = true;
}
}
return bEqual;
}
}
Класс «Program.cs»:
static class Program
{ /// <summary>
/// Главная точка входа для приложения.
/// </summary>
[STAThread]
static void Main()
{Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Main());
}
Приложение Б
Схема классов















