§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 вида чёрточек; похожие друг на друга буквы из разных алфавитов; эмодзи, ...…
Выводы
Текст — это просто байты. Соответствие между байтами и символами устанавливается кодировкой. Самая распространённая и большая кодировка — «Юникод», в которой есть все символы.
Бывают непечатные символы, которые не отображаются на экране, но всё равно что-то делают.
Существует rich text — текст с оформлением и вложениями. Но это не совсем текст.