Пример извлечения скрытой информации из графического файла.
Имеем файл BMP – формата со скрытым в его НЗБ (LSB) файлом архива. Процесс сокрытия описан в предыдущем посте.
Для извлечения, как и для внедрения будем использовать систему математического моделирования Matlab. Причины использования Matlab так же описаны в предыдущем посте.
Будем считать, что Matlab запущен и текущим каталогом является каталог с файлом, который содержит скрытое сообщение.
Загружаем в Matlab изображение, которое служит контейнером для скрываемого сообщения:
ext_IMG_name = './stego_murzik2.bmp';
ext_IMG = imread(ext_IMG_name);
В Workspace появилась массив цветовых компонент (RGB) ext_IMG, который и хранит скрываемый файл. В первых битах в красной компоненте закодирован размер сокрытого файла. Естественно он мог находиться и в других битах. Будем считать, что об этом мы заранее договорились с тем, кто встраивал сообщение.
Определим размер рисунка в пикселях:
ext_IMG_size_y = size(ext_IMG,1);
ext_IMG_size_x = size(ext_IMG,2);
Рассчитаем количество информации которую можно было максимально внедрить в НЗБ:
ext_max_Bytes = ext_IMG_size_y*ext_IMG_size_x*3/8;% Bytes
Определяем в скольких битах зашифрован размер файла.
ext_num_bits = ceil(log2(ext_max_Bytes));% bits
Извлекаем из изображения те пиксели (вернее значения яркости красной компоненты) в которых зашифрован размер файла.
ext_ind = 1:ext_num_bits;
ext_FILE_size_bits_arr = ext_IMG(ext_ind);
Выделяем НЗБ из байтов изображения. Получим массив бит которые составляют размер спрятанного файла.
ext_FILE_size_bits_arr = uint32(bitand(ext_FILE_size_bits_arr ,1));
Из массива получим число - размер спрятанного файла.
for ext_ind = 1:1:ext_num_bits
ext_FILE_size_bits_arr(ext_ind) = ext_FILE_size_bits_arr(ext_ind)*(2^(ext_ind-1));
end;
ext_FILE_size_bits_arr = ext_FILE_size_bits_arr';
ext_FILE_size = uint32(sum(ext_FILE_size_bits_arr));
Создадим индекс байтов цветовых компонент, в которые занесена скрытая информация ext_ind:
ext_ind = ext_num_bits+1 : ext_num_bits+ext_FILE_size*8;
Выделим байты со скрытой информацией:
ext_pixels_with_bits = ext_IMG(ext_ind);
Оставим только значимые для нас наименее значимые биты:
ext_BITS_arr=bitand(ext_pixels_with_bits,1)';
Разобьем длинный столбец бит на восемь равной длинны частей и поставим эти части рядом. Полученный прямоугольный массив представляет собой те байты информации, которые были внедрены в изображение:
ext_BITS_arr=reshape(ext_BITS_arr,ext_FILE_size,8);
Сформируем из нашего прямоугольного массива бит последовательность байт данных, которые были изначально внедрены.
ext_BITS_arr = uint8([ext_BITS_arr(:,1)*128,...
ext_BITS_arr(:,2)*64,...
ext_BITS_arr(:,3)*32,...
ext_BITS_arr(:,4)*16,...
ext_BITS_arr(:,5)*8,...
ext_BITS_arr(:,6)*4,...
ext_BITS_arr(:,7)*2,...
ext_BITS_arr(:,8)*1]);
ext_BYTES = sum(ext_BITS_arr,2);
Запишем последовательность данных в файл.
fid = fopen('./default.rar','w');
count = fwrite(fid, ext_BYTES);
fclose(fid);
Вуаля. В каталоге с данным скриптом появится извлеченный архив.
В одном из изображений как было сказано находится первый том «Войны и мира» Во втором – впрочем посмотрите сами…
Здравствуйте столкнулся с такой проблемой.
ОтветитьУдалитьIndex exceeds matrix dimensions.
Error in Untitled (line 38)
ext_pixels_with_bits = ext_IMG(ext_ind);
В чем проблема?
Этот комментарий был удален автором.
УдалитьДобрый день, что-то ссылка на архив не работает, не могли бы Вы проверить, пожалуйста? Ваша статья - очень интересный, полезный и нужный материал. Спасибо!
ОтветитьУдалить