Контроль аутентичности содержимого цифровых изображений на основе стеганографического встраивания
Реализация схемы контроля аутентичности содержимого цифровых изображений на основе стеганографического встраивания информативной низкочастотной составляющей блоков изображения в само изображение.
Разработка проводилась в среде MATLAB версии R2020b. Для удобства работы были использованы стандартные средства и методы по работе с изображениями из библиотеки Image Processing Toolbox.
Рабочая программа представляет собой скрипт, разделенный на 2 секции. В первой секции производится стеганографическое встраивание, на вход передается название файла с изображением:
img = imread('csf.png'); % загрузка изображения из папки с кодом
Запустив первую секцию, на выходе получаем зашифрованное изображение, которое можно сохранить в эту же папку, воспользовавшись командой imwrite:
imwrite(newImage, 'shifredcsf.png');
Теперь это изображение можно изменить, имитируя действия злоумышленника, и подать его во вторую секцию, аналогично используя команду imread:
badImage = imread('badcsf.png');
Запуская отдельно вторую секцию, на выходе получаем маркированное изображение с указанием участков, где были внесены изменения (подсвечены красным цветом).
Скрипт можно запускать весь, тогда изображение из первой части попадет сразу во вторую секцию, при этом работу злоумышленника можно имитировать непосредственно в коде.
Все результаты и промежуточные шаги выводятся в виде изображений с помощью команды imshow. Всего их 4:
- изначальное изображение,
- зашифрованное,
- изменённое (или неизменённое, если злоумышленник не перехватил нашу картинку),
- маркированное с указанием измененных блоков.
Для всех значимых частей приведены комментарии в коде, здесь отмечу наиболее важные моменты:
- Для расчёта перцептивного хеша использовался алгоритм pHash на основе дискретного косинусного преобразования. Для этого использовалась стандартная функция dct2, возвращающая матрицу коэффициентов ДКП.
- Алгоритм шифрования хеша применять не стал.
- Стеганографическое встраивание производилось по методу Куттера-Джордана-Боссена:
% стеганографическое встраивание по методу Куттера-Джордана-Боссена:
B = blockImage(:,:,3); % выделение синего цветового канала
% проходим по пикселям синего канала изображения:
p = 1; % номер встраиваемого бита сообщения
for a = w + 1 : n - w
for b = w + 1 : n - w
% модифицируем пиксель в синем канале (прибавляем или вычитаем яркость в этом месте)
B(a, b) = B(a,b)+(2*s(p)-1)*q*grayBlockImage(a, b);
p = p + 1;
end
end
% копируем исходное изображение и вставляем измененный синий канал обратно в контейнер:
newBlockImage = blockImage;
newBlockImage(:,:,3) = B; % модифицированный блок изображения
newImage{I, J} = newBlockImage; % заполняем массив блоков нового изображения
Здесь w - это ширина окрестности (число соседей слева, сверху, справа и снизу от модифицируемого пикселя), а q – энергия сигнала (чем меньше q, тем менее заметно изменение пикселей, но больше вероятность ошибки при извлечении).
Извлечение:
% извлечение информации
s_ = s * 0; % сюда будем записывать извлеченные биты сообщения
B = blockImage(:,:,3); % выделяем синий цветовой канал
% проходим по пикселям синего канала изображения:
p = 1; % номер считываемого бита
for a = w + 1 : n - w
for b = w + 1 : n - w
hs = B(a - w : a + w, b); % пиксели сверху и снизу от пикселя (a,b)
vs = B(a, b - w : b + w); % пиксели слева и справа от пикселя (a,b)
b_ = (sum(hs) + sum(vs) - 2 * B(a, b)) / (4 * w); % среднее
% cравниваем значение пикселя с величиной среднего соседей
% если больше, то бит сообщения = 1, если меньше - 0
s_(p) = B(a, b) > b_;
p = p + 1;
end
end
4. Оценка близости записанного ранее хеша с рассчитанным сейчас при проверке аутентичности производится с помощью вычисления расстояния по Хэммингу:
D = pdist([s; s_], 'hamming'); % вычисление расстояния по Хэммингу
Если оно было больше определенного значения tau, которое устанавливается пользователем, то такой блок помечается красным цветом:
if(D>tau)
block{I, J}(:, :, 1) = 1; % окрашивание блока в красный цвет, если расстояние больше tau, т.е. блок скорее всего был изменен злоумышленником
end
Параметр tau можно не только устанавливать вручную, но и автоматизировать его подбор:
tau = mean2(isAuthentic); % среднее значение расстояний D в массиве
for i=1:size(block, 1)
for j=1:size(block, 2)
if(isAuthentic(i, j)>3*tau)
block{i, j}(:, :, 1) = 1; % если значение расстояния для блока втрое выше среднего, этот блок окрашивается красным
end
end
end
Примеры работы программы
Пример №1
Допустим, злоумышленник хочет подделать автомобильный номер на фотографии:
Как видим, программа обнаружила, где были внесены изменения.
Пример №2
Что будет, если шпион захочет внедрить вредоносный код?
Выводы
Полученная схема обеспечивает не только контроль аутентичности содержимого исходного изображения в целом, но локализует совершенные изменения. Была смоделирована работа злоумышленника – вносились различные изменения (удаление/добавление/изменение объектов) в фотографии и скриншоты текста.
При правильном подборе параметра tau ошибки определения стремятся к нулю. Путем многочисленных опытов над различными изображениями было выяснено, что оптимальным значением является tau = 0,3. Для неизменённого изображения обычно расстояние Хэмминга не превышает 0.1 для каждого блока. Подвергшиеся изменению блоки показывают 0,4 и выше. Для автоматического подбора tau можно устанавливать его втрое большим, чем среднее значение по массиву, но в этом случае возможны ошибки, например, когда дополненные нулями края изображения показываются как измененённые.
Также на качество аутентификации влияют параметры встраивания q и w. Было выяснено, что для энергии сигнала q оптимальным будет значение 0,2, т.к. при q >= 0,3 уже заметны синие встроенные пиксели, а при q <= 0,1 повышается ошибка извлечения. Для ширины окрестности w оптимальным является значение 1-2, т.к. при больших значениях видны незаполненные «рамки» вокруг каждого блока.
Комментарии