Главная » Хабрахабр » Стойкое шифрование данных в PNG

Стойкое шифрование данных в PNG

Доброго утра Хабру. Читал вчера статью о хэш-стеганографии через социальные сети, и пришла мне в голову мысль сделать что-то более оптимальное в плане объёма выходных данных. Получилось что-то более-менее работоспособное и даже оптимизированное (в отличие от proof-of-conceptromabibi), поэтому, как и обещал, пишу статью.

Что ж, поздороваюсь с вами ещё раз: , и добро пожаловать под кат.
Я решил реализовать идею максимально по-тупому просто, поэтому алгоритм шифрования опишу кратко:

  1. Подгонка ключа под длину, кратную 16 (для шифрования AES)
  2. Сжатие исходных данных, используя zlib
  3. Подгонка под кратную 16 длину и шифрование сжатых данных
  4. Повторное сжатие зашифрованных данных
  5. Вычисление MD5-хэша из ключа шифрования для сравнения при дешифрации
  6. Нахождение минимального количества '\0', не встречающихся подряд в тексте, для использования в качестве разделителя данных и белого (буквально) шума
  7. Подготовка grayscale-изображения и заполнение его рандомными данными
  8. Запись строки (длина_данных + длина_MD5_ключа + MD5_ключа + данные) поверх шума

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

Конечно, нетрудно понять, что это шифр, однако, не имея алгоритма, его не так уж и легко расшифровать (ведь нужен AES-ключ, да и формат с префиксами и двойным сжатием зареверсит далеко не каждый).


Ну, получили мы картинку. Что теперь с ней делать? Отправлять получателю, конечно. Правда, ему заранее должен быть известен ключ и алгоритм (или скрипт) дешифрации. И всё бы даже было хорошо, если бы не одно «но». И это «но» — сжатие.

Очевидно, что хранить оригиналы картинок соц. сетям не выгодно. ВК, например, даже конвертирует PNG в JPG, используя не самый маленький коэффициент сжатия. А, так как у нас используются конкретные значения байт (0-255), их потеря ни к чему хорошему не приведёт. Решение — отсылать полученные изображения как документы (файлы).


Я накатал развёрнутый скрипт в 101 строку с исключениями и отображением в stderr прогресса и времени работы. Его вы всегда можете найти в репозитории туть. Скорее всего, я его буду постепенно дорабатывать, хотя в последнее время проектов (в том числе и тянущих на хабрастатьи) у меня развелось достаточно.

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

Спасибо ещё раз romabibi за идею; adios.


x

Ещё Hi-Tech Интересное!

Да будет свет

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

Где работать в ИТ #1: Voximplant

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