Прячем секретный файл в картинку/фильм
У шифрованной информации есть несколько недостатков: тебя могут вынудить назвать пароль или ключ для её дешифровки, либо этими файлами можно привлечь внимание преступника, который каким-то образом украл эти данные, и он может пытаться расшифровать их. Но любую зашифрованную информацию можно замаскировать под что-нибудь другое.
О стеганографии
Стеганография — это метод скрытия важной информации внутри другой информации, так что наличие скрытой информации не вызывает подозрений. В отличие от шифрования, которое делает данные неразборчивыми для посторонних, стеганография маскирует сам факт существования дополнительной информации.
Например, шифрованный файл может привлечь внимание, тогда как стеганографически замаскированный файл выглядит как обычный медиафайл, и с ним можно работать как если бы в нём ничего и не было дополнительно прописано.
Сегодня я научу тебя прятать секретный файл внутри другого файла (картинки). Сделать это можно тремя командами, которые есть в любой Unix-системе (в том числе в macOS и даже Windows). Но это будет один из самых простых и примитивных способов. Стеганография — гораздо более сложная наука, и для неё существует огромное количество инструментов для ещё большей маскировки.
Немного теории
Начало файла начинается с его заголовка, который содержит метаданные. Эти метаданные описывают его тип, адреса, с которых начинаются данные, и другие характеристики. Эти характеристики многочисленны и зависят от типа файлов.
Просмотреть тип файла можно утилитой file:
$ file image.jpg
image.jpg: JPEG image data, Exif standard: [TIFF image data, big-endian, direntries=11, manufacturer=NIKON CORPORATION, model=NIKON D3100, orientation=upper-left, xresolution=180, yresolution=188, resolutionunit=2, software=Ver.1.01 , datetime=2025:01:26 16:28:02, GPS-Data], baseline, precision 8, 4608x3072, components 3
По сути, заголовок выполняет функцию, аналогичную расширению файла, но содержит более сложную и детализированную информацию, что позволяет более точно управлять данными. Если поменять расширение у файла, то его заголовок никак не изменится.
Прибегая к стеганографии, ты научишься дописывать один файл в конец другого. Таким образом, целостность сохранится, но в то же время, если знать, что в нём вшит другой файл, то его можно довольно легко извлечь.
Шифруем файл, который хотим спрятать
Первым шагом всегда необходимо зашифровать файл. Хотя это не является обязательным, настоятельно рекомендуется делать это, так как стеганография наиболее эффективна в сочетании с шифрованием.
Для шифрования можно использовать GnuPG. В большинстве случаев лучше шифровать данные с использованием публичного ключа (за исключением ситуаций, когда важна анонимность данных). Однако в этом примере я покажу, как зашифровать файл с помощью пароля:
$ gpg -c -o secret.gpg secret.txt
Введи пароль, и файл будет зашифрован и сохранён на диске под именем secret.gpg.
Маскируем шифрованный GPG файл под файл JPEG
Предположим, у тебя есть файл secret.gpg, и ты хочешь спрятать его внутри картинки image.jpg.
Первое, что необходимо сделать, — определить размеры обоих файлов и где-нибудь их записать (например, в базе KeepassXC):
$ ls -l image.jpg secret.gpg
-rw-r--r--@ 1 user user 9880935 Feb 27 21:22 image.jpg
-rw-r--r-- 1 user user 2981978 Feb 27 22:53 secret.gpg
9880935 — это размер в байтах файла image.jpg, соответственно 2981978 — размер secret.gpg.
Теперь спрячем файл secret.gpg в конец image.jpg:
$ cat secret.gpg >>image.jpg
Открой файл image.jpg и убедись, что картинка открывается как и ранее, только её размер увеличился на размер байт файла secret.gpg:
$ ls -l image.jpg
-rw-r--r--@ 1 user user 12862913 Feb 27 22:57 image.jpg
Считаем: 9880935 (image.jpg) + 2981978 (secret.gpg) = 12862913 байт. Всё верно.
Заодно можем повторно проверить тип файла:
$ file image.jpg
image.jpg: JPEG image data, Exif standard: [TIFF image data, big-endian, direntries=11, manufacturer=NIKON CORPORATION, model=NIKON D3100, orientation=upper-left, xresolution=180, yresolution=188, resolutionunit=2, software=Ver.1.01 , datetime=2025:01:26 16:28:02, GPS-Data], baseline, precision 8, 4608x3072, components 3
Как видишь — он не поменялся. Обязательно запусти его, убедись что открылась прежняя картинка, и что никаких ошибок не возникло.
Ещё раз важное про размер файлов
Не забывай записывать размеры файлов до их слияния, иначе восстановление файла потребует больше времени и определённых знаний.
Извлекаем из картинки зашифрованный gpg-файл
Для этого необходимо использовать утилиту dd. Это утилита для низкоуровневого копирования и преобразования данных.
Запускаем её так:
$ dd if=image.jpg of=secret_new.gpg bs=1 count=2981978 skip=9880935
Здесь count — это размер в байтах извлекаемого файла (secret.gpg), а skip (пропустить количество байт) — размер нашей картинки до её модификации.
В аргументе if указывается исходный файл, а в of — файл, который создастся после выполнения этой команды.
Давай убедимся, что новый файл создался без ошибок:
$ file secret_new.gpg
-rw-r--r-- 1 user user 2981978 Feb 27 23:04 secret_new.gpg
secret_new.gpg: PGP symmetric key encrypted data - AES with 256-bit key salted & iterated - SHA256 .
Можем еще сравнить хеш-суммы исходного файла и извлечённого из картинки:
$ md5sum secret.gpg secret_new.gpg
3c08fea9fcea5fa4de02361eb6ee1d00 secret.gpg
3c08fea9fcea5fa4de02361eb6ee1d00 secret_new.gpg
Как видишь, файлы secret.gpg и secret_new.gpg идеинтичны.
Что делать, если размер файлов был утерян
Если ты когда-то вставил один файл в конец другого и не записал их размеры, можно воспользоваться HEX-редактором.
HEX-редактор — это программа, которая позволяет просматривать и редактировать данные на уровне байтов.
В нём необходимо определить адрес начала заголовка дозаписанного файла. Обычно это можно сделать, найдя определённые сигнатуры или метаданные, характерные для этого типа файла. После того как ты определишь этот адрес, можно скопировать данные с этого места до конца файла и вставить их в новый файл.
Важное про картинки/фотографии и другой медиа-контент
Учитывай, что графические файлы со спрятанными данными нельзя загружать на сервисы, которые как-либо сжимают изображения. Также их нельзя редактировать в графических редакторах, иначе ты потеряешь свои данные.
Такое же правило действует и для любого другого медиа-контента.
Какой формат файла выбрать для маскировки?
Самое важное — всегда выбирай форматы и файлы в соответствии с объёмом файла, который хочешь спрятать, чтобы не привлекать внимание.
Например, ключ от базы keepassxc можно спрятать и в картинку. Но вот если у тебя есть шифрованный LUKS-контейнер объёмом 5 Гб, то JPEG-файл, естественно, для этого рассматривать не стоит. Попробуй дописать его в какой-нибудь фильм хорошего качества, например. Или в объёмный RAR-архив.
Учти, что не со всеми типами файлов такой трюк работает (например, с docx у меня не сработало). Файл-то всегда допишется в конец, но исходный файл может уже не открыться после этого. Некоторые форматы файлов и программы очень придирчивы к лишнему содержанию и проверяют контрольные суммы, а в случае несовпадения - выдают ошибку. А нам нужно чтобы файл открывался и не привлекал лишнего внимания. Поэтому всегда проверяй работоспособность файла после слияний.
Напоследок несколько важных моментов
-
Всегда перед экспериментами делай резервные копии файлов, потому что что-то может пойти не так.
-
Все важные файлы перед маскировкой обязательно шифруй! Особенно это актуально для файлов, которые ты собираешься публиковать в интернете (кстати, неплохая идея для бэкапов).
-
Дозапись файла — самый примитивный вариант стеганографии, и он довольно легко определяется специальными инструментами, поэтому если нужна хорошая защита, то имеет смысл рассмотреть какой-нибудь более сложный метод скрытия.