PHP - скрытие текста в bmp - пример программы на PHP

более подробные пояснения к тому, что происходит здесь = http://fkn.ktu10.com/?q=node/4317
прочитать скрытый текст можно так

<?php
include 'lib.php';

// ниже я приведу код для шифрования

$file_handle = fopen("rf.bmp", "r+"); // получаем дескриптор файла (для чтения и записи)
// b в "rb" указывает ,что мы собрались читать бинарный файл

$text = "I LOVE RUSSIA !"; // текст который надо спрятать в картинку
$tarr = str_to_arr($text); // разбиваем на символы
$tarr  = get_ascii_arr($tarr);
$offset = 123;

$i = 0;
foreach ($tarr as $val) // переводим все элементы в двоичную систему
{
	
	$val =  base_convert(ord($val), 10, 2);
	/*при этом сразу дополним строку незначащими нулями - справа -
	до восьми символов - это поможет нам унифицировать процесс сокрытия данных*/
	$tarr[$i] = $val = str_pad($val, 8, '0', STR_PAD_LEFT);
	echo "<br>$i) " . $val; // почему бы не вывести на экран
	$i++;
} 

echo "<br>-----------<br>";

$i = $offset; // начнём изменять данный с 55 байта
$barr = array();// массив байтов файла
while ($data = fread($file_handle, 1)) // читаем по одному байту
{
	$barr[] = bin2hex($data);// получим данные в шестинатеричном виде   

	$i++;
}

//$c = count();
$i = $offset;
/*далее подразумевается, что картинка достаточно 
большая чтобы вместить наш текст*/
foreach ($tarr as $val)
{
	$val = str_to_arr($val);
	foreach ($val as $v) // проходим каждый бит ASCII кода символа
	{
		//echo('bit = '. $v .'<br>');
		$barr[$i] = str_pad(base_convert($barr[$i], 16, 2), 8, '0', STR_PAD_LEFT);
		$byte = str_to_arr($barr[$i].'');
		$byte[7] = $v; // здесь ЗАМЕНА НАИМЕНЬШЕГО ЗНАЧАЩЕГО БИТА (наименее заметого для глаз)
		// переводим каждый полчуившийся байт 16-тириный формат (нужнол для pack())
		// дополняем до 2-ух символов (иначе возникают проблемы с упаковкой)
		$barr[$i] = str_pad(base_convert(arr_to_str($byte), 2, 16), 2, '0', STR_PAD_LEFT); 
		//$barr[$i] = arr_to_str($byte);
		//echo("$i) ".$barr[$i].'<br>'); // байты можно выводить
		$i++; // переходим к следующему байту файла
	}
}

// сразу же попробуем прочитать записанное
$tarr = array();
$n = 1; // счётчик битов в байтах скрытого текста, который мы извлекаем
$m = 1; // счётчик извлечённых байтов
$c = count($barr); 
for ($i = $offset; $i < $c; $i++)
{
    //echo "$i)" . $barr[$i] . '<br>';
	$symb = str_to_arr(str_pad(base_convert($barr[$i], 16, 2), 8, '0', STR_PAD_LEFT));// получаем очередной байт в виде 8 бит(массив)
	//echo "$i)" . arr_to_str($symb).'<br>';
   $tarr[$m][$n] = $symb[7];// берём самый младший
	$n++; 
	if ($n == 9) { 
	//echo '<br>--a$ ' . $tarr[$m];
		$tarr[$m] = chr(base_convert(arr_to_str($tarr[$m]), 2, 10)); // сразу получаем очередной символ
		echo $tarr[$m];
		$n = 1;
		$m++;
	}
}


// склеиваем массив  - получаем сторку шестнадцатериных символов
$data = arr_to_str($barr);
echo $data;
$data = hex2bin($data);// упаковываем в бинарный формат

var_dump($data);
echo('<br>123' . $data);

$file_handle = fopen("rf2000.bmp", "w");
 fwrite($file_handle, $data);// пишем данные в файл
 

 fclose($file_handle); // закрываем файл
 

ПРИМЕЧАНИЕ: реализацию пользовательских функций (lib.php) для данного примера можно найти здесь = http://fkn.ktu10.com/?q=node/4315