Назначение стеганографии

Стеганография... Этот сравнительно недавно вошедший в компьютерный обиход термин обычно переводится как тайнопись. Совместно с криптографией стеганография (steganography) используется для защиты информации, фундаментального свойства окружающего мира, в таковой вовсе не нуждающейся, как, впрочем, и две другие его категории — материя и мера [1]. Требует защиты только изображение информации, представленное на материальном носителе, причем под ней понимается создание условий, исключающих либо затрудняющих доступ к носителю, внесение изменений или уничтожение носителя, а также восприятие представленных на нем данных, производимое с помощью методов криптографии и стеганографии. И если, образно говоря, криптография делает понятное непонятным, то стеганография делает видимое невидимым (иногда и в прямом смысле слова). Достигается это «растворением» скрываемой информации среди других данных значительно большего объема. Видимо, значение стеганографии в деле сокрытия информации сегодня помимо спецслужб в полной мере оценили лишь стоящие вне закона взломщики программ и авторы компьютерных вирусов.

Скрываемая информация называется стеганограммой или просто стего. Данные, среди которых она прячется, играют роль информационного контейнера, а потому так же и именуются. Для компьютерного вируса, например, контейнером служит исполняемый файл. Одна и та же стеганограмма может быть упакована в различные контейнеры подобно тому, как одна и та же криптограмма шифруется различными методами или ключами. Если продолжить сравнение с вирусами, то аналогом криптограммы являются обитающие в вычислительной среде компьютерные черви, не нуждающиеся ни в каком носителе.

Тем не менее некоторые авторы не склонны придавать значение собственной информации контейнера, считая ее безразличной как для отправителя, так и для получателя стеганосообщения [2]. Однако это не совсем так, что подтверждается все тем же примером компьютерного вируса.

Контейнером могут служить любые данные (файлы) достаточно большого объема, например графические или звуковые. Их структура проста и, как правило, обладает большой избыточностью, позволяющей вместить значительный объем дополнительной информации. Однако текстовые файлы все же более распространены, и их структура широко известна (всякие новации и навороты в виде закрытых форматов текстовых процессоров типа Microsoft Word и издательских систем, разумеется, не в счет).

Методы текстовой стеганографии

Стеганография, использующая текстовые контейнеры, называется текстовой (text steganography). Далее будет рассмотрено, каким образом можно применять текстовые контейнеры для хранения стего. Достаточно полная классификация подобных методов дана в работе [2]. Удивление вызывает лишь тот факт, что из автоматических методов текстовой стеганографии в этой статье упомянут только один — форматирование (т. е. выравнивание) текста с помощью пробелов.

Суть данного метода состоит в раздвижке строки путем увеличения пробелов между словами, когда один пробел соответствует, например, биту 0, два пробела — биту 1. Однако прямое его применение хотя и возможно, но на практике порождает массу неудобств, в частности, оформление текста становится неряшливым, что позволяет легко заподозрить в нем наличие стего.

В листинге 1 приведена программа, где подобные проблемы уже решены (этот листинг и другие, предложенные в статье, см. на «Мир ПК-диске», раздел «Студия программирования»). Программа попросту перераспределяет пробелы в пределах текущей длины строки, перенося по возможности длинные пробелы в ее конец. В результате строки выходного текста имеют аккуратный вид, затрудняющий выявление стего.

Одиночные пробелы и пробелы перед последним словом строки не несут информационной нагрузки. В остальных случаях же четное число пробелов кодирует 0, нечетное — 1. Стего при записи предварительно шифруется, а при чтении расшифровывается с использованием операции исключающего «ИЛИ» и встроенного в систему программирования датчика случайных чисел, управляемого константами Key1 и Key2.

Программа работает в двух режимах, определяемых числом параметров вызова. Первым параметром всегда указывается текстовый файл контейнера. Если таких параметров два, программа извлекает стего из контейнера и помещает его в файл, указанный вторым параметром. Параллельно стего распечатывается на экране. При трех параметрах происходит создание стего. Источником стегосообщения является файл, указанный вторым параметром, а результат работы программы помещается в файл, заданный третьим.

Необходимость учета множества нюансов делает данную программу довольно сложной. Поэтому представляют интерес способы встраивания стего, отнесенные в статье [2] к категории «многие другие». Из всех таких способов были выбраны простейшие. Если перечислять их с повышением уровня сложности, то это будет метод изменения порядка следования маркеров конца строки (листинг 2), метод хвостовых пробелов (листинг 3), метод знаков одинакового начертания (листинг 4) и метод двоичных нулей (листинг 5). Теперь кратко рассмотрим их.

Метод изменения порядка следования маркеров конца строки CR/LF использует индифферентность подавляющего числа средств отображения текстовой информации к порядку следования символов перевода строки (CR) и возврата каретки (LF), ограничивающих строку текста. Традиционный порядок следования CR/LF соответствует 0, а инвертированный LF/CR означает 1.

Метод хвостовых пробелов предполагает дописывание в конце коротких строк (менее 225 символов; значение 225 выбрано достаточно произвольно) от 0 до 15 пробелов, кодирующих значение полубайта.

Метод знаков одинакового начертания предполагает подмену (бит 1) или отказ от такой подмены (бит 0) русского символа латинским того же начертания. Идея этого метода заимствована из статьи [3].

Метод двоичных нулей является разновидностью метода знаков одинакового начертания и предполагает либо замену первого в группе из двух или более внутренних пробелов двоичным нулем (бит 1), либо отказ от нее (бит 0).

Интерфейс программ листингов 2—5 одинаков. Всего возможны три режима их работы, определяемые числом параметров вызова, первый из которых всегда представляет файл стеганоконтейнера. Если этот параметр единственный, то каждая из программ реализует функции стеганодетектора: производится сканирование контейнера с выводом результата на экран. Если таких параметров два, то стеганограмма извлекается из контейнера и расшифровывается. Результат выводится в файл, указанный вторым параметром, а также на экран. При трех параметрах стего выбирается из файла, указанного вторым параметром, шифруется исключающим «ИЛИ» и помещается в файл контейнера, заданного первым. Модифицированной стеганограммой контейнер записывается в файл, заданный третьим параметром.

Для шифрования во всех случаях используется программный датчик случайных чисел, начальное состояние которого определяется константами Key1 и Key2. Всегда производится эхо-печать стего.

Программа листинга 6 является вспомогательной и предназначена для жесткого форматирования таблиц, необходимого для работы с программой листинга 1. Суть жесткого форматирования состоит в замене всех внутренних пробелов строки двоичными нулями. При работе с этой программой в строке вызова необходимо указать имена входного и выходного файлов.

Для наглядности все программы написаны на входном языке крайне компактного компилятора Turbo Pascal 3.x компании Borland, почти идеально (если бы не отсутствие встроенного ассемблера) подходящем для исследовательской работы.

Анализ реализации методов

Эффективность описанных методов упаковки стего в контейнере была исследована на переведенном в ASCII-вид тексте главы VI тома I книги «Мертвая вода» [1] объемом 126 729 байт и насчитывающим 2143 строки со строками, выровненными на 65-символьную границу при абзацном отступе в четыре символа. Полученная плотность упаковки (в порядке возрастания) представлена в следующей таблице:

Сравнение методов текстовой стеганографии

МетодЗнаков стегоПлотность, %
Чередование маркеров конца2670,21
Выравнивание пробелами4110,32
Двоичные нули7400,58
Хвостовые пробелы10710,85
Знаки одинакового начертания40653,21

Обращает на себя внимание необычно высокая эффективность упаковки стего с использованием подмены символов.

Полученные данные являются лишь оценочными и зависят не только от свойств контейнера, но и от свойств помещаемого в него стего, хотя и в меньшей степени.

Число автоматических методов текстовой стеганографии, естественно, не ограничивается рассмотренными примерами. Пополнить запас примеров можно, в частности, разумной комбинацией уже приведенных.

В завершение стоит упомянуть об одном неожиданном наблюдении, свидетельствующем о том, что текстовых файлов, пригодных для использования в качестве стеганоконтейнера, намного больше, чем это может показаться с первого взгляда. Действительно, таковыми являются и файлы баз данных, символьные поля записей которых фактически представляют собой строки фиксированной длины (естественно, без завершающих символов CR/LF). Надеюсь, читатель по достоинству оценит это наблюдение...

И пусть простят меня коллеги и недоброжелатели за то, что я сейчас выскажу свое безусловно отрицательное отношение к методам «защиты информации», в том числе и к рассмотренным здесь...

От редактора. В развитие темы стоит обратить внимание на работу Карташова Д. В., Чижухина Г. Н. Текстовая стеганография // Труды научно-технической конференции «Безопасность информационных технологий». Пенза, 2003. Примеры изощренных методов текстовой стеганографии приведены, в частности, в работе Xu J., Sung A., Shi P., Liu Q. Text Steganography Using Wavelet Transform // New Mexico Tech Socorro, USA, 2002, выполнявшейся для Министерства обороны США, в котором изложено использование волнового (wavelet) преобразования, а также в публикации Кричевского А. М. Нейронные сети в задачах компьютерной стеганографии // Школа-семинар БИКАМП?03. С.-Петербург, 2003 (http://bicamp.aanet.ru/2003/ papers/sectionIT/ KrichevskyAM.pdf)

Р. Б.

Литература
  1. Мертвая вода // http://www.dotu.ru, http://www.kpe.ru.
  2. Беляев А. Стеганограмма: скрытие информации // Программист, 2002, №1 (электронная версия).
  3. Шарапов О. Программная русификация матричных принтеров // Монитор, 1993, № 3, с. 48—57.