С момента публикации первой части статьи появились интересные инструменты, демонстрирующие побочные возможности Youtube для хранения цифровой информации. Например, утилита Infinite-Storage-Glitch. Автор утилиты DvorakDwarf, пользуясь рациональным размещением цифровой информации в черно-белом формате CV_8UC3, успешно использовал Youtube если не в качестве полноценного дропбокса, то в качестве прототипа альтернативного файлового хранилища, что вызвало массу различных инспираций и породило бурную реакцию пользователей, в том числе этического характера.
Следующим вполне очевидным шагом в эволюции утилиты могла бы стать, вероятно, замена скучных обоев мелкающих черно-белых квадратиков, создающих для зрителя лишь визуальный дискомфорт, на полноценное цветное видео со звуком. Однако что помешало автору сделать этот вполне ожидаемый шаг? Вероятно это то, что цветное видео требует иного парадигмального подхода. Одно дело, когда цифровую информацию можно записывать и считывать практически без потерь, и совсем другое дело, когда приходится иметь дело с оптимизирующим видеокодеком. Однако нельзя не признать, что работа с цветным изображением все же ведется и имеются определенные плодотворные попытки в этом направлении [1].
По многочисленным просьбам хабровчан (один человек просил в комментариях) появилась идея продолжить собственные эксперименты и оформить программное решение в виде отдельной утилиты. Это наложилось на прежнее желание реализовать своими силами за один вечер, теперь уже на языке Go без использования каких-либо внешних стеганографических библиотек и иных специальных инструментов экспериментальный програмный «стенд», нащупывающий глубину стеганографических возможностей видеохостинга.
Следует особо подчеркнуть, что природа интереса автора статьи к указанной теме корениться не в стремлении нецелевого использования Youtube, что имело бы, по меньшей мере, сомнительный этический характер, но новыми возможностями, открывающимися крайне широко на стыке программно-инженерного ремесла и спортивного азарта. Заинтересовала работа в ситуации, когда потеря информации является неустранимым «онтологическим» условием в работе стеганографии. Здесь-то и засверкал всеми своими красками фокус исследовательского интереса. Поскольку совсем скучно стеганографировать файл, при условии, что он не будет целенаправленно модифицироваться, проверяться на прочность демаскирующими методами Youtube, а использоваться только в том виде, в котором он был подготовлен.
Для наукообразных экспериментов Youtube является очень хорошей площадкой для экспериментов, поскольку представят собой современную и наиболее совершенную систему для оптмизации видеопотоков в промышленных масштабах и умеет очень «разумно» сопротивляться стремлению что-либо делать с видео-данными помимо их основного сценария использования. Например, Youtube имеет многоуровневую стратегию валидации и оптимизации, отложенную во времени и может оптимизировать загруженный файл не сразу, а по шагам, используя для этого разные техники.
Так, Youtube до предела эксплуатирует фактор психовизуальной избыточности. Этот фактор доведен до уровня, когда неразличимость (слабая различимость) деталей в изображениях человеческим глазом позволяет оптимизировать данные настолько, насколько это допускают предложенные инженерами алгоритмы упаковки и заранее определенный баланс между качеством и размером хранилища видео-данных.
Поэтому первое, чему приходится ожесточенно противостоять уже на первых шагах эксперимента — это стремление кодека избавиться от мелких деталей заметно не влияющих на качество видео для человека, но влияющих принципиально на полноту и целостность стеганографии. Оптимизация видео не позволяет использовать в явном виде такие известные и доступные в стеганографии методы как, скажем, Least Significant Bit insertion, поскольку кодеки радикальным образом «перемалывают» цвета в изображении, реструктиризуя первоначально сформированные видео-контейнеры. Удаляются метаданные, которые передаются вместе с видеофайлом. Такого рода стеганографические инструменты оказываются т.н. «хрупкими» или «полухрупкими», поскольку полностью или частично разрушаются при работе кодеков. Работа алгоритмов Youtube неминуемо ведет к потере целостности и полноты в хранимых данных, если речь идет о нашей методике «прожигания пикселей» в цветном изображении. Практически невозможно эффективное сохранение данных и в шуме, поскольку шум и мелкие текстуры, как уже было сказано, оптимизируются в первую очередь.
Далее, что вызвало у автора статьи еще большее творческое оживление и трепет, программист-исследователь легко попадает в порочный круг своих инженерных стереотипов — его вполне разумное и оправданное стремление к обеспечению надежности хранения информации приводит к необходимости многократного резервирования контейнеров, а ситуация с многократным резервированием создает новые возможности для компресии данных, когда одна порция данных оказывается схожей с другой порцией данных, поскольку возрастает общий фонд образов и доступны новые уровни в оптимизации хранения и работы с видео.
Всё выше отмеченное позволило автору выдержать высокий градус научно-исследовательского интереса на всем продолжении экспериментов и активно нащупывать по ходу работы разнообразные робастные подходы к хранению и восстановлению данных, кодированию в условиях обеспечения требований к помехоустойчивости.
Этический аспект
Несмотря на то, что тема уже однажды поднималась следует, на наш взгляд, еще раз отметить в этом новом контексте, что стеганография подразумевает работу с определенной информацией с учётом сохранения в тайне самого факта хранения такой информации. Наша ситуация носит несколько иной характер. В научно-исследовательских целях мы, соответствуя принципам свободного и добросовестного использования инструментов и технологий программной инженерии и всех порождаемых ею продуктов, не скрываем наши намерения, декларируем об этом открыто путем добавления соответствующих пояснений, размещения ссылок на используемые нами материалы. Все наши результаты открыты и доступны для воспроизведения, изучения и оценки. Артефакты стеганографии также носят не закрытый, а открытый перелом характер. Мы не вводим никого в заблуждение и уважаем права правообладателей. Более того, мы призываем также поступать всех, кто оказался так или иначе сопричастен с нашей работой, которая состояла в определении глубины возможностей предлагаемого инструмента для обеспечения устойчивости демаскирующим методам Youtube.
Описание утилиты
Утилита автора статьи реализует кодирование через размещение в последовательности PNG фреймов, на которые разбивается фоновое видео, условно скрытых данных путем внесения в изображения незначительных изменений. Степень «незначительности» носит субъективный фактор и может быть отрегулирована, например, путем подбора коэффициента визуальной удовлетворенности, с одной стороны, а также определяться по контролю ошибок при восстановлении данных, — с другой.
В рабочем цикле утилиты можно выделить следующие шаги:
Обеспечение необходимой избыточности во входном битовом потоке. В эксперименте используется наивный подход, реализующий последовательное дублирование данных с определенной частотой. Интерпретация входного и выходного потоков как битовых каналов, на наш взгляд, удачно вжилась в представление типа unbuffered channel языка Go. Здесь подчеркнем, что Go выбран в связи с тем, что в его концепты хорошо ложаться представления о потоковой обработке данных и наличиствуют встроенные механизмы для обеспечения и контроля их производительности.
Реализация однородности данных для обеспечения стойкости к повреждению записываемой информации путем перемешивания байт (а, в качестве экспериментального инструмента — битов в байте). Здесь речь идет о реализации data whitening process — изменении последовательности байтов (и битов в байтах — как отдельная опция) для выравнивания распределения данных и удаления в них любых нежелательных шаблонов или автокорреляций, прежде всего, затем, чтобы Youtube смог выбрать как можно меньше целей для принудительной оптимизации на основании изучения статистических свойств в данных файла, взятого для видеохостинга.
На этапе реализации критерия однородности в качестве алгоритма низшего уровня в обеспечении стеганографической стойкости используется Stegokey — ключ, который позволяет размешать, а потом и восстановить исходные данные по декодируемому массиву байт (в том числе и отдельных бит).
Подготовка к сохранению бинарной информации в теле фонового видеофайла путем «прожигания» отдельных пикселов в соответствии с накладываемыми паттернами. По большом счету этот способ эквивалентен процедуре нанесения водяных знаков на изображение. Здесь речь идет о блендировании (смешивании) двух изображений (фонового и специально подготовленного для хранения бинарной информации). Важной целью при этом выступает поиск баланса между качеством блендирования и гарантиями восстановимости информации. Для этого в утилите используются три уровня «комфортности» — «агрессивный», предназначенный для видеохостинга Youtube, «экспериментальный» для текущих экспериментов по поиску баланса параметров и «комфортный» — для простой стеганографии, но хрупкой к повреждению контейнеров.
В качестве паттернов для хранения бита информации в изображении выбраны две «зебры» размерами 8x8 пикселей. Размер подобран эмпирически. Эти паттерны являются самой простой вариацией на тему Barcode и QR code.
Одна зебра относительно другой повёрнута на 90°. У этого типа паттернов имеется масса практических достоинств, например простота реализации оптической классификации двух классов и высокая надежность разделения при демаркации в условиях зашумления, что достигается контрарностью структур паттерна и избыточностью.
Следующим шагом является разворачивание «ковра» из подобных паттернов в соответствии с кодирующим потоком бит — последовательно по цепочке покрывая фрейм за фреймом. Остаточный объем последнего фрейма с целью маскирования точного размера файла-донора заполняется мусором.
Декодирование выполняет обратную операцию — сворачиваем «ковер». Это реализовано через распознавание паттернов в последовательности вытащенных из видео фреймов. Вначале скачанный с Youtube ролик, «перемолотый» и «прожеванный» алгоритмами оптимизации порежем на фреймы, как и прежде, а для каждого фрейма запустим названную операцию.
Следует подчеркнуть, что в стремлении противостоять Youtube за успехами в оптимизации видео, в ситуации когда человеческий глаз уже практически не видит разницы между фреймами, неминуема ситуация, когда при добавлении наших артефактов зрение человека все же почувствует разницу. Чем же мы можем помочь в смягчении влияния такого искажения на чистоту картинки? Самым простым методическим способом избавления от этого недостатка, на наш взгляд, может быть кодирование в более высоком разрешении, а просмотр пользователем видеоизображения ниже одним уровнем. Например подготовка видео в разрешении hd1080, а просмотр hd720 и т.п.
Эксперимент
Проведем простой эксперимент, целью которого выступит оценка визуального качества результата размешивания в видео-акцепторе формата WEBM hd1080 файла-донора. В качестве донора использовался роман А.С.Пушкина «Дубровский». Параметры выбраны с таким расчетом, чтобы объем подмешиваемой информации укладывался в относительно приемлемое для ожидания время отработки утилиты.
Файл | Роль | Размер |
dubrowskij.txt | Файл-донор | 143k |
dubrowskij.txt.crp | Файл-донор, обёрнутый корректирующим кодом Bose-Chaudhuri-Hocquenghem | 286K |
new_peoplenyc1080p.mp4 | Видео-акцептор (фоновое видео со звуком) | 6,1M |
dubrowskij.txt.crp_filesize58435200.webm | Видео для хостинга Youtube | 199M |
dubrowskij txt crp filesize58435200 [7WhQfMocbQQ].mkv | Скачанное видео после оптимизации в хранилище Youtube | 62M |
dubrowskij.txt.youtube | Восстановленный файл-донор (после основного декодирования и восстановления через корректирующий код) | 143k |
Для процессора AMD Ryzen 5 6600H выполнены следующие измерения.
Временные затраты на кодирование (без внешних обёрток).
real | 33m0,299s |
user | 79m26,639s |
sys | 0m10,871s |
Временные затраты на декодирование (без внешних обёрток)
real | 10m20,517s |
user | 17m25,118s |
sys | 0m12,946s |
Визуально читателю предоставляется возможность самому оценить полученные результаты.
Видео-акцептор, hd1080 ("Free People in New York City Video Footage", sound by Iamazerrad)
Стеганография после оптимизации в хранилище Youtube, hd1080
Видео после оптимизации в хранилище Youtube, hd720 (встроенное видео возможно не покажет разницы, для сравнения следует перейти на сайт Youtube)
Стеганография, сравнение режимов «агрессивный» и «комфортный», hd1080
Мы можем отметить, что больше нет скучных обоев мелкающих черно-белых квадратиков. Черно-белое видео заменено цветной картиной со звуком. Безусловно, данный результат получен при определенных технических компромиссах и алгоритмических упрощениях.
Несмотря на определенный успех все же следует признать, что подобные методы «прожигания» пикселей слабо неэффективны, поскольку до конца не снимают проблему мерцания и актуализируют новую проблему потери цветовой насыщенности изображения. Впрочем «хрупкий» вариант стеганографии внешне почти без изьянов.
ToDoList
Алгоритмы эффективной коррекции ошибок не реализованы в теле утилиты, однако они могут быть легко подключены через pipe или вынесены в отдельную утилиту-обертку. Однако в целях оптимизации всего контура стеганографии желательно включить их в ядро утилиты с опциями принятия целевых решений по оптимизации.
К сожалению, результат стеганографии настоящей утилиты не обладает криптографической стойкостью. Впрочем это и не стояло в первоначальных планах. Однако, как и в предыдущем случае, исходное оборачивание файла в криптографический «мешок» с коррекцией ошибок, снимает пока с повестки дня эту задачу.
Алгоритмическая оптимизация алгоритмов на языке Go еще ждет своего звездного часа. Сейчас стеганографическая процедура требует заметных вычислительных затрат. Язык Go предоставляет массу удобств по рефакторингу кода к виду, когда утилита может продемонстрировать и в этом аспекте свои лучшие стороны.
Требуется более тонкая настройка параметров ffmpeg при сборке файла-результата из отдельных фреймов, поскольку в данный момент наблюдаются определенные проблемы с рассинхронизацией видео и звука. Кроме того, нетрудно заметить, что скорость работы утилиты упирается в производительность работы этой библиотеки с PNG-файлами.
Было бы неплохо растворить в хранящихся контейнерах метаинформацию о данных, включая размер, имя файла, его контрольную сумму, записать ее в тело бинарного результата, «размазав» ее по всей длине файла «ровным слоем» и превратить хранилище в своеобразную форму цифрового фрактала, когда агрессивное отрезание произвольной его части целиком или по отдельным битам до определенного порога чувствительности, обеспечивающей целостность и полноту, не приводило бы к фатальным качественным потерям. Впрочем и эта задача может быть технически сведена к действиям, изложенным в пунктах 1 или 2 настоящего перечня.
Выводы
Оказалось, что на парктике вполне можно «растворить» какой-либо бинарный файл, разместив его в теле видеофайла так, чтобы при этом внедряемые данные можно было относительно легко и беспрепятственно достать потом обратно с определенной гарантией.
Cобственная стеганографическая pet-поделка смогла выдержать основные тесты и успешно пройти через все круги
адажернов внутренних верификаций и преобразований Youtube. Однако при этом следует акцентировать внимание читателя на то, что утилита в настоящий момент не соответствует требованиям стеганографической стойкости и поэтому открыта для достраивания в open source режиме, в надежде на эволюцию.По результатам экспериментов утилита получила своеобразный контр-девиз: долго, дорого, неэффективно. Поэтому созданный инструмент невозможно использовать кем-либо для нанесения какого-либо вреда или значимого ущерба площадкам видео-хостинга путем превращения их в аналоги дропбокса. Говоря более предмето, побитовая работа с данными и попиксельная обработка изображений в вычислительном смысле не являются приемлемыми для промышленной эксплуатации метода в качестве своеобразной конкурентоспособной альтернативы файловому хранилищу.
Реализованная задача открывает еще более широкое пространство для дальнейших экспериментов, поскольку допускает и даже нацеливает широкий круг читателей на творческий перебор алгоритмов, параметров обработки, хранения, показа видеоинформации. Надеемся, что комбинирование различных алгоритмических техник, в том числе хорошо описанных в литературе, позволит добиться в этой области более заметных результатов.
Благодарности
В заключении автор выражает особую благодарность Андрею Л. за возможность концептуального обсуждения данного инструмента на всех этапах его подготовки и отладки. Без этой поддержки данная утилита вряд ли «увидела бы свет в конце тонеля». Андрей является автором питон-скрипта для оборачивая входного файла корректирующим кодом Bose-Chaudhuri-Hocquenghem, как предполагалось изначально для обеспечения дополнительных гарантий полноты и целостности файла. Он указал на необходимость избавления от психовизуальной проблемы мерцания видео. Кроме того, автор передает слова благодарности Олегу Б. за присланную ссылку на утилиту Infinite-Storage-Glitch и напоминание тем самым о необходимости завершения второй части работы. Всем хабровчанам, высказавшимся в комментариях, а может быть даже невысказавшимся – низкие поклоны. Все комментарии рассмотрены и должные выводы сделаны.
Интенции
Новую версию стеганографии и всех графических материалов можно найти на гитхабе. Все еще этот набор не является готовым инструментом, а служит лишь рабочей демонстрацией эксперимента. Побитовая обработка заведомо не лучшая идея и поэтому оптимизация рабочего стека еще ждет своего часа. Прежде всего, внимание предстоит уделить должной утилизации CPU.
В данный момент автор статьи активно ищет возможности влиться в успешную команду, которая занимается подобными или аналогичными популярными темами в целях дальнейшего удовлетворения интереса к этой или аналогичной проблематике. Поэтому автор будет очень рад любой реакции на размещенные материалы. Особенно интересно, если читатель является лицом принимающим компетентные решения и может помочь конкретными шагами в переходе автора из любительской фазы в фазу профессиональную. Автор с признательностью рассмотрит все предложения по развитию утилиты в любых значимых и полезных для общества, а также мировой экономики целях.
Литература и источники для размышления
https://github.com/pixelomer/bin2video
https://en.wikipedia.org/wiki/Error_correction_code
https://web.archive.org/web/20120905034757/http://www.eece.maine.edu/~eason/steg/SPIE98.pdf
https://habr.com/en/articles/358820/
https://github.com/rondotcomYT/Infinity-Drive
https://en.wikipedia.org/wiki/BPCS-steganography