Секрет, спрятанный между двумя изображениями

Два листа прозрачной плёнки могут выглядеть как обычный чёрно-белый шум, но после точного совмещения на них проступает надпись или рисунок. Именно на этом построена визуальная криптография: секрет разделяют на изображения так, чтобы каждое из них по отдельности было бесполезно, а восстановленный результат мог различить человеческий глаз без компьютера и криптографических вычислений.
Эта идея особенно интересна не потому, что прозрачные плёнки оказались удобнее цифрового шифрования. Её ценность в другом: Наор и Шамир показали, что пороговое разделение секрета можно построить непосредственно для зрения, заранее задав, сколько слоёв должно оказаться вместе и что разрешено узнать по неполному набору.
От EUROCRYPT 1994 к опубликованной схеме
Мони Наор и Ади Шамир представили предварительную версию работы Visual Cryptography на конференции EUROCRYPT 1994 в Перудже. В 1995 году статья вышла в томе 950 Lecture Notes in Computer Science на страницах 1–12. Авторы сформулировали общую схему K из N, в которой любые K долей позволяют увидеть изображение, а набор из K−1 долей не сообщает о нём ничего. Оригинальная работа разбирает не только простейший случай 2 из 2, но и более общие пороги, изображения с полутонами и слои, которые сами похожи на осмысленные картинки.
Визуальную криптографию часто ставят рядом со схемой разделения секрета Шамира 1979 года, однако это не одна конструкция в разных декорациях. В классической схеме Шамира долями служат числа над конечным полем, а секрет восстанавливают интерполяцией многочлена. Здесь долями становятся наборы прозрачных субпикселей, а роль операции восстановления выполняет их оптическое наложение.
Как пиксель превращается в два слоя
В удобном варианте схемы 2 из 2 каждый пиксель чёрно-белого секрета расширяется до блока 2×2. В таком блоке есть два чёрных и два белых субпикселя, причём возможны шесть вариантов их расположения. Для каждого исходного пикселя один из этих вариантов выбирается случайно и становится узором первого слоя.
Если секретный пиксель белый, второй слой получает тот же узор. После наложения половина блока остаётся белой, поэтому глаз видит серую область. Если пиксель чёрный, второй слой получает комплементарный узор, и при наложении все четыре позиции закрываются чёрным. Контраст между блоками с двумя и четырьмя чёрными субпикселями складывается в узнаваемое изображение.
В исходной работе описан и вариант с двумя субпикселями на пиксель, однако блок 2×2 сохраняет пропорции изображения. Цена за это очевидна: каждый пиксель занимает в четыре раза больше площади, белый фон восстанавливается серым, а неточное совмещение плёнок быстро ухудшает читаемость.

Где проходит граница совершенной секретности
Для белого и чёрного пикселя отдельный слой выглядит одинаково: в обоих случаях он содержит случайный узор с двумя чёрными и двумя белыми субпикселями. Наблюдатель, которому достался только один слой, видит одно и то же распределение шести возможных узоров и не может угадать цвет исходного пикселя даже при неограниченной вычислительной мощности. В этом точном смысле классическая схема обладает совершенной секретностью.
Гарантия относится к содержимому пикселей при корректной случайной генерации. Она не скрывает размеры и форму носителя, а повторное использование случайного слоя для разных секретов разрушает исходную модель безопасности. Физическая реализация добавляет свои ограничения: качество печати, прозрачность материала и точность совмещения влияют на результат, хотя математические доли от этого не меняются.
Что стало с идеей после первой публикации
Работа Наора и Шамира дала начало отдельному направлению исследований. Позднейшие схемы меняли порог доступа, уменьшали расширение пикселя, поддерживали цвет и полутона, улучшали контраст или маскировали доли под обычные изображения. Эти задачи связаны между собой: выигрыш в одном параметре часто оплачивается размером долей, качеством восстановленного рисунка или более сложными требованиями к совмещению.
Классические прозрачные плёнки не стали повседневной заменой зашифрованным сообщениям, но сама модель осталась полезной. Она наглядно показывает разницу между вычислительной защитой, которая рассчитывает на трудность атаки, и информационной защитой, при которой неполный набор долей в принципе не содержит данных о секрете.
Что на самом деле делает браузерный инструмент
Visual Cryptography использует ту же общую идею разделённых визуальных носителей, но не реализует классическую оптическую схему Наора и Шамира. Инструмент сначала превращает текст в цифровую матрицу, а для режима Two shares делит уже эту матрицу побитовой операцией XOR. Чтобы получить сообщение обратно, обе картинки нужно передать декодеру; простое физическое наложение их не проявит.
Вся обработка выполняется локально в браузере. Текст кодируется в UTF-8, после чего Deflate сохраняется только в том случае, если действительно уменьшает данные. При включённом пароле инструмент шифрует результат с помощью AES-256-GCM, а ключ получает из пароля через PBKDF2-SHA-256 с 200 000 итераций. Слабый пароль от этого не становится сильным, поэтому для чувствительных данных важна не только выбранная функция, но и качество самой парольной фразы. Если пароль не включён, одиночная картинка остаётся кодированием, а не средством конфиденциальности.
К полезной нагрузке добавляются CRC32 и блоки Рида–Соломона. Они решают разные задачи: контрольная сумма обнаруживает повреждение, а избыточные символы позволяют исправить часть ошибок. Заголовок защищён восемью проверочными байтами во всех режимах, тогда как объём защиты данных зависит от профиля.
Maximum спроектирован с расчётом на восстановление после примерно 10% случайно повреждённых ячеек, но это не универсальная гарантия для любой картинки. Результат зависит от размера сообщения, профиля, характера повреждения и качества исходного файла. Поэтому встроенный симулятор не показывает абстрактный рейтинг: он вносит от 1% до 35% случайных ошибок или рисует сплошную царапину, а затем запускает настоящий декодер для получившейся матрицы.
От четырёх уровней к Glyph Mosaic
В обычных режимах одна ячейка хранит два бита через один из четырёх уровней. Матрицу можно вписать в квадратный, альбомный или широкий кадр, а свободные ячейки заполнить детерминированным шумом. Четырнадцать стилей меняют способ рисования тех же значений: это могут быть плоские пиксели, растр, контуры, лабиринты, дуги Труше, изометрические блоки или топографические линии. Палитры и декоративные элементы меняют внешний вид, но не увеличивают объём исходных данных сами по себе.
Отдельно устроен Glyph Mosaic, вдохновлённый проектом libcimbar. Здесь значение определяется сочетанием формы из шаблона 8×8 и цвета чернил. Режимы используют 16 или 32 формы и 4 или 8 цветов, получая от 6 до 8 бит на ячейку. Шаблоны подобраны с заметным расстоянием Хэмминга, а декодер перебирает возможные размеры сетки, что помогает пережить умеренное масштабирование и размытие. При этом у формата нет системы поиска перспективы и реперных меток, как у QR-кода, поэтому произвольно повёрнутый снимок, сильная обрезка или слишком мелкие ячейки могут не прочитаться.
Почему две цифровые части тоже требуют оговорок
В режиме Two shares инструмент создаёт равномерно случайную матрицу A с помощью криптографического генератора браузера, а каждую ячейку B вычисляет как XOR соответствующей ячейки A и закодированных данных. При свежей случайности и фиксированном размере распределение одной части не зависит от значения исходной ячейки, поэтому по A или B нельзя восстановить содержимое матрицы.
Однако цифровые части раскрывают свои размеры, выбранный стиль, палитру и часть настроек, а для объединения должны иметь одинаковую геометрию. Это важное отличие от безусловной фразы «картинка не сообщает ничего»: не раскрываются значения ячеек, но внешние признаки файла никуда не исчезают. После объединения декодер проверяет заголовок, исправляет допустимые ошибки, проверяет целостность, при необходимости расшифровывает данные и возвращает исходный текст.
Результат сохраняется в индексированный PNG с четырёх- или восьмицветной палитрой, адаптивным выбором фильтра для каждой строки и Deflate-сжатием. Его также можно скопировать как Base64 data URL. Так классическая идея о двух бесполезных по отдельности носителях получает цифровое продолжение, но механизм восстановления и границы безопасности у него уже другие.
Похожие инструменты
Частые вопросы
Что такое визуальная криптография?
Это способ разделить секретное изображение на несколько шумоподобных слоёв, которые восстанавливают рисунок при наложении. В классической схеме 2 из 2 каждый слой сам по себе статистически не зависит от цвета скрытого пикселя, а результат можно прочитать глазами без вычислений.
Кто придумал визуальную криптографию?
Мони Наор и Ади Шамир представили предварительную версию работы Visual Cryptography на EUROCRYPT 1994. Статья была опубликована в 1995 году в томе 950 Lecture Notes in Computer Science.
Почему отдельный слой ничего не раскрывает?
Для каждого пикселя случайно выбирается один из шести узоров 2×2 с двумя чёрными и двумя белыми субпикселями. Распределение отдельного слоя одинаково для белого и чёрного секретного пикселя, поэтому по одному слою невозможно определить его цвет. Это утверждение предполагает правильную случайную генерацию и не относится к размеру изображения или другим внешним признакам.
Чем браузерный инструмент отличается от классической схемы?
Классическая схема создаёт монохромные прозрачные слои, а секрет появляется при их физическом наложении. Браузерный инструмент кодирует текст в цифровую матрицу и при необходимости делит её на две XOR-части, которые объединяет программа-декодер. Он также поддерживает парольное шифрование, коррекцию ошибок и художественные стили.
Насколько безопасен режим Two shares?
Для матрицы фиксированного размера инструмент создаёт равномерно случайную часть A, а часть B вычисляет как XOR части A и данных. При свежей случайности каждая часть по отдельности не раскрывает значения ячеек, однако видимыми остаются размеры, выбранный стиль и другие параметры изображения. Для конфиденциальности одного изображения нужно отдельно включить парольное шифрование.
Автор
Alex RelFullstack Engineer
В коммерческой разработке с 2011 года — больше 15 лет. Автор двух SaaS-продуктов: TeleGo.io и LingvoHabit.com. Статьи здесь выросли из реальной клиентской и продуктовой работы.



