Розробка програмного забезпечення для формування цифрового водяного знаку

Цифрова стеганографія, обґрунтування методу приховування інформації. Програмне забезпечення у середовищі C++. Шифрування та дешифрування тексту до файлу зображення із забезпеченням автентичності та цілісності файлу. Тестування програмного продукту.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык украинский
Дата добавления 22.11.2015
Размер файла 1,4 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

bool ERR_OPEN_KEY = true;

bool ERR_NO_TEXT = true;

bool ERR_TEXT_LENGTH = false;

unsigned int IMAGE_SIZE = 0;

unsigned int TEXT_SIZE = 0;

unsigned int MAX_TEXT_SIZE = 0;

unsigned int NUM_OF_SHIFR_BYTE = 1;

TPoint GetPosition(TPoint Point, int Shag, int Width)

/* Функция оперделяет следующую координату пикселя, который будет кодироваться

TPoint Point - предыдущая координата

Shag - шаг кодирования

Width - ширина Битмапа

*/

{ TPoint REZ;

REZ.y += Point.y;

int BUF = Width - Point.x - Shag;

if (BUF <= 0) {

REZ.y++; BUF = abs(BUF);

while (BUF >= Width)

{BUF -= Width; REZ.y++;}

}

else BUF = REZ.x + Width - BUF;

REZ.x = BUF;

return REZ;

}

int *ByteToBinary (BYTE val)

/* Разбивает исходный Байт на биты. Возвращает массив из восьми элементов

Каждый Nй элемент соответствует Nму биту.

Принимает значения 1 или 0

*/

{ int *mass = new int[8];

int t, i;

for (t = 128, i = 0; t > 0; t /= 2, i++)

{

if ((val & t) != 0) mass[i] = 1;

else if ((val & t) == 0) mass[i] = 0;

}

return mass;

}

BYTE BinaryToByte (int *mass)

/* Собирает из массива битов один целый байт и возвращает его.

Входной параметр: массив из восьми элементов, соответсвтующих

битам Байта

*/

{

BYTE Mask = 00000001;

BYTE Result = 00000000;

BYTE Mask2;

int j = 0;

for (int i = 7; i > -1; i--, j++)

{

if (mass[i] == 1) {Mask2 = (Mask << (j));

Result = Result|Mask2;

}

}

return Result;

}

int BinaryToDec (BYTE val)

/* Переводит Байт из двоичной системы в десятичную

*/

{ int Result = 0;

for (int t = 1, i = 0; t < 129; t *= 2, i++)

{

if ((val & t) != 0) Result += pow(2,i);

}

return Result;

}

int GetBitValue(BYTE B, int N)

/* Получает значение N-ого бита в байте B

Возвращает 1 или 0 (в зависимости от значения Бита)

*/

{ int k = 256;

for (int i = 0; i < N; i++) k /= 2;

if ((B & k) != 0) return 1;

else return 0;

}

BYTE ReadBitToByte (int Bit, BYTE B, int N)

/* Записывает в байт B на позицию N бит Bit

*/

{

BYTE A = 00000001;

BYTE Result = B;

for (int i = 1; i < N; i++)

A = A << 1;

if (Bit == GetBitValue(B,9-N)) return B;

else if (Bit == 1) return Result = Result|A;

else if (Bit == 0) return B - A;

return NULL;

}

void __fastcall TStego::FormCreate(TObject *Sender)

{

Warning = Image1->Picture;

ImageMaxHeight = PanelImage->Height-2;

ImageMaxWidth = PanelImage->Width-2;

Label3->Caption = "";

Label4->Caption = "";

Label9->Caption = "";

Label12->Caption = "";

RichEdit1->Clear();

}

//---------------------------------------------------------------------------

void __fastcall TStego::RichEdit1Change(TObject *Sender)

{

TEXT_SIZE = RichEdit1->Text.Length();

Label9->Caption = IntToStr((int) TEXT_SIZE);

Label12->Caption = IntToStr((int)(TEXT_SIZE * 8));

if (TEXT_SIZE != 0) ERR_NO_TEXT = false;

else ERR_NO_TEXT = true;

if ((TEXT_SIZE != 0)&&(ERR_OPEN_BMP == false))

{

Edit1->Text = IntToStr((int)((HEIGHT*WIDTH)/(TEXT_SIZE*8/NUM_OF_SHIFR_BYTE)));

}

else

{

Edit1->Text = "?";

}

if (TEXT_SIZE > MAX_TEXT_SIZE)

{

ERR_TEXT_LENGTH = true;

Label9->Font->Color = clRed;

Label12->Font->Color = clRed;

}

else

{

ERR_TEXT_LENGTH = false;

Label9->Font->Color = clWhite;

Label12->Font->Color = clWhite;

}

}

//---------------------------------------------------------------------------

void __fastcall TStego::FormShow(TObject *Sender)

{

int screenW = GetSystemMetrics(SM_CXSCREEN);//Получить ширину экрана

int screenH = GetSystemMetrics(SM_CYSCREEN);//Получить высоту экрана

Stego->Left = screenW/2 - Stego->Width/2;

Stego->Top = screenH/2 - Stego->Height/2;

}

//---------------------------------------------------------------------------

void __fastcall TStego::N2Click(TObject *Sender)

{

// ------ Открываем изображение ------ //

RichEdit1->Clear();

OpenPictureDialog1->Execute();

if (OpenPictureDialog1->FileName == "")

{

Label3->Caption = "";

Label4->Caption = "";

ERR_OPEN_BMP = true;

return;

}

Image1->HelpKeyword = OpenPictureDialog1->FileName;

// ------ отображаем на экран ------ //

Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

WIDTH = Image1->Picture->Width;

HEIGHT = Image1->Picture->Height;

koefY = (float) WIDTH/ImageMaxWidth;

koefX = (float) HEIGHT/ImageMaxHeight;

if (koefY > koefX)

{

Image1->Height = HEIGHT / koefY;

Image1->Width = ImageMaxWidth;

Image1->Left = 0;

Image1->Top = (PanelImage->Height-Image1->Height)/2;

}

else

{

Image1->Width = WIDTH / koefX;

Image1->Height = ImageMaxHeight;

Image1->Top = 0;

Image1->Left = (PanelImage->Width-Image1->Width)/2;

}

if (!Image1->Stretch) Image1->Stretch = true; // подгоняем по размеру

Bmp = new Graphics::TBitmap;

Bmp->LoadFromFile(OpenPictureDialog1->FileName); // копируем изображение в Bmp

Bmp->PixelFormat = pf24bit; // устанавливаем глубину цвета в 24 bit (стандарт без Альфа канала) RGB888

IMAGE_SIZE = WIDTH*HEIGHT;

NUM_OF_SHIFR_BYTE = StrToInt(Edit2->Text);

MAX_TEXT_SIZE = IMAGE_SIZE/8 * NUM_OF_SHIFR_BYTE;

Label3->Caption = IntToStr((int)IMAGE_SIZE);

Label4->Caption = IntToStr((int)MAX_TEXT_SIZE);

ERR_OPEN_BMP = false;

RichEdit1->OnChange(this);

}

//---------------------------------------------------------------------------

void __fastcall TStego::N6Click(TObject *Sender)

{

Stego->Close();

}

//---------------------------------------------------------------------------

void __fastcall TStego::N4Click(TObject *Sender)

{

if ((ERR_OPEN_BMP == true)||(ERR_NO_TEXT == true)||(ERR_TEXT_LENGTH == true))

{

char *str = new char[512];

strset(str, '\0');

if (ERR_OPEN_BMP == true) strcat(str,"Ошибка 001: изображение не найдено.\n");

if (ERR_NO_TEXT == true) strcat(str,"Ошибка 002: не введен текст.\n");

if (ERR_TEXT_LENGTH == true) strcat(str,"Ошибка 003: текст слишком длинный.\n");

MessageBox(NULL, str, "Ошибка!", MB_OK | MB_ICONERROR);

return;

}

int Shag = StrToInt(Edit1->Text);

char *String = new char[RichEdit1->Text.Length()+1];// создаем переменную для хранения кодируемого текста

strcpy(String,RichEdit1->Text.t_str()); // копируем в нее кодируемый текст

TPoint Next; // позиция следующего кодируемого пиксела

TPoint First; // позиция кодированного пиксела

BYTE TextByte; // переменная для хранения символа

int indexOfByte = 1; //индекс шифруемого бита

//---------------- ШИФРУЕМ СООБЩЕНИЕ -----------------//

for (int i = 0; i < TEXT_SIZE; i++) // перебор символов

{

TextByte = String[i]; // загоняем очередной символ

for (int j = 0; j < 8; j++) // перебор битов символа

{

Next = GetPosition(First, Shag, WIDTH);

TColor COLORR = Bmp->Canvas->Pixels[First.x][First.y];

BYTE R=GetRValue(COLORR); //

BYTE G=GetGValue(COLORR); // получили каналы

BYTE B=GetBValue(COLORR); //

int bit = GetBitValue(TextByte, j+1); // получили записываемый бит

R = ReadBitToByte (bit, R, indexOfByte); // записали jй бит в канал

indexOfByte++;

Bmp->Canvas->Pixels[First.x][First.y] = RGB(R,G,B); // переопределили цвет

if (indexOfByte > NUM_OF_SHIFR_BYTE) //если закинули в данный пиксель все доступные биты

{

indexOfByte = 1; //обновляем указатель на записываемый бит в пикселе

First = Next; //двигаемся к следующему биту

}

}

}

//------------------ ЗАШИФРОВАЛИ ---------------------//

Form1->Label9->Caption = Shag;

Form1->Label12->Caption = TEXT_SIZE;

Form1->Label2->Caption = NUM_OF_SHIFR_BYTE;

SavePictureDialog1->Execute();

if (SavePictureDialog1->FileName != "") Bmp->SaveToFile(SavePictureDialog1->FileName);

else

{

MessageBox(NULL, "Изображение не сохранено...", "Ошибка!", MB_OK | MB_ICONERROR);

return;

}

Form1->Left = Stego->Left + Stego->Width/2 - Form1->Width/2;

Form1->Top = Stego->Top + Stego->Height/2 - Form1->Height/2;

Form1->ShowModal();

}

//---------------------------------------------------------------------------

void __fastcall TStego::N5Click(TObject *Sender)

{

if (ERR_OPEN_BMP == true)

{

MessageBox(NULL, "Ошибка 001: изображение не найдено.\n", "Ошибка!", MB_OK | MB_ICONERROR);

return;

}

Open->Left = Stego->Left + Stego->Width/2 - Open->Width/2;

Open->Top = Stego->Top + Stego->Height/2 - Open->Height/2;

Open->ShowModal();

int SHAG = StrToInt(Open->Edit1->Text); // считываем ключ

int KOL = StrToInt(Open->Edit2->Text);

int NumByte = StrToInt(Open->Edit3->Text);

NUM_OF_SHIFR_BYTE = NumByte;

TPoint Next; // позиция следующего кодируемого пиксела

TPoint First; // позиция кодированного пиксела

BYTE TextByte; // переменная для хранения символа

int indexOfByte = 8; //индекс дешифруемого бита

char *result = new char[KOL+1];

strset(result, '\0');

int *BitMass = new int[8]; // массив для хранения битов

for (int i = 0; i < KOL; i++) // перебор символов дешифруемого сообщения

{

for (int j = 0; j < 8; j++) // перебор битов символа

{

Next = GetPosition(First, SHAG, WIDTH);

long COLORR = GetPixel(Bmp->Canvas->Handle,First.x,First.y); // получили цвет

BYTE R=GetRValue(COLORR); //

//BYTE G=GetGValue(COLORR); // получили каналы

//BYTE B=GetBValue(COLORR); //

BitMass[j] = GetBitValue(R, indexOfByte);

indexOfByte--;

if (indexOfByte == 8 - NumByte)

{

indexOfByte = 8;

First = Next;

}

}

result[i] = BinaryToByte (BitMass);

for (int k = 0; k < 8; k++) BitMass[k] = 0;

}

RichEdit1->Clear();

result[KOL] = '\0';

RichEdit1->Text = result;

}

//---------------------------------------------------------------------------

void __fastcall TStego::Edit2Change(TObject *Sender)

{

if (ERR_OPEN_BMP == true) return;

NUM_OF_SHIFR_BYTE = StrToInt(Edit2->Text);

Label4->Caption = IntToStr(StrToInt(Label3->Caption) * (int)NUM_OF_SHIFR_BYTE / 8);

MAX_TEXT_SIZE = StrToInt(Label4->Caption)/8;

RichEdit1Change(RichEdit1);

}

//---------------------------------------------------------------------------

void __fastcall TStego::Edit2KeyPress(TObject *Sender, wchar_t &Key)

{

if (Key >= '1' && Key <= '5')

{

Edit2->Text = Key;

}

Key = '\0';

}

//---------------------------------------------------------------------------

void __fastcall TStego::Button1Click(TObject *Sender)

{

N4Click(NULL);

}

//---------------------------------------------------------------------------

void __fastcall TStego::Button2Click(TObject *Sender)

{

N5Click(NULL);

}

//---------------------------------------------------------------------------

Размещено на Allbest.ru


Подобные документы

  • Тестування програмного забезпечення як процес його дослідження для отримання інформації про якість. Автоматизація тестування програми Join It - Jigsaw Puzzle. Методика тестування, структура пакету та його модулів. Вимоги до програмного забезпечення.

    дипломная работа [2,4 M], добавлен 24.07.2013

  • Проблеми процесу тестування програмного забезпечення. Розробка алгоритму автоматичної генерації тестів і тестового набору для ручного виконання. Побудова тестів для системи "Банкомат" і для баг-трекінгової системи, представленої графом із циклами.

    дипломная работа [1,2 M], добавлен 26.02.2014

  • Технічні характеристики обчислювальної техніки Монастирищенської центральної районної лікарні. Прикладне і основне програмне забезпечення закладу. Обґрунтування доцільності розробки програмного продукту для тестування молодшого медичного персоналу.

    отчет по практике [2,1 M], добавлен 02.04.2014

  • Аналіз формування податкової звітності. Розробка проекту інтерфейсу, інформаційної, статичної та динамічної моделей програмного забезпечення. Розрахунок економічної ефективності впровадження програмного забезпечення формування податкової звітності.

    дипломная работа [3,5 M], добавлен 26.04.2012

  • Причини незаконного використання програмного забезпечення. Дослідження збитку, нанесеного комп'ютерним піратством. Ризик роботи з нелегальним програмним забезпеченням і гідності ліцензійних програм. Види захисту прав виробників програмного забезпечення.

    реферат [60,8 K], добавлен 01.06.2010

  • Характеристика об’єкта автоматизації, вимоги до системи, склад та зміст системи. Розробка функціональної схеми програмного продукту. Тестування підпрограми програмного продукту. Розробка бази даних та налаштування ECO компонент в Borland Developer Studio.

    практическая работа [1,8 M], добавлен 05.06.2014

  • Основні поняття щодо захисту програмного забезпечення. Класифікація засобів дослідження програмного коду: відладчики, дизасемблери, діскомпілятори, трасировщики та слідкуючі системи. Способи вбудовування захисних механізмів в програмне забезпечення.

    курсовая работа [41,7 K], добавлен 14.11.2010

  • Класифікація об'єктно-орієнтованих мов програмування. Розробка алгоритмічного та програмного забезпечення комп'ютерної системи управління процесом випалювання будівельних матеріалів. Тестування програмного забезпечення, оцінка його ефективності.

    курсовая работа [1,6 M], добавлен 25.04.2015

  • Аналіз системи збору первинної інформації та розробка структури керуючої ЕОМ АСУ ТП. Розробка апаратного забезпечення інформаційних каналів, структури програмного забезпечення. Алгоритми системного програмного забезпечення. Опис програмних модулів.

    дипломная работа [1,9 M], добавлен 19.08.2012

  • Основні завдання синоптичної метеорології. Призначення та область застосування програмного продукту "Статистика метеоспостережень", функціональні вимоги до нього. Інформаційне забезпечення, структура, опис інтерфейсу. Тестування програмного продукту.

    курсовая работа [3,6 M], добавлен 30.04.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.