Стеганография – это искусство и наука написания скрытого сообщения таким образом, чтобы никто, кроме отправителя и предполагаемого получателя, не подозревал о существовании сообщения.
Стеганография изображения – это метод сокрытия данных в изображении таким образом, что не позволяет непреднамеренному пользователю обнаруживать скрытые сообщения или данные.
Связанная теория:
Изображения состоят из маленьких точек, называемых пикселями. Каждый пиксель представлен 3 байтами: один для красного, один для зеленого и один для синего. Композиция этих трех цветов определяет фактический цвет, который показывает пиксель.
Красный:
Двоичный код: 11001001
Десятичное число: 201
Зеленый цвет:
Двоичный код: 11111000
Десятичное число: 201
Синий:
Двоичный код: 00000011
Десятичное число: 3
Эта композиция рождает оранжевый цвет.
Основная идея Image Steganography заключается в том, что изменение наименьшего значащего бита (LSB) не обнаруживается человеческим глазом. Поэтому мы модифицируем младший бит значения RGB, чтобы сохранить скрытое сообщение в сообщении, не влияя на цвет изображения.
В этом примере мы меняем только LSB синего компонента. Но мы можем изменить LSB всех компонентов Red, Green и Blue, если захотим. Поскольку мы меняем только младший бит синего компонента, количество информации, которое мы можем скрыть, уменьшается. Мы также можем сохранить длину скрытого сообщения в изображении, которое не было сделано в этом руководстве.
Предположим, мы хотим скрыть 1101 в изображении.
Сначала мы получаем значение RGB каждого пикселя в изображении. Поскольку мы скрываем 4-битные данные и меняем синий компонент, поэтому нам нужно 4 пикселя изображения.
Предположим, мы получили следующие значения RGB в первых 4 пикселях изображения:
11001100 10010001 00101011
00011000 11110000 11111110
11100010 00100101 01010101
11111101 00001010 01000011
Теперь мы заменим последний бит значения RGB каждого пикселя на 1101 последовательно.
Итак, новое значение RGB становится:
11001100 10010001 00101011
00011000 11110000 11111111
11100010 00100101 01010100
11111101 00001010 01000011
Выделенный бит представляет сообщение, которое мы скрываем на изображении.
Теперь мы устанавливаем новое значение RGB в пиксель. Это изменение не обнаружено человеческим глазом, и изображение выглядит одинаково.
Зелье шифрования завершено, и теперь мы расшифруем скрытое сообщение на картинке.
Для этого мы выбираем значение RGB каждого пикселя, а затем соединяем LSB, чтобы получить наше скрытое сообщение.
Реализация с PHP
Нам нужно одно изображение и три php-скрипта для реализации базовой стеганографии изображения.
- encrypt.php
- decrypt.php
- functions.php
- 1.jpg
encrypt.php
<?php
include('functions.php');
$message_to_hide = 'hello';
$binary_message = toBin($message_to_hide);
$message_length = strlen($binary_message);
$src = '1.jpg';
$im = imagecreatefromjpeg($src);
for($x=0;$x<$message_length;$x++){
$y = $x;
$rgb = imagecolorat($im,$x,$y);
$r = ($rgb >>16) & 0xFF;
$g = ($rgb >>8) & 0xFF;
$b = $rgb & 0xFF;
$newR = $r;
$newG = $g;
$newB = toBin($b);
$newB[strlen($newB)-1] = $binary_message[$x];
$newB = toString($newB);
$new_color = imagecolorallocate($im,$newR,$newG,$newB);
imagesetpixel($im,$x,$y,$new_color);
}
echo $x;
imagepng($im,'simple.png');
imagedestroy($im);
?>
decrypt.php
<?php
include('functions.php');
$src = 'simple.png';
$im = imagecreatefrompng($src);
$real_message = '';
for($x=0;$x<40;$x++){
$y = $x;
$rgb = imagecolorat($im,$x,$y);
$r = ($rgb >>16) & 0xFF;
$g = ($rgb >>8) & 0xFF;
$b = $rgb & 0xFF;
$blue = toBin($b);
$real_message .= $blue[strlen($blue)-1];
}
$real_message = toString($real_message);
echo $real_message;
die;
?>
functions.php
<?php
function toBin($str){
$str = (string)$str;
$l = strlen($str);
$result = '';
while($l--){
$result = str_pad(decbin(ord($str[$l])),8,"0",STR_PAD_LEFT).$result;
}
return $result;
}
function toString($binary){
return pack('H*',base_convert($binary,2,16));
}
?>
Источник записи: https://thedebuggers.com