§1.3. Буквы и слова

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

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

Текст — это мысль, записанная понятными символами. На бумаге или мониторе мы видим текст как последовательность букв, пробелов и знаков препинания. С бумагой всё понятно: что написано — то написано. А вот с компьютерами, как обычно, дела обстоят куда интереснее. Давайте разберёмся, как хранятся привычные нам закорючки в памяти устройств, и что с этим можно сделать.

Кодировки

В 1840-х годах, с изобретением телеграфа, появилась потребность однозначно и просто передавать человеческие символы нечеловеческими мерами — электрическими импульсами. Сэмюел Морзе придумал использовать для этого чередование коротких и длинных сигналов так, чтобы на том конце провода эти сигналы можно было однозначно соотнести с буквой или символом. Например, буква S кодировалась в его системе тремя короткими сигналами: ···, а буква O — тремя длинными: ---. Зная это, можно представить, как выглядит сигнал SOS: ··· --- ···.

Азбука за многие годы претепевала разные модификации: добавлялись отдельные символы и целые алфавиты, изменялся порядок, но основная идея оставалась всё той же. А когда появились компьютеры, люди не стали придумывать ничего нового совсем: взяли морзянку — и просто заменили «точки» и «тире» на нули и единицы. Именно так появились первые кодировочные таблицы, ASCII у них и КОИ (код обмена информацией) у нас.

ASCII до сих пор используется во многих местах, например, в адресах сайтов, во многих простых компьютерных программах (особенно тех, что написаны на Си), не работающих с текстом, и сетевых протоколах за счёт того, что эта кодировка очень простая. Настолько простая, что её можно выучить наизусть:

Левые четыре столбца и самая верхняя строчка — это те самые ноли и единицы, которым соответствует символ на пересечении строки и столбцов.

Символы и несимволы

Некоторым позициям в таблице соответствует один символ, а некоторым — сразу несколько, как, например, позиции . Дело в том, что бывают т. н. непечатные символы — особые позиции в кодировочных таблицах, которые не отображаются при печати, но всё равно выполняют определённую функцию. Cимвол означает, что компьютеру следует пикнуть встроенным динамиком (в английском слово bell означает «колокольчик»), а  — это особый, нулевой символ, котрый чаще всего означает конец чего-либо в программировании.

Почти все непечатные символы нельзя просто так ввести с клавиатуры. Кроме одного. Когда вы нажимаете Enter в текстовом редакторе, Linux и Mac OS вставляют в документ символ новой строки (англ. line feed), . Windows по историческим причинам вставляет в этом же случае два символа, потому что там начало новой строки знаменует последовательность из  (англ. carriage return — «возврат каретки») и .

Поэкспериментируйте. Есть терминальная команда echo, которая просто повторяет всё то, что получает на ввод: echo '123abc' выведет 123abc. У этой команды есть флаг -e, который даёт возможность вводить непечатные символы в особом формате. Воспользуйтесь таблицей ниже, и посмотрите, как терминал будет отображать текст с разными непечатными сивмолами.

СимволФормат
Bell\a
Backspace\b
Line feed\n
Carriage return\r
Horizontal tab\t
Vertical tab\v

Предсказуемо ли поведение этих символов? Как вы считаете, можно ли использовать эти символы для стеганографии?

Текст богатый и бедный

Текстовый файл — это просто набор байтов. Когда вы открываете его, компьютер читает эти байты, поглядывая в кодировочную таблицу, и отображает соответствующие символы. В нём не хранится никаких сведений о том, каким шрифтом и цветом эти символы будут отображаться, он не может хранить изображения. Посмотрите на «Блокнот» в Windows:

Этот формат называется plain text (англ. «простой текст»), он до неприличия прост и стар как мир, а ещё он открывается, редактируется и выглядит примерно одинаково буквально на любом компьютере. Более того, из определения простого текста можно сделать вывод, что любой файл — текстовый. И это правда, но об этом — в следующем параграфе.

Но просто текста часто бывает недостаточно. Чтобы подготовить, например, реферат, вы, скорее всего, воспользуетесь текстовым процессором вроде Word. Word дополняет простой текст дополнительной информацией, благодаря которой появляются стили и объекты вроде картинок и таблиц. Такой формат называется rich text (англ. «богатый текст») и мало чего общего имеет с обычными текстовыми файлами — «вордовские» документы не открыть без особой программы. Да и вообще, эти документы имеют больше общего с zip-архивами, чем с простым текстом.

One encoding to rule them all

Выше мы говорили о том, что когда-то для каждого языка была отдельная кодировочная таблица. Одни и те же байты могли быть прочтены по-разному в зависимости от того, какая таблица была выбрана в программе. И если таблица у читателя не совпадала с таблицей у писателя, получалось плохо:

Муки выбора пытались переложить на компьютер, но автоопределение кодировки не всегда работало корректно, порождая порой ещё большие казусы.

Проблема, наконец, разрешилась, когда придумали кодировку «Юникод». В ней символы кодируются не одним байтом, а двумя, тремя или даже четыремя, что позволяет вместить в одну таблицу буквально все символы, известные человечеству:

Возможностей для стеганографии Юникод даёт столько, что их все не описать: разные пробелы и символы нулевой длины; цифры, похожие на цифры, но не совсем; 53 вида чёрточек; похожие друг на друга буквы из разных алфавитов; эмодзи, ...…

Выводы

  1. Текст — это просто байты. Соответствие между байтами и символами устанавливается кодировкой. Самая распространённая и большая кодировка — «Юникод», в которой есть все символы.

  2. Бывают непечатные символы, которые не отображаются на экране, но всё равно что-то делают.

  3. Существует rich text — текст с оформлением и вложениями. Но это не совсем текст.

§1.4. Файлы и их форматы ⟶