Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки
Національний університет „Львівська політехніка”
Кафедра EОМ
Звіт
з лабораторної роботи № 4
з дисципліни: “ Захист інформації в комп’ютерних системах ”
Організація стегоканалу в BMP-файлі
Варіант 3
2018
Тема: Організація стегоканалу в BMP-файлі
Мета: Ознайомитися з поняттям стеганографії та проаналізувати можливості організації стегоканалу в ВМР-файлі
Завдання:
Створити програму, що реалізує довільний перестановочний шифр.
Підготувати і захистити звіт, в якому обов’язково навести алгоритм роботи даного перестановочного шифру.
Хід роботи:
Код реалізації алгоритму
package sample;
import javafx.scene.image.PixelReader;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.paint.Color;
public class ImageWorker
{
public enum State
{
Hiding,
Filling_With_Zeros
};
public static WritableImage embedText(String text, WritableImage bmp)
{
State state = State.Hiding;
int charIndex = 0;
int charValue = 0;
int pixelElementIndex = 0;
int zeros = 0;
double R, G, B;
for (int i = 0; i < bmp.getHeight(); i++)
{
for (int j = 0; j < bmp.getWidth(); j++)
{
PixelReader pixelReader = bmp.getPixelReader();
Color pixel = pixelReader.getColor(j, i);
R = pixel.getRed() - pixel.getRed() % 2;
G = pixel.getGreen() - pixel.getGreen() % 2;
B = pixel.getBlue() - pixel.getBlue() % 2;
for (int n = 0; n < 3; n++)
{
if (pixelElementIndex % 8 == 0)
{
if (state == State.Filling_With_Zeros && zeros == 8)
{
if ((pixelElementIndex - 1) % 3 < 2)
{
PixelWriter pxl = bmp.getPixelWriter();
pxl.setColor(j, i, Color.color(R, G, B));
}
return bmp;
}
if (charIndex >= text.length())
{
state = State.Filling_With_Zeros;
}
else
{
charValue = text.charAt(charIndex++);
}
}
switch (pixelElementIndex % 3)
{
case 0:
{
if (state == State.Hiding)
{
R += charValue % 2;
charValue /= 2;
}
} break;
case 1:
{
if (state == State.Hiding)
{
G += charValue % 2;
charValue /= 2;
}
} break;
case 2:
{
if (state == State.Hiding)
{
B += charValue % 2;
charValue /= 2;
}
PixelWriter pxl = bmp.getPixelWriter();
pxl.setColor(j, i, Color.color(R, G, B));
} break;
}
pixelElementIndex++;
if (state == State.Filling_With_Zeros)
{
zeros++;
}
}
}
}
return bmp;
}
public static String extractText(WritableImage bmp)
{
int colorUnitIndex = 0;
double charValue = 0;
String extractedText = new String();
for (int i = 0; i < bmp.getHeight(); i++)
{
for (int j = 0; j < bmp.getWidth(); j++)
{
PixelReader pixelReader = bmp.getPixelReader();
Color pixel = pixelReader.getColor(j, i);
for (int n = 0; n < 3; n++)
{
switch (colorUnitIndex % 3)
{
case 0:
{
charValue = charValue * 2 + pixel.getRed() % 2;
} break;
case 1:
{
charValue = charValue * 2 + pixel.getGreen() % 2;
} break;
case 2:
{
charValue = charValue * 2 + pixel.getBlue() % 2;
} break;
}
colorUnitIndex++;
if (colorUnitIndex % 8 == 0)
{
charValue = reverseBits((int)charValue);
if (charValue == 0)
{
return extractedText;
}
char c = (char)charValue;
extractedText += c;
}
}
}
}
return extractedText;
}
public static int reverseBits(int n)
{
int result = 0;
for (int i = 0; i < 8; i++)
{
result = result * 2 + n % 2;
n /= 2;
}
return result;
}
}
/
Рис. 1. Процес приховування тексту в зображенні
/
Рис. 2. Текст після декодування
Висновок
На даній лабораторній роботі я ознайомився з поняттям стеганографії та проаналізував можливості організації стегоканалу в ВМР-файлі, також я розробив програмну реалізацію стегоканалу використовуючи LSB-метод.