PHP - скрытие текста в bmp - пример программы на PHP
Primary tabs
более подробные пояснения к тому, что происходит здесь = 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
- Log in to post comments
- 4867 reads