Розробка програмного забезпечення для формування цифрового водяного знаку
Цифрова стеганографія, обґрунтування методу приховування інформації. Програмне забезпечення у середовищі 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