Как стать автором
Обновить

Комментарии 35

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

А разве нельзя зашифровать картинку Б и результат уже записывать в младшие биты картинки А? Нельзя же достоверно отличить зашифрованную информацию от просто случайного набора битов

Можно, но шум в младших битах сам по себе выдаёт наличие скрытой информации, поскольку в нормальной картинке младшие биты не похожи на шум.

Как определить, что младшие биты "шумят"?

По высокой энтропии и отсутствию корреляции с более старшими битами.

Я в школе проект делал именно с этим методом замены информации. Реально различимые на глаз искажения появляются при замене половины (4 бит) информации о цвете. А учитывая, что нормальное шифрование делает выходной файл очень похожий на случайный шум, то сомнительно, что можно будет сказать, что там есть дополнительная информация, а не шум матрицы фотоаппарата.

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

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

PNG, JPEG и сжатие

А в SVG-изображения не пытились прятать?

Это где это вейвлет Хаара используется?

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

Но насколько меньше? В видимой фотографии размером n * m есть nm/8 младших бит, то есть внутри неё можно разместить фото размером √nm/8 * √nm/8

эээ... Разве не проще сказать, что раз в каждом байте прячем единственный бит -> в восемь раз меньше?

НЛО прилетело и опубликовало эту надпись здесь

не знаю, может кому пригодится...

Сохранять данные (любые) в JPEG можно еще так:
Разбить данные на части и сохранять каждую из этих частей в Application-блоках. Например, выбрать себе App4-блок и писать таким образом:
$FF$E4 (маркер начала App4-блока), затем длину блока данных (2 байта если не ошибась), затем собственный идентификатор, например "MYPICTURE" (чтобы никто не догадался), ну а потом кусок данных. В программе-читалке парсим все это дело, ищем App4-блоки, убеждаемся, что это наши блоки (см. идентификатор) на и склеиваем данные обратно.

Формат, естественно, можно усложнить. Блоки эти видны, если открыть в HEX-редакторе, поэтому не знаю, можно ли это назвать "спрятать фото в другом".

Ну формально-то да, стеганография получается — спрятали же. С другой стороны, наличие в жопеге левых блоков легко детектируется автоматически.
То есть спрятать картинку от жены получится легко, а вот от кровавого кейджиби — нет. Наоборот, наличие в графическом файле большого количества неграфической информации моментально привлечет внимание.

А так идею можно развить — например, прятать информацию в дополнительных потоках MKV. А можно еще проще (если прячем от жены) — переименовать jpeg в dll или exe и хранить где-нибудь в Program Files. ?

А жена читает хабр, видит это сообщение, открывает такую переименованную dll, находит $FF$D8 в начале файла и у нее возникают вопросики...=)

Жены айтишников сейчас такие,да: сразу замечают лишнюю dll-ку в system32.

А нечего прятать лишние dll'ки в system32 на freebsd )

При манипуляции битов новая картинка получится другой, хотя и очень похожей на взгляд. Помню лет десять назад попадалась стеганография в каком-то текстовом формате (SVG?), когда вместо скажем «42» в некоторых местах писалось «042». Распаковщик игнорирует лидирующие нули в десятичной записи чисел и выдаёт абсолютно идентичную картинку.

для работы с битами фотографий используется Emgu CV.

Это да, современным программистам для битовых манипуляций нужны библиотеки.

Хотяя... это лучше, чем изобретать собственную, ни с чем не совместимую штуку

RarJpeg. Почему никто не вспомнил его?

Вы наверняка знаете, что некоторые форматы фото (например, JPEG) сильно сжимают исходное изображение, используя различные математические техники (например, вейвлет Хаара). Что же происходит со встраиваемым фото в таком случае? Оно с наибольшей вероятностью уничтожается, и при попытке извлечения мы увидим лишь шум.

А вот это как раз самое интересное - попробовать порассуждать над тем, как можно было бы реализовать хранение скрытого изображения так, чтобы при lossy-сжатии оно испытывало уровень деградации детализации линейно пропорциональный уровню деградации изображения-контейнера и при этом умудрялось бы оставаться скрытым для глаза наблюдателя.


Хочется высказать несколько очевидных мыслей на эту тему:

  • во-первых яркость содержит больше информации, чем цвет (в терминах человеческого восприятия). Цвет при сжатии всегда деградирует быстрее, поэтому логично предположить, что скрытое изображение, как минимум его основу, по которой оно будет восстанавливаться в информации о цвете лучше не хранить.

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

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

Исходя из этих нехитрых наблюдений, можно попробовать сделать что-то такое: выбрать радиус окрестности, построить по нему карту спектральной плотности изображения, не забывая отрезать высокие частоты. Дальше закодировать скрытое изображение в виде деформации спектра заранее известным нам образом (здесь может быть большое поле для размылений над механикой реализации такого способа). Понятно, что большого относительного объема "памяти" ожидать от такого способа хранения не стоит, но зато он будет обладать усточивостью к lossy-сжатию, что зачастую значительно приоритетнее.

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

В случае JPEG данные скрываются аналогичным образом в малозначимых коэффициентах матриц, получаемых после дискретного косинусного преобразования. В результате подмены бита (или нескольких), изображение искажается на всём квадрате 8x8, но на глаз всё равно не заметно.

Да забудьте вы про нейросетки, это тупое хайпожорство.

На самом деле для jpeg-a и подобных форматов есть 3 уровня стеганографии:

  1. Передать сообщение от Алисы к Бобу внутри картинки так, чтобы оно не обнаруживалось "гражданским" софтом;

  2. Передать сообщение через облачную инфраструктуру, условно Whatsapp, которая в процессе передачи ресайзит и пережимает изображения вообще в другой формат (условно webp)

  3. Передать сообщение от Гитлера Паулюсу так, чтобы его не перехватил Моссад.

Решения, соответственно, зависят:

  1. Можно создать свой кастомный тег, или не создавать, а просто выделить под него область в файле. Весь софт и то и другое проигнорирует, ну есть байты и есть. Это by design так. Точно так же браузеры игнорируют неизвестные теги или конструкции CSS.

  2. Здесь придётся покурить косинус-преобразование и его конкретные реализации. Соотношение открытых и секретных данных 1:8 конечно не получится, а вот что-то типа 1:1000 легко. Никаких нейросеток, это суровый, но точный матан.

  3. Если вас пасёт Моссад, у меня для вас плохие новости: вам, вероятно, не до стеганографии.

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

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

"Передать сообщение от Гитлера Паулюсу так, чтобы его не перехватил Моссад." т.е. сделать невыполнимое (с учётом того, что Моссад создана лет через шесть после смерти Гитлера.

Похоже, мне надо в каждом комменте указывать тег <ирония> (

Вы наверняка знаете, что некоторые форматы фото (например, JPEG) сильно сжимают исходное изображение. ... Но есть и другие форматы, например, PNG, которые сохраняют фотографию.

Вообще говоря, принято говорить о сжатии с потерями и сжатии без потерь.

Осталось только выяснить как залить такую фотку, скажем, в вк, чтобы после алгоритмов оптимизации обе фотографии не испортились :)

Геометки что?
Если мы все еще о JPEG'ах, то там геометки — это часть блока Exif. Запихать в него скрытую информацию можно. По сути это получается ровно то же самое, что и вот в этом комменте (только храним не в APP4, а в APP1, и нужно еще вписаться в ограничения формата Exif).

Это я к тому, что про них все забыли. Там можно спрятать информацию, о том, что этот jpeg не такой как все.

Там можно спрятать информацию, о том, что этот jpeg не такой как все.

Много где можно спрятать информацию, что джипег не такой, как все. Начиная с имени файла («маша_и_медведь_(37_утюгов).jpg») и заканчивая кучей всякого (сегменты комментариев, сегменты аппликейшен дата, тот же Exif с кучей полей). Нам по сути-то надо всего один флажок закодировать.
Только зачем?
Получатель что, не знает, в каком из файлов искать скрытую информацию? Да пусть во всех подряд ищет, благо это делается не руками, а программно. Откуда удалось извлечь, там она и была (а чтоб мусор не извлекался — контрольную сумму приделать).

Есть более простой способ - рарджепег.

rarjpeg просто глазами в текстовом редакторе видно. Смысл же не в том, чтобы движок 4chan'а обмануть, а чтобы товарищмайор не смог отличить jpeg со скрытой информацией от jpeg'а без скрытой информации.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий