
- •Введение
- •Системное проектирование
- •1.1. Описание предметной области
- •1.2. Структура программы
- •1.3. Выбор и обоснование среды разработки
- •2.4. Алгоритмы шифрования
- •3. Разработка программных модулей
- •3.1. Открытие и загрузка изображения
- •3.2. Проверка длины текста
- •3.3. Шифрация сообщения
- •3.4. Сохранение картинки
- •3.5. Дешифрация текста
- •3.6. Сохранение ключа шифрования
- •4. Программа и методика испытаний
- •4.1. Этапы отладки
- •4.2. Типы ошибок
- •4.3. Функциональное тестирование
- •4.4. Полное тестирование
- •5. Руководство пользователя
- •5.1. Назначение
- •5.2. Требования к программному и аппаратному обеспечению компьютера
- •5.3. Работа с формами
- •Заключение
- •Литература
3.3. Шифрация сообщения
Перебираем символы:
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);
Записываем j-ый бит в канал:
R = ReadBitToByte (bit, R);
Переопределяем цвет:
Bmp->Canvas->Pixels[First.x][First.y] = RGB(R,G,B);
First = Next;
}
}
3.4. Сохранение картинки
Вывод на экран основной информации:
Form1->Label9->Caption = Shag;
Form1->Label12->Caption = TEXT_SIZE;
Открытие диалога сохранения:
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();
}
3.5. Дешифрация текста
void __fastcall TStego::Button2Click(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);
Позиция следующего кодируемого пиксела:
TPoint Next;
Позиция кодированного пиксела:
TPoint First;
Переменная для хранения символа:
BYTE TextByte;
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);
BitMass[j] = GetBitValue(R, 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;
}
3.6. Сохранение ключа шифрования
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Открытие диалога сохранения:
Stego->SaveDialog1->Execute();
Проверка правильности введенного имени файла:
if (Stego->SaveDialog1->FileName == "")
{
MessageBox(NULL, "Ключ не сохранен...", "Ошибка!", MB_OK | MB_ICONERROR);
return;
}
ofstream READ;
READ.open(Stego->SaveDialog1->FileName.c_str());
Запись шага шифрования и количества слов:
READ<<StrToInt(Label9->Caption)<<endl;
READ<<StrToInt(Label12->Caption);
Form1->Close();
}