Недавно я наткнулся на статью https://habr.com/ru/articles/861932/
И так она меня зацепила, что в голове у меня на протяжении пары недель не утихали эксперименты.
- А если сделать так?
- А если спрятать картинку в картинку?
- А можно ли это сделать чисто на языке 1с?
Думал, голова лопнет, да и сон потерял…
В итоге представляю вам прототип, который кое-что умеет.
- Почему прототип?
Потому, что он пока сделан на скорую руку и имеет ряд ограничений. За код стыдно, но торопился создать новогодний квест по случаю юбилейной пятидесятой статьи и без этого инструмента не вышло бы.
Ограничения:
1 Ширина картинки должна быть кратна 4. То есть 4, 8, 12, 16 и т.д.
2 Пока работает с png, глубина цвета которого 24. 32 содержит альфа-канал, отвечающий либо за прозрачность, либо заполняется нулями, и с ним пока решил не разбираться. Важно было просто запустить то, что в голове накопилось.
Код по созданию картинки png подсмотрел тут //infostart.ru/1c/articles/1061803/ автору огромное спасибо!
Конвертировать в глубину 24 можно так:
Принцип работы:
Все в нашей жизни нули и единицы. Абсолютно все. А что же такое png?
Это изображение, каждый пиксел которого хранит три цвета. Красный(R), Зеленый(G) и Синий(B).
Цвет — это цифра от 0 до 255, а каждая цифра хранится в двоичной системе в виде нулей и единиц.
Например: Синий= 255, Зеленый = 0, Красный = 0 это ничто иное как синий цвет, но пиксел будет содержать в себе:
11111111 00000000 00000000
В статье https://habr.com/ru/articles/861932/ автор предложил прятать секреты в последний байт каждого цвета.
Если мы меняем последний байт, то картинка мало меняется для нашего восприятия, да и не всегда нужно его менять.
11111110 00000001 00000001
- Сильно цвет отличается от предыдущего?
Я вообще не могу отличить...
Каждая буква тоже, также как и цвет, может быть переведена в нули и единицы.
Таблица декодирования:
https://www.ascii-code.com/CP1251
Обратите внимание, что с 0 по 31 идут служебные символы.
Получается, чтобы спрятать одну букву, нам нужно около трех пикселей.
Давайте рассмотрим примеры:
С новым годом!
Желаю счастья в личной жизни!
Сбычу мечт!
Чтоб ты... жил на одну зарплату!
11010001001000001110110111101110111000101111101111101100
00100000111000111110111011100100111011101110110000100001
00001010110001101110010111101011111000001111111000100000
11110001111101111110000011110001111100101111110011111111
00100000111000100010000011101011111010001111011111101101
11101110111010010010000011100110111010001110011111101101
11101000001000010000101011010001111000011111101111110111
11110010111100110010000011101100111001011111011111110010
00100001000010100000101011010111111100101110111011100001
00100000111100101111101100101110001011100010111000100000
11100110111010001110101100100000111011011110000000100000
11101110111001001110110111110011001000001110011111100000
11110000111011111110101111100000111100101111001100100001
Вот так можно перевести текст в двоичную систему:
У нас есть открытка, в которую мы решили спрятать текст, но сохранив копию, не перетирая саму открытку. Легко.
Нажимаем спрятать текст в картинку:
Теперь посмотрим на результат:
На глаз не отличишь, но давайте попробуем прочитать.
Ссылка на скачивание: //infostart.ru/upload/iblock/adb/adb87ac03eca7edb18384ad4b3cd4749.png
Как вы видите, текст мы прячем влегкую.
Задавались ли вы вопросом, как выглядят стихи, если их оцифровать?
Если мы не будем прятать текст, а прямо сохраним буквы в цвета, тогда в один пиксел мы сможем спрятать три буквы. Давайте пошлем пиксел на три буквы. ;)
Я взял текст сказки о рыбаке и рыбке и создал картинку.
Бац, и png теперь у нас дискета…
Даже как-то неловко, что все уместилось вот в такую картинку:
Ссылка на скачивание: //infostart.ru/upload/iblock/a11/a110b53f542305cdf2fc6218425b85b1.png
А вот так текст из картинки можно прочитать:
Дальше я подумал, а если в картинку запихнуть сообщение и потом картинку с сообщением спрятать в картинку.
Тут есть тонкости, есть служебные символы, которые я использую, чтобы понимать, что текст окончен:
КонецТекста = "00000011";
Если читать картинку как двоичные данные, тогда можно зацепить служебные символы и не будет ясно, когда нужно завершать, а подавать еще и размер чтения, как-то не универсально.
В итоге я решил картинку конвертировать в JSON и этот JSON прятать в картинку как скрытый текст.
Соответственно нарисовал обратный процесс. Для этого на закладке Картинка надо указать файл, в который нужно сформировать картинку из JSON.
В итоге можно даже генерировать картинки…
По кнопке:
А дальше, я точно также поступил с файлами, но переводил их в JSON и сразу в двоичную кодировку.
Наигрался я в ходе экспериментов досыта. Прятал обработки, архивы, прятал файлы в картинки, затем их прятал в другие картинки… Можно туда спрятать, что угодно.
И вот тут во мне проснулся параноик.
- А все ли картинки в наших конфигурациях, базах, системах безопасны?
- Вы уверены, что да?
//infostart.ru/upload/iblock/966/966c0a9b1f9e47246a6b9e518c87e876.png
На этом статью завершаю.
Напоминаю, что это прототип, поэтому код страшен как смерть.
Этот инструмент понадобится, чтобы пройти новогодний квест.
Тот, кто первым в комментарии к статье //infostart.ru/1c/2269943/ выложит спрятанное секретное слово, получит от меня легендарную книжку «Слова Урала 18+».
Всем удачи!