Стеганография

Играем в шпионов (понарошку)


Стеганография - это искусство прятать информацию там, где ее никто не станет искать.

Здесь вы можете спрятать текст в картинку, и никто об этом не узнает.

ВАЖНО: представленный инструмент НЕ ЯВЛЯЕТСЯ стеганографически-устойчивым и не подходит для сокрытия критически важной информации

Как пользоваться сервисом:

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

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

При указании тега учитывается регистр (unvsteg и UNVSTEG - разные теги).

Инструкция:

  1. Введите тег, с которым хотите работать (можете оставить по умолчанию).
  2. Это можно сделать и потом, но удобнее указать его заранее.

  3. Загрузите изображение с помощью специальной формы.
  4. Изображение должно быть в PNG формате и обладать непрозрачными областями, (информация будет записана в них).

  5. Вы увидите хранящуюся в картинке информацию (если она есть), а под загруженным изображением появится поле для ввода текста.
  6. Чтобы спрятать текст, введите его в появившееся поле, а затем нажмите "Скрыть текст".

  7. Дождитесь завершения процесса (обычно это происходит почти мгновенно).
  8. Нажмите "Скачать результат, чтобы загрузить изображение на устройство.

  9. Чтобы проверить, все ли получилось, загрузите готовое изображение на сайт.
  10. Если все прошло успешно - вы увидите свой текст в соответствующем поле.


Загрузите изображение в формате PNG

Здесь будет загруженное изображение

Здесь будет информация об изображении

Найденный текст:

Этот тег будет использован для поиска и записи текста:

Введите текст, который хотите скрыть

Для обозначения текста будет использован тег: UNVSTEG

Текст занимает 0 байт из 0 возможных.

Результат:

Получившееся изображение

Здесь будет получившееся изображение

Скрытый текст

Передавайте получившееся изображение, КАК ФАЙЛ. Многие сервисы (мессенджеры, соц.сети) сжимают изображения, меняют расширение - ваши данные будут утеряны.

Любой, загрузивший вашу картинку на этот сайт, увидит скрытый в не текст. Так же и вы увидите спрятанный с помощью этого сайта текст в любой картинке.

Но вы можете предварительно зашифровать свой текст. Сделать это можно в моем шифраторе: crypt.unvladimir.ru.


Ответы на вопросы

(кликните на вопрос, чтобы увидеть ответ):

Вопрос: Что такое стеганография?

Ответ: Стеганография - это искусство скрывать одну информацию внутри другой информации (или объекта) так, чтобы нелья было обнаружить не только ее саму, но и сам факт ее наличия.

Проще всего объяснить это в сравнении с криптографией. И то и то - средства сокрытия информации.

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

Когда вы видите стеганограмму, вы видите привычный для вас объект. Этот объект имеет смысл, выполняет понятную функцию, и вы даже не догадываетесь, что он скрывает в себе какую-то информацию.


Вопрос: Как это работает?

Ответ: Введенные данные разбиваются на биты, а картинка - на цветовые каналы. Каждый бит данных последовательно заменяет собой младший бит следующего цветового канала пикселя картинки. Этот вид стеганографии называется LSB - Least Significant Bit.

Теперь немного подробнее.

Введенный вами текст превращается в массив бит.

Картинка разбивается на цветовые каналы (R, G, B, A). Получается такой массив каналов: [R, G, B, A, R, G, B, A...], где каждая последовательность R-G-B-A - это пиксель.

Да, пиксель - это абстракция, в изначальном массиве, как самостоятельной сущности, его нет. PNG картинка раскладывается на цветовые каналы, которые становятся пикселями при интерпретации картинки на более высоком уровне - в какой-нибудь программе для просмотра изображений.

Каждый канал занимает ровно 1 байт = 8 бит, и 8-й бит канала заменяется на следующий бит ваших данных.

Данные записываются во все каналы, кроме канала A (альфа), он пропускается. Таким образом, в каждый пиксель записывается по 3 бита данных.

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


Вопрос: По какому принципу данные записываются в изображение?

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

В начале записи указывается тег (по умолчанию - UNVSTEG, но вы можете выбрать свой). После тега вносится длина записываемой информации, а затем основные данные. Да, под длину записи резервируется 4 байта, длина тега вычисляется автоматически при его вводе.


Вопрос: Как данные читаются из изображения?

Ответ: Из ответа на предыдущий вопрос мы выяснили, что картинка маркируется тегом, после которого указывается длина закодированного сообщения.

Первые байты загруженной картинки сравниваются с тегом. Если тег совпадате, то последующие 4 байта переводятся в число - длину закодированной информации. Далее из картинки извлекается количество данных, соответствующее ранее полученной длине. Извлеченные данные переводятся в текст.


Вопрос: Картинка не загружается. Что делать?

Ответ: Делайте вот что:

  1. Проверьте формат изображения, это должен быть PNG. Смена расширения не работает, если вы просто поменяете .jpg на .png - получите ошибку.
  2. Проверьте, открывается ли картинка на вашем устройстве и попробуйте загрузить другое изображение, возможно именно с конкретным файлом что-то не то.
  3. Попробуйте другой браузер. Для проверки используйте популярные браузеры (FireFox, Chrome и т.д.), потому что в них все тестировалось, и все должно работать.

Вопрос: Картинка загрузилась, но текст не записывается. Что делать?

Ответ: Тут примерно то же самое:

  1. Проверьте формат изображение, нужен PNG.
  2. Проверьте, есть ли свободое место под текст (в окне информации об изображении) и не превышает ли ваш текст данный лимит (счетчик под полем для ввода текста).
  3. Попробуйте другое изображение.
  4. Попробуйте другой браузер.

Вопрос: Картинка загрузилась, но места под текст нет или слишком мало. Почему так?

Ответ: Место под текст зависит от количества непрозрачных пикселей. Даже незначительно изменение прозрачности делает пиксель непригодным для записи. Проверьте в графическом редакторе прозрачность изображения (альфа-канал должен иметь максимальное значение). Как вариант, попробуйте другое изображение (можете создать сами тестовую картинку, которая точно не будет прозрачной).


Вопрос: Прозрачности вообще не должно быть?

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

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


Вопрос: В чем проблема прозрачных пикселей?

Ответ: Если коротко, браузеры и редакторы могут принудительно изменять цветовые каналы таких пикселей, что приводит к потере данных. Причем, даже если значение альфа-канала на 1 отличается от максимального (254 вместо 255), пиксель уже считается прозрачным.


Вопрос: Можно ли редактировать получившееся изображение?

Ответ: Да. Ваши данные записываются построчно по пикселям, начиная от левого верхнего угла картинки слева-направо. Используются только непрозрачные пиксели.

Место, куда данные не были записаны, можно редактировать или даже удалять.

Но помните, что прозрачные пиксели при чтении и записи не учитываются. И если на пути записи был прозрачный пиксель, а вы его отредактируете, сделав непрозрачным, то при чтении он начнет считаться, и, начиная с него, вывод ваших данных собъется.


Вопрос: В картинку был записан текст, но при загрузке он не читается. Что делать?

Ответ: Если до этого вы тестировали, и все работало хорошо, то проблема скорее всего в том, что изображение было отредактировано, и данные стерлись. Вспомните, не пересылали ли вы эту картинку через какой-нибудь мессенджер или соц.сеть, как фото. Либо, возможно, вы открывали ее в каком-то редакторе и случайно изменили.

Так же можете попробовать использовать другой браузер.


Вопрос: Можно ли "прочитать" полученную картинку в других сервисах?

Ответ: Если сервис позволяет реализовать тот же алгоритм, использовать такой же тег и идентичный формат записи (или просто выводить данные без учета форматов), то это возможно. В ином случае это не получится.


Вопрос: Можно ли здесь "прочитать" картинку из других сервисов по стеганографии?

Ответ:Здесь используется собственный тэг и формат записи. Если в другом месте вы сможете воспроизвести этот формат - тогда получится. Изображения, маркированные иным тегом или сделанные по иному алгоритму, прочитать не выйдет.


Вопрос: Можно ли записать несколько независимых текстов в одну картинку?

Ответ: Можно. Данные записываются в пиксели построчно слева-направо, начиная с верхнего левого угла картинки. Таким образом, если сохраняемый текст умещается в одну строку и не доходит до края, вы можете повернуть картинку другим боком и записать туда еще что-нибудь.

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


Вопрос: Сколько информации можно скрыть в картинке?

Ответ: Зависит от размера картинки. Формула, по которой рассчитываются свободные байты такая:

((высота*ширина - прозрачные_пиксели) * 3 / 8) - 11

К счастью, скрипт считает все за вас, так что после загрузки картинки вы увидите результат. Но чисто для примера возьмем упрощенную формулу. Предположим, что прозрачных пикселей нет, заголовок не учитываем. Тогда формула: высота*ширина*3 / 8.

Если у нас картинка размером 1000*1000 пикселей, получается 1000*1000*3/8 = 3000000/8 = 375000 байт.

1 символ не всегда занимает 1 байт. Но латиница занимает 1 байт, поэтому если вы пишете только латинскими буквами, то количество байт = количество букв. Кириллицу можете считать за 2 байта, а всякие спец-символы и эмодзи будут занимать еще больше (3-4 байта). Так можете прикинуть.


Вопрос: Почему текст измеряется в байтах, а не в символах?

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


Вопрос: Где происходит весь процесс? Мои данные отправляются на сервер? Кто-то вообще может увидеть, что я тут делаю?

Ответ: Весь процесс происходит у вас в браузере, никаких трекеров и прочих отслеживающих механизмов здесь нет, ваши данные никто не видит. Можете сохранить эту страницу на устройстве и работать с ней оффлайн.


Если у вас есть еще какие-то вопросы, предложения или может быть что-то не работает - можете писать вот сюда.


Вверх