Прячем текст в Bitmap
Доброго времени суток, уважаемый хабрачеловек. На хабре уже проскакивали мысли о том, как спрятать текст в bitmap-изображении. К сожалению, топиков на эту тему я не нашел и решил восполнить данный пробел. Под катом Вы найдете способ сокрытия текста в bitmap’е, а также реализацию на C#.
Постановка задачи
Спрятать произвольный текст в кодировке windows-1251 в 24-разрядный bitmap рисунок и излвечь его обратно без искажений.
Структура bmp-файла
- Заголовок файла
- Заголовок изображения (может отсутствовать)
- Палитра (может отсутствовать)
- Само изображение

Идея алгоритма сокрытия текста
Наверное, Вы уже догадались в чем идея. Дело все в том, что глаз среднестатистического человека (не профессионального художника или фотографа) различает намного меньше цветов, чем было указано выше. Ни в одной книге нет четкого ответа на вопрос, сколько все же цветов различает глаз, но самая большая цифра, которую я встретил — 10 млн. Отсюда следует, что несколько младших битов из восьми, отводимых на каждую компоненту цвета, можно позаимствовать для наших корыстных целей.
Немного цифр: для примера возьмем и нагло отнимем у RGB компонент по два младщих бита. То есть из 24 бит у нас останется 18, которыми можно закодировать ровно 262144 цветов. Теперь возьмем текст в кодировке windows-1251, в которой каждый символ представляется 8ю битами. Путем несложных математический вычислений получаем, что 3 символа можно сохранить в 4 пикселах. Таким образом, в картинке 1024×768, где 786432 пикселов можно сохранить 589824 символа. Неплохо, да? Для наглядности приведу две картинки. На первой исходное изображение, а на второй изображение, у которого младшие два бита каждой компоненты цвета заполнены текстом. Сразу оговорюсь, что изображения сконвертированы в png, чтобы пожалеть траффик.
Исходное изображение:

Изображение, содержащее текст

Если приглядется, то на втором изображении цвета кажутся тусклее. Да, это так. Но мы то с Вами знаем, что в представленном изображении что-то не так, а если бы не знали, то и не догадались бы, что в нем спрятан какой-то текст. Кстати, в изображении спрятана фраза «Hello World. =)» размноженная 100 раз.
Вот и все. Как Вы видите, идея предельно проста. Кстати говоря, представленный метод называется LSB (спасибо frol за подсказку). Напоследок, можете посмотреть реализацию на языке C#.
Реализация на C#
Представленная реализация не претендует на награду в стиле «Совершенный код», она лишь демонстрирует описанный алгоритм на практике. В данном случае я гнался не за красотой кода, а за наглядностью. Здесь Вы можете скачать архив и сходниками (~20 кб)
Как поместить невидимый скрытый текст в картинку
Порой бывает необходимо передать по сети секретное сообщение, скрытое для посторонних глаз. Нет, даже не так. Надо передать файл, который внешне будет ничем не примечателен, но внутри себя содержать зашифрованный текст, доступ к расшифровке которого будет только у целевого получателя.
Например, вы послали через интернет человеку фотографию котика, которая для всех выглядит как обычная картинка. Но если загрузить это фото в специальный сервис для расшифровки, то становится видим скрытый секретный текст.
Для этого рекомендую использовать бесплатный онлайн сервис Steganography Tools, который использует методы стеганографии для скрытия секретной информации в файлах изображений или аудио. Как им пользоваться – сейчас подробно расскажу.
- Как скрыть текст в картинке
- Как расшифровать невидимый текст
- Итог
Как скрыть текст в картинке
Чтобы поместить невидимый текст в картинку или аудио файл, нажимаем ссылку «Encode an image» на главной странице сервиса и проделываем следующее:
- Загрузите файл, кликнув по соответствующей кнопке.
- Укажите пароль для расшифровки при желании. Пароль нужен в том случае, если вы хотите, чтобы для доступа к скрытому тексту недостаточно было бы просто открыть файл в данном сервисе, но нужно было бы еще и знать пароль. Как вы понимаете, наличие пароля значительно повышает надежность и секретность передаваемой информации.
- В большом поле «Text» введите секретный текст. Кириллица не поддерживается, поэтому используйте для набора латиницу.
- Вместо текста вы можете закодировать в изображении не только текст, но и целый файл любого типа! Для этого сделайте активной режим «File payload» и укажите нужный файл.
- Нажмите кнопку «Отправить».
- Скачайте полученный файл.

Изображение со скрытым текстом никак не отличается от обычного: ни при просмотре EXIF-информации, ни при открытии исходного не видно абсолютно ничего подозрительного. Полная секретность 🙂
Как расшифровать невидимый текст
Итак, вы получили изображение, в котором как вы знаете, находится скрытое послание. Как его прочитать? Для этого нажмите ссылку «Decode an image» на главной странице сервиса.

Далее делаем следующие шаги:
- Загружаем файл
- Указываем пароль для расшифровки (если он был ранее установлен)
- Нажимаем кнопку «Отправить»

Автоматически браузер откроет новое окошко, в котором вы сможете прочитать скрытое сообщение.

Итог
Если вы хотите через интернет отправить кому-либо секретное сообщение и не привлекать лишнего внимания, то лучше всего будет зашифровать его в картинке или звуковом файле. При обычном просмотре такие файлы ничем не отличаются от обычных, но внутри себя содержат то, что станет доступно только тому, кому это предназначено.
- 7 лучших альтернатив Booking.com для онлайн бронирования жилья
- Сервис проверки фолловеров в твиттер
- Создай свой плэйкаст на Playcast
- DaTravel — онлайн-гипермаркет путешествий
- FL.RU — биржа фриланса №1 в рунете
Понравилось? Поделитесь с друзьями!
Сергей Сандаков, 43 года. С 2011 г. пишу обзоры полезных онлайн сервисов и сайтов, программ для ПК. Интересуюсь всем, что происходит в Интернет, и с удовольствием рассказываю об этом своим читателям.
Как зашифровать слово в картинке с помощью нейросети. Сервис Glif превращает котиков в буквы

Сервис Glif с помощью нейросети вписывает в изображение текст. Интернет-пользователи генерируют картинки с котами, электроникой, енотами и живописными пейзажами с тайными посланиями.
Пользователи Сети тестируют сервис Glif, который с помощью нейросети зашифровывает послания в картину. Искусственный интеллект генерирует изображение по описанию так, чтобы текст вписался естественным образом — с помощью теней и различных деталей. Попробовать создать свою картинку можно по ссылке.
Как сделать картинку с помощью Glif? Нужно зайти на сайт, выбрать функцию Controlnet Any Word и заполнить три поля. В первом на английском языке необходимо составить простое описание будущего изображения. Во втором поле вписать фразу или слово на любом языке заглавными буквами. В третьем надо выбрать размер букв, сервис предлагает от 100 до 170. Самый оптимальный вариант — 130.

В редакции Medialeaks решили изобразить набедокуривших белых и рыжих котиков с надписью «У нас лапки». Если не знать, что на картинке должна быть надпись, то её можно и не заметить. Чтобы разглядеть слова как следует, можно прищуриться или отвести экран подальше от глаз.

Пользователи Сети делятся картинками, которые создали с помощью Glif. Кто-то сделал постер с надписью Dream («Мечта»).

На просторах соцсетей можно найти и менее романтичные примеры, например, с надписью «Хочу пиво».

Нейросеть делает открытки с именами.

Кажется, нейросети не всегда удаётся вписать слова полностью. Один из пользователей сайта хотел сделать картинку с надписью «Как же хочется отчислиться», однако последнее слово не считывается.

В таком случае можно поменять формат изображения и уменьшить шрифт.
Ранее Medialeaks рассказывал, как сейчас выглядят актёры из сериала «Сабрина — маленькая ведьма». Каст собрался вместе спустя 20 лет.
Есть ли адекватный способ расшифровать текст, зашифрованный в картинку?
Так как я использовал замену только красного оттенка, а не популярный метод LSB, измененная картинка имеет характерные «пятна», так как не у всех пикселей красный оттенок является главным, а замена сильно изменяет цвет.
Проблема:
Изображение с зашифрованным текстом есть, а вот файла с ключами-координатами измененных пикселей нет. Однако рядом лежало также оригинальное изображение. Попиксельно сверив эти картинки, я получил все измененные пиксели. А далее проблема — этих пикселей ~ 500 штук и для расшифровки текста нужно выставить их в правильном порядке — иначе в cryptography просто не подойдет ключ для расшифровки
Очевидная идея решения:
Подставим в формулу размещения без повторений значения:

Где нижнее 500 — число пикселей, а верхнее 500 — это длина одного размещения. По формуле получаем, что есть вот столько возможных комбинаций зашифрованных символов, из которых только одна будет верной и расшифруется в текст.
Думаю, очевидно, что ни один комп мне такой перебор не обработает.
А есть ли другой способ узнать, какая комбинация верна? «Случайность» выбора пикселя была реализована через встроенную функцию random.randint . Может быть есть какой-то способ узнать ключ генератора и воспроизвести этот случайный выбор? (Возможно написал бред, к сожалению, не до конца разобрался в этой теме)