Comments 40
И не используйте картинку, которая уже есть в интернете… Чтобы не было двух почти одинаковых картинок, различающихся байтами.
Я как то пытался найти идентичные картинки на разных сайтах которые бы не различались байтами при помощи поиска по картинке. Скачал много визуальных копий одной и той же картинки. Они различались либо размерами изображения, либо размером файла. Хеши разные. Вот только про VCDIFF я тогда ещё не знал и им не сравнивал. Нашёл ли я идентичные копии в итоге не помню.
Так что найти того самого котика может оказаться не простым делом.
1. Режем картинку на квадраты где-нибудь так 10x10 пикселей и выше.
2. изменение яркости центра квадрата — наши биты
3. чтобы изменение яркости на границах соседних квадратов было не особо заметно — яркость растет/падает плавно к центру квадрата. Яркость границы между квадратами остается оригинальной (можно использовать в качестве «опорного» сигнала).
Далее традиционно — полезную нагрузку зашифровать, поверх помехоустойчивое кодирование и результат использовать в качестве «модулятора яркости» квадратов.
Можно сбоку на изоленту даже троичное кодирование прикрутить — яркость+, яркость -, яркость не изменилась, тогда возможный размер полезной нагрузки при прочих равных немного увеличится (а устойчивость кодирования к внешним помехам, соответственно, упадет).
P.S. Сильно подозреваю, что кто-то где-то нечто подобное уже воплотил (или доказал, что сие работать не будет).
Сдается мне, что здесь и без эталонной картинки обойтись можно, опираясь на среднюю яркость границы конкретного квадрата и его содержимого.
По идее, на реальных изображениях внутри такого «макропикселя» яркость сильно гулять не должна. А если сильно гуляет и алгоритм декодирования ошибся, то, быть может, помехоустойчивое кодирование выручит. Я бы, пожалуй, после кодирования тут же пробное декодирование делал: раскодировалось — хорошо, нет — пробуем немного поиграться с начальными условиями (нарезать на бОльшие квадраты, e.t.c.)
Строгого математического алгоритма предоставить не могу, повторюсь, идея возникла секунд за 30, после чего была озвучена. Так что, очень даже может быть, что декодировать сие без оригинальной картинки нереально или крайне сложно — тогда идею только в мусор.
Есть, и активно применяется в кинематографе для ловли пиратов. В каждый кинотеатр отправляется фильм с разным скрытым сообщением, и если в каком-то кинотеатре снимут экранку и выложат в интернет, то сразу ясно в каком кинотеатре она была снята, и кинотеатру выписывается штраф.
Для печати документов есть «желтые точки», но их научились обходить — xakep.ru/2018/06/27/deda-vs-yellow-dots
Я подумал и пришел к выводу что нельзя это сделать незаметно. Есть такое понятие «динамический диапазон», у человеческого глаза он очень большой, а у камеры низкий. Если сделать в изображении водяные знаки, которые бы читались и различались камерой, то человеческий глаз их тоже заметит, и обратит внимание что с картинкой что-то не так.
Я предложил заказчику другой выход — использовать машинное зрение и распознавание объектов. Например, можно разместить на картинке человеческое лицо, повернутое определенным образом, и зашифровать сообщение в параметрах этого лица — угол поворота, положение ключевых точек относительно друг друга. Эти параметры более-менее устойчивы при разном качестве изображения и не привлекают внимания. Но в таком случае нельзя зашифровать сообщение в произвольной картинке, скорее нужно наоборот, подбирать картинку, которая соответствует сообщению.
Но вот в случае «нормальных» изображений можно, наверное, найти участок с высокой энтропией и добавить туда что-то малозаметное для глаза. Ну, например, кто заметит лишний листик на фотографии кроны дерева? А при этом камерой распознается легко, да и устойчивость к обработке картинки будет высокой.
Если картинка может быть любая, то работаем с зональными уровнями яркости, это не вызовет подозрений и переживет ресайз/пережатие и печать в газете.
Сообщение можно адресовать группе людей, скажем у модели в руке тетрис, а в нем закодировано морзянкой сообщение. Или постер к матрице, в вертикальных зеленых буковках ASCII код, прочтут только программисты. Креативно составленный ребус может быть хорошим промокодом.
Пост на хабре будет?
Проще в местную газету "Из рук в руки" писать объявление про пропажу котика таких-то параметров, а параметры указывают на третьи строки в Большой Советской Энциклопедии, как в старые добрые времена :)
Хотя неплохо было бы проверить это экспериментально. Скорее всего нужно рассматривать более подробно процесс растрирования изображения перед печатью.
Вы пишете:
Возьмем меньший по модулю корень, то есть х_2
.
И тут же проводите вычисления с корнем х_1 = 1.7951
, который больше по модулю. Это, наверное, ошибка, тем более, что результат получился не 0.3256
, как вы пишете ниже, а 0.4567
.
И если ты долго смотришь в бездну, то бездна тоже смотрит в тебя.
Если это настоящая фотография, то матрице вообще без разницы, где генерировать тепловой шум.
Возможно, это фото было когда-то JPEG-ом, который удалил шум на низкочастотных участках, либо является монтажом, когда кот с одним шумом вклеен в фон с другим шумом. Обычно фотокамеры снимают в JPEG, мало кто заморачивается с RAW. Скорее всего, png — конверсия
А какое у вас объяснение?
Суть в том, что неподготовленный глаз все равно не будет видеть шум, даже если он там есть (а он там есть по определению).
Теперь насчет статистического стеганоанализа. Верно ли, что вопрос о существовании надежного стеганографического контейнера всё еще открыт? Навскидку кажется, что таковой можно построить, если известно распределение LSB в «обычных» картинках. (Хм, не совсем так, а чуть сложнее: условное распределение LSB в зависимости от всего контекста.) Тогда достаточно построить функциональное отображение из равномерного распределения (к которому обычно принадлежит зашифрованное сообщение) в это «природное» распределение. И потом применить его к сообщению и результат засунуть в LSB.
Можно провести такой эксперимент на коленке:
сможете ли вы различить, где здесь настоящий белый, почти белый (разница с настоящим белым равна 1) и уже не белый (разница с настоящим белым равна 5)?
Честно признаться, я смогла бы. Но не играют ли тут внешние факторы? Например, вы точно знаете, что это три различных цвета, вы видите большой участок покрытый этим цветом, а не мааааленький пиксель, вокруг много чисто белого, который создает контраст. Цветовосприятие крайне субъективная штука.
А здесь различаете настоящий черный, почти черный и уже не черный? Пусть вопрос останется отрытым. :)
Насчет JPEG тоже есть много нюансов. Я думаю, вам будет интересно это видео.
Словами «надежный» и «безопасный» надо играться очень осторожно. Будет обидно, если надежный стегоконтейнер придумали и успешно им пользуются, а мы об этом
Словами «надежный» и «безопасный» надо играться очень осторожно.
Это, конечно, верно. Однако мне бы хотелось получить примерно ту же степень строгости оценки качества стеганографии, что мы имеем сейчас в криптографии. Там существуют оценки стойкости шифров, опирающиеся на математические факты и математические же гипотезы. Ну и на другие практические вещи вроде качества ГСЧ, которые более-менее понятны.
Замечание по поводу LSB из представления RGB. Верно ли, что значения 0 и 1 визуально отличаются друг от друга больше, чем 254 и 255?Не отличаются физически. В большинстве мониторов 6-битные ЦАП на матрицах, т.е. на 1 не приводит к изменению картинки. Нужно менять значение на 4.
А вот в HDR-мониторах, которых на вход получают 10 бит на канал, стоят обычно 8-битные матрицы.
Скрывать не скрывая. Еще раз о LSB-стеганографии, хи-квадрате и… сингулярности?