Тут в соседнем чатике переслали пост какого-то чела, который сделал сокрытие сообщений в тексте посредством омоглифов - символов из разных языков с одинаковым написанием (типа "о" кириллицей и "o" латиницей). При этом он зачем-то использовал нейросети.
Мы, конечно, дружно посмеялись над его наивностью, но начали обсуждать применение LLM для сокрытия сообщений в тесте с помощью манипуляции смыслом, и выяснили, что всё уже придумано до нас. Метод называется "семантическая стеганография", и даже статья есть на эту тему.
Я проверил, работает: даже маленькие локальные модели успешно кодируют и декодируют скрытое сообщения в/из текста. Причём, текст можно перефразировать, налить воды и пару раз перевести на другой язык - кодировка не ломается.
Метод из статьи довольно замороченный, по этому я сделал свои, максимально простые правила кодирования. Вот промпт:
Преобразуй число в нейтральный бытовой текст по следующим правилам.
Одна цифра кодируется одним предложением.
Используй таблицу:
0 = погода
1 = еда
2 = дорога / транспорт
3 = работа / дело
4 = встреча / разговор
5 = дом / быт
6 = покупка
7 = воспоминание
8 = план / намерение
9 = ожидание
Требования:
- в каждом предложении должен быть один доминирующий сценарий;
- предложения должны звучать естественно;
- текст должен выглядеть как обычная нейтральная заметка;
- не упоминай шифр, цифры, таблицу и скрытое сообщение;
- добавь в начале фразу: "Наконец появилось время спокойно написать.";
- добавь в конце фразу: "В остальном ничего особенного не произошло.";
- между этими двумя фразами размести только кодирующие предложения;
- количество кодирующих предложений должно точно совпадать с количеством цифр.
А вот сообщение, в котором зашифрован мой номер телефона:
Наконец появилось время спокойно написать. Решил на следующей неделе немного перестроить привычный ритм и раньше браться за важные дела. В кафе было много народа, по этому пришлось долго ждать свой заказ. По пути домой зашел в магазин и выбрал себе удобную мелочь, которая давно была нужна. Дома навел порядок на столе и наконец разобрался с вещами, которые давно лежали без места. На обед сделал себе кое что простое и горячее, и этого оказалось вполне достаточно. Неожиданно вспомнил один спокойный вечер из прошлого, и настроение сразу улучшилось. Чуть позже встретился со знакомым и мы хорошо поболтали обо всем понемногу. К вечеру поднялся ветер, и на улице сразу стало заметно прохладнее. Ночью воздух был сырым и свежим, будто дождь был совсем рядом. Ах да, вечером купил в соседнем магазине то, что все время откладывал на потом. С утра снова было пасмурно, и свет в окне держался каким-то рассеянным до самого дня. В остальном ничего особенного не произошло.
Способ простой, но очень расточительный - ёмкость текста примерно 3.5 бита на предложение. Метод из статьи даёт в восемь раз больше - 28.5 бит на предложение.
В общем, тема интересная, познавательная и с большим потенциалом для копания вглубь.
Мы, конечно, дружно посмеялись над его наивностью, но начали обсуждать применение LLM для сокрытия сообщений в тесте с помощью манипуляции смыслом, и выяснили, что всё уже придумано до нас. Метод называется "семантическая стеганография", и даже статья есть на эту тему.
Я проверил, работает: даже маленькие локальные модели успешно кодируют и декодируют скрытое сообщения в/из текста. Причём, текст можно перефразировать, налить воды и пару раз перевести на другой язык - кодировка не ломается.
Метод из статьи довольно замороченный, по этому я сделал свои, максимально простые правила кодирования. Вот промпт:
Преобразуй число в нейтральный бытовой текст по следующим правилам.
Одна цифра кодируется одним предложением.
Используй таблицу:
0 = погода
1 = еда
2 = дорога / транспорт
3 = работа / дело
4 = встреча / разговор
5 = дом / быт
6 = покупка
7 = воспоминание
8 = план / намерение
9 = ожидание
Требования:
- в каждом предложении должен быть один доминирующий сценарий;
- предложения должны звучать естественно;
- текст должен выглядеть как обычная нейтральная заметка;
- не упоминай шифр, цифры, таблицу и скрытое сообщение;
- добавь в начале фразу: "Наконец появилось время спокойно написать.";
- добавь в конце фразу: "В остальном ничего особенного не произошло.";
- между этими двумя фразами размести только кодирующие предложения;
- количество кодирующих предложений должно точно совпадать с количеством цифр.
А вот сообщение, в котором зашифрован мой номер телефона:
Наконец появилось время спокойно написать. Решил на следующей неделе немного перестроить привычный ритм и раньше браться за важные дела. В кафе было много народа, по этому пришлось долго ждать свой заказ. По пути домой зашел в магазин и выбрал себе удобную мелочь, которая давно была нужна. Дома навел порядок на столе и наконец разобрался с вещами, которые давно лежали без места. На обед сделал себе кое что простое и горячее, и этого оказалось вполне достаточно. Неожиданно вспомнил один спокойный вечер из прошлого, и настроение сразу улучшилось. Чуть позже встретился со знакомым и мы хорошо поболтали обо всем понемногу. К вечеру поднялся ветер, и на улице сразу стало заметно прохладнее. Ночью воздух был сырым и свежим, будто дождь был совсем рядом. Ах да, вечером купил в соседнем магазине то, что все время откладывал на потом. С утра снова было пасмурно, и свет в окне держался каким-то рассеянным до самого дня. В остальном ничего особенного не произошло.
Способ простой, но очень расточительный - ёмкость текста примерно 3.5 бита на предложение. Метод из статьи даёт в восемь раз больше - 28.5 бит на предложение.
В общем, тема интересная, познавательная и с большим потенциалом для копания вглубь.