17 марта 2011 г.

Стеганография в Matlab (извлечение)


Пример извлечения скрытой  информации из графического файла.
Имеем файл 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);

Вуаля. В каталоге с данным скриптом появится извлеченный архив.
Текст скрипта для Matlab и изображения со выстраиваниями прилагаю в архиве.
В одном из изображений как было сказано находится первый том «Войны и мира» Во втором – впрочем посмотрите сами…

3 комментария:

  1. Здравствуйте столкнулся с такой проблемой.
    Index exceeds matrix dimensions.
    Error in Untitled (line 38)
    ext_pixels_with_bits = ext_IMG(ext_ind);
    В чем проблема?

    ОтветитьУдалить
  2. Добрый день, что-то ссылка на архив не работает, не могли бы Вы проверить, пожалуйста? Ваша статья - очень интересный, полезный и нужный материал. Спасибо!

    ОтветитьУдалить