Как надежно записать в изображение скрытую информацию?
Стоит задача сделать так, чтобы если с социального сайта кто-то зарегистрированный сохранит изображение и выложит его где-то ещё (в случае, если персона, которой принадлежит изображение, против), можно было по выложенному файлу понять, кто нарушает правила.
На npm есть несколько библиотек для стеганографии, но я пока не понимаю, насколько это надежный метод. Изображение может подвергаться ресайзам и изменению формата на других сервисах.
1. генерация идентификационного токена: ID пользователя, которому было показана данная конкретная копия изображения + присвоенный вами id самого изображения. Чем короче (в битах) будет токен тем проще его внедрить с гарантией возможности последующего считывания с незаконных копий. По сути тут речь идет о балансе между размером токена и гарантией его прочтения.
2. защита от ресайза: закладывать информационные еденицы (биты) не в пиксели, а в сектора. например квадраты со стороной N, где каждый пиксель внутри такого квадрата дублирует информационную единицу (бит)
3. защита от кропа: избыточность добавляется не только за счет использования секторов, но и за счет повторения информации токена в других частях изображения. Необходимо сразу оценить то как именно может быть обрезано изображение и разместить как минимум 1 полную копию токена в области которая может быть обрезана с наименьшей вероятностью
4. защита от смены форматов: для внесения информации использовать не просто замену пикселей по принципу четная величина канала -1, нечетная-0 а более сложные алгоритмы, подверженные меньшему влиянию от шума. Например завязанные на какую либо статистическую характеристику всего объема пикселей входящих в сектор.
5. чтение информации: полностью зависит от выбранного вами способа внесения информации и его реализации. Для упрощения считывания можно несколько областей сделать опорными, тесть их относительное расположение и внесенная в них информация во всех изображениях одна и та же. далее в проверяемом изображении будет необходимо найти эти опорные сектора и в зависимости от их размера и расположения (могут меняется при кропе и ресайзе) вычислить положение информационных секторов, после чего произвести их чтение.
6. проверка: желательно чтобы была возможность чтения нескольких копий идентификационного токена. Сравнив их вы получите возможность убедится что чтение произведено без ошибок. Далее вы просто берете из токена ID изображения и ID пользователя получая тем самым информацию что и кем было украдено.
PS: предложенный вариант всего лишь один из возможных и придуман на вскидку, просто для того чтобы показать возможное направление реализации вашей задачи.
PPS: теоретически можно попробовать реализовать некоторую сверточную искусственную нейронную сеть (ИНС). Произвести ее обучение на большом объеме картинок, каждая из которых подготовлена в множестве вариантов обрезок, ресайзов, смен форматов и токенов. При обучении на вход такой ИНС необходимо будет подавать эти, подготовленные картинки, на выходе должно проверятся соответствие действующему токену. Далее реверс такой ИНС и подача на ее входы даст некую битовую маску, при наложении которой на изображение в него будет внесен токен. а использование прямой (не реверсной) ИНС позволит получить токен с копии фото поданной на вход. Одним из плюсов ИНС в данной задаче будет ее высокая помехоустойчивость (конечно при правильном обучении и внутренней архитектуре самой ИНС). Минусом будет достаточно большой размер ИНС.
Странные правила: персона сама выложила фотку в доступ, где другие её могут просматривать, а потом она внезапно стала против того, что её фотка появилась на стороннем ресурсе, и проблемы - вдруг стали ваши и Вы хотите сдать того, кто это сделал, тому, кто сам это сделал возможным.
Не находите это, по-меньшей мере, странным?!
Ответ в "лоб": это возможно с вероятностью 50%.
Т.к. всё зависит от методов преобразования изображения: применение трассировки (в вектор) с последующим растрированием не оставит Вам никаких шансов.
Странным не нахожу. Есть множество ситуаций, когда персона хочет публиковать что-то для ограниченного круга лиц, и не хочет, чтобы контент выходил за эти границы.
Алексей Казаков, Персона опубликовала для ограниченного круга лиц - значит она им полностью доверяет. А то, что они могут опубликовать это на стороннем сайте - очевидно заранее и это проблемы персоны (защита прав и т.д.), но никак не ваши.
Никак. Вы сами ответили на свой вопрос - другие сервисы, да и сам человек, который скачал фото, могут делать с этим файлом всё что угодно - резать теги, сжимать, изменять размер и формат.
Любая скрытая информация может быть потеряна.
Вы конечно правы, но если задать некоторые граничные условия того, что могут сделать с изображением на других сервисах, то некоторый, не очень большой объем информации в изображение вложить можно (с гарантией что при выполнении описанных граничных условий возможных преобразований исходного изображения вложенная информация не будет потеряна).
PS: хоть объем информации и не очень велик, его вполне хватит для того чтобы сохранить некий идентификационный токен
PPS: но опять же, если сервис, крадущий изображение знает о наличии такого токена и способе его внедрения в изображение, то всегда сможет от него избавится.
Роман Стеганография по сути своей незаметная и добавляет "шум" на изображение. Любое действие, которое хоть немного меняет пиксели сразу же превратит информацию в реальный шум. Если закодировать информацию более надёжно, то её станет заметно, а тут уже и до водяных знаков недалеко.
xmoonlight, спасибо за поддержку. Иван Корюков, существует множество способов внедрения информации, в том числе и дающих некоторую гарантию на защиту от шумов, помех, предумышленных изменений. В своем комментарии я прежде всего опирался на те из них, которые вкладывают информацию с некоторой избыточностью, отсюда и небольшие объемы добавляемой информации а также некоторый уровень защиты от ее потери при кропах, ресайзах, и невысоких уровнях сжатия при смене форматов (те самые граничные условия про которые я говорил).
xmoonlight, это только один из возможных способов внедрения информации с избыточностью. По факту можно просто бить изображение на сегменты заданной формы и размера (чем площадь сегмента больше тем выше избыточность и вероятность воспроизвести внедренную последовательность но меньше объем информации) с последующим вычислением внедренных информационных единиц с использованием методов статистики. Например:
- оценки матожидания и/или дисперсии и/или моментов более высокого порядка
- оценки величины корреляции точек в предполагаемой площади сектора.
- да хоть с использованием кластерного анализа (естественно модифицированного под задачу и способ внедрения информации :)
Иван Корюков, для того чтобы такая информация была менее заметна в результирующем изображении можно использовать специальные карты замены цветов (палитры), ориентированные на недостатки человеческого зрения.
Роман, по факту, ничего разбивать не нужно: я же не зря дал наводку...
Про 3 твоих примера - это всё значительнее проще того уровня, что я дал в наводке. Просто "погрузись" и всё станет понятно.
xmoonlight, ночь на дворе, завтра воткнусь :)
Вот еще один вариантик: теоретически можно попробовать реализовать некоторую сверточную искусственную нейронную сеть (ИНС). Произвести ее обучение на большом объеме картинок, каждая из которых подготовлена в множестве вариантов обрезок, ресайзов, смен форматов и токенов. При обучении на вход такой ИНС необходимо будет подавать эти, подготовленные картинки, на выходе должно проверятся соответствие действующему токену. Далее реверс такой ИНС и подача на ее входы даст некую битовую маску, при наложении которой на изображение в него будет внесен токен. а использование прямой (не реверсной) ИНС позволит получить токен с копии фото поданной на вход. Одним из плюсов ИНС в данной задаче будет ее высокая помехоустойчивость (конечно при правильном обучении и внутренней архитектуре самой ИНС). Минусом будет достаточно большой размер ИНС.