Шифровать изображение в изображение. Как лучше всего?

trashmajor

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

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

Есть идеи?

Update. Если не касаться проблемы изменения размеров, то получается красиво:

Исходноезашифрованноедешифрованное

Тут проблема в том, что шифрованное изображение подвергается сильным искажениям при изменении размеров, JPEG сжатии и прочим, так как по сути такого рода графическое изображение нужно хранить именно в битмапе (что делает этот подход не приемлимым в современных реалиях). Остаётся попробовать увеличивать шифрованное изображение раза в два три, чтобы каждый отдельный пиксель был площадью в 2 или 3 пикселя. А перед дефишровкой искать алгоритм наиболее удачного возвращения к исходным размерам.

3 ответа

trashmajor

В точности по вашему случаю: можно обойтись перемешиванием пикселей, или лучше усреднённых цветов областей размера width/N x height/N. Кодовое слово определяет алгоритм "обхода" поля картинки, так, чтобы за конечное число шагов покрыть все изображение, побывав в любом месте хотя бы раз (возможно несколько). И банально попарно менять области местами каждые два шага. Если слово будет определять алгоритм обхода "векторно" - без привязки к точным пикселям, то изменения размера картинки не должны сильно ухудшить результат расшифровки.

Другие мысли: Надо суметь в изображении сохранять несколько "слоёв" данных: от крупных признаков, до мелких деталей. Тогда при изменении размера или ацкой компресии пропадут, скажем, совсем мелкие детали, но более крупные признаки и суть изображения останутся.

Погуглите про частотное разложение изображений. Например, с двумя частотами, исходное раскладывается на два изображения такого же размера:

  1. исходная картинка сильно блюрится (уходят мелкие детали) - это низкочастотный канал.
  2. разница исходной и блюренной - серенькое изображение — содержит только мелкие детали.

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

Так вот, интуиция подсказывает, что:

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

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


trashmajor

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

Посомотрите на этот пример, если владеете С++ link text


trashmajor

изображение запихать в base64, а base64 зашифровать в TrueCrypt или тому подобное (anubis там например).

Или сразу напрямую шифровать, если такое возможно.

Ну и в конце посмотреть в интернете, как умельцы к картинкам добавляли архивы. При всём этом нужно помнить, что большинство пикчехранилищ пересохраняют картинки.

licensed under cc by-sa 3.0 with attribution.