Существует, по меньшей мере, две причины, по которым манипулирование свободным местом в определенных случаях показывает довольно неплохие результаты. Во-первых, изменение количества пробелов в конце текстовой строки не вызывает существенных изменений в значении фразы или предложения. Во-вторых, среднестатистический читатель вряд ли заметит незначительные модификации свободного места страницы текста.
В [14] предложено три метода, которые для скрытия данных используют свободное место в тексте. Указанные методы оперируют с интервалами между предложениями, пропусками в конце текстовых строк и интервалами между словами в тексте, выровненном по ширине.
Метод изменения интервала между предложениями
Метод изменения интервала между предложениями позволяет встраивать в текст сообщение, имеющее двоичный формат, путем размещения одного или двух пробелов после каждого символа завершения предложения. В качестве символов окончания предложения могут служить, к примеру, точки в обычном тексте, точки с запятой для кода программ на языке C++ и т.п. При этом единичным пробелом может кодироваться бит "1", двойным - бит "0".
Кроме несомненной простоты, данный метод имеет и ряд недостатков. Во-первых, он не эффективен, поскольку для встраивания незначительного количества бит требуется текст значительного объема. В частности, один бит, который возможно скрыть в одном предложении, эквивалентен скорости передачи данных, соответствующей приблизительно одному биту на 160 байт текстового контейнера, при условии, что в среднем предложение представляет собой две строки по 80 символов каждая.
Во-вторых, возможность скрытия весьма зависит от структуры текстового контейнера (некоторые тексты, как например, верлибры или свободные стихи характеризуются отсутствием стабильных согласованных или однозначных знаков завершения строки).
В-третьих, существуют текстовые редакторы, которые автоматически устанавливают после точки в конце предложения один-два пробела (так называемое автозавершение). И, наконец, как отмечается в [14], непоследовательное и противоречивое использование свободных мест может оказаться достаточно заметным для читателя.
Приведем пример реализации данного метода в MathCAD.
Шаг1
Пусть в качестве контейнера используется текст, фрагмент которого приведен на рис. 5.94 (С:= READBIN("C.txt", "byte")), а скрываемое сообщение имеет следующее содержание: М:= "Алгоритм".
Рис. 5.94. Фрагмент оригинала текста-контейнера, используемого для скрытия данных
Шаг 2
Переменной (точка + пробел) пометим фрагмент контейнера, который будет сигнализировать об окончании предложений. В ASCII-кодировке данная переменная отображается вектором str2vec()T = (46 32).
Проверку достаточности количества предложений в тексте для скрытия заданного количества бит сообщения (LM = 8·strlen(M), LM = 64 бита) выполним с помощью программного модуля (М.128), который подсчитывает количество элементов в выбранном в качестве контейнера тексте.
Для представленного на рис. 5.94 фрагмента = 8, что является достаточным для скрытия одного символа сообщения (8 бит).
Шаг 3
Стеганографическое скрытие рассматриваемым методом выполняет программный модуль (М.129). В начале модуля (М.129) строка символов М преобразовывается в вектор двоичных данных Mvec_bin. Для каждого элемента вектора Mvec_bin про водится поиск элемента (конца предложения) в массиве исходного текста С ’, представленном в ASCII-кодах. Параллельно формируется стеганограмма S, путем дописывания в ее конец 1-го элемента массива С’
В случае нахождения фрагмента массива С, который отвечает вектору , про исходит сохранение оставшейся части текста как немодифицированной (переопределение переменной С) и в зависимости от значения текущего элемента Mvec_bin к стеганограмме S дописывается один или два пробела (ASCII-код которых равен 32).
Для предотвращения возможного возникновения неоднозначности в тех случаях, когда в оригинальном тексте предложения отделялись между собой точкой и произвольным количеством пробелов, в модуле (М.129) также предусмотрено удаление возможных лишних пробелов в начале немодифицированного фрагмента С.
По окончании встраивания всех бит сообщения, к стеганограмме S приписывается фрагмент текста, оставшийся без изменений (С).
Результат скрытия первого символа сообщения М (символа "А"), ASCII-код которого в двоичном представлении: D2B(str2vec("A"))T = (0LSB 0 0 0 0 0 1 1MSB), представлен на рис. 5.95.
Рис. 5.95. Фрагмент текстового контейнера, заполненного методом изменения интервала между предложениями
Шаг 4
Излечение скрытой информации проводится программным модулем (М.130) при S*=S, .
Алгоритм действий следующий: выполняется поиск конца предложения (элемента *) в представленном в ASCII-кодах тексте S*. В случае нахождения, анализируется количество пробелов после точки, на основании чего делается вывод о значении текущего извлекаемого бита сообщения. В конце модуля вектор двоичных данных преобразовывается в текстовую строку символов.