
Стеганография на основе вращательного диапазонного кодирования (RRC) — эффективный и доказуемо безопасный лингвистический стеганографический метод, который встраивает секретные сообщения в тексты на естественном языке, генерируемые большими языковыми моделями.
Статья: Эффективная доказуемо безопасная лингвистическая стеганография с помощью диапазонного кодирования
| Шаг | Описание |
|---|---|
| Встраивание (Алгоритм 3) | Преобразует секретное сообщение в десятичное значение и итеративно вращает его в сужающемся интервале, направляемом распределением вероятностей LM и смещением, генерируемым PRNG. Каждый шаг вращения порождает один токен. |
| Извлечение (Алгоритм 4) | Повторно запускает LM на стеготексте для восстановления границ интервала, затем выполняет обратное вращение к исходному десятичному значению и бинаризует его. |
Механизм вращения решает две проблемы стандартной стеганографии на основе диапазонного кодирования:
.
├── RRC_embed.py # Embedding (Algorithm 3)
├── RRC_extract.py # Extraction (Algorithm 4)
├── test_roundtrip.py # Self-contained end-to-end verification script
├── requirements.txt # Python dependencies
└── README.md
Установите зависимости:
pip install -r requirements.txt
Сквозной тест использует meta-llama/Llama-2-7b-hf и выполняется на CPU/CUDA:
python test_roundtrip.py
Ожидаемый вывод:
>>> Step 3: Verification
Original: 10110011001010111010011100101011...
Extracted: 10110011001010111010011100101011...
✅ SUCCESS — extracted message matches perfectly!
Подготовьте файл промптов 0.Prompts.tsv с колонками idx и text, затем выполните:
python RRC_embed.py \
--language_model meta-llama/Llama-3.1-8B \
--bit_length 128 \
--key 42 \
--top_k -1
python RRC_extract.py \
--language_model meta-llama/Llama-3.1-8B \
--bit_length 128 \
--key 42 \
--input_file 1.RC_decimal_Llama-3.1-8B_bit128.tsv
⚠️ Важно: для корректного извлечения отправитель и получатель должны использовать одну и ту же языковую модель, ключ, битовую длину и настройку top-k.
RRC_embed.pyRRC_extract.pyТип Decimal в Python использует усечённое деление для оператора %, что может возвращать отрицательные остатки (например, Decimal('-19672') % Decimal('65536') → -19672 вместо 45864). В данной реализации используется вспомогательная функция decimal_mod, которая гарантирует, что результат всегда находится в [0, m):
def decimal_mod(a, m):
return a - m * (a / m).to_integral_value(rounding=ROUND_FLOOR)
⚠️ Для надёжного извлечения секрета некоторые операции (sort, cumsum) переносятся на CPU с точностью float64, чтобы избежать недетерминизма CUDA. Это обменивает часть скорости на гарантированную согласованность кодирования и декодирования.
| Аргумент | По умолчанию | Описание |
|---|
--language_model | meta-llama/Llama-3.1-8B | Идентификатор модели HuggingFace |
--bit_length | 128 | Длина секретного сообщения в битах |
--top_k | -1 | Усечение Top-k; -1 = полный словарь |
--key | 42 | Симметричный ключ K (зерно PRNG) |
--part / --part_max | 0 / 2 | Для параллельного выполнения на больших наборах промптов |
| Аргумент | По умолчанию | Описание |
|---|
--language_model | meta-llama/Llama-3.1-8B | Должен совпадать с моделью встраивания |
--bit_length | 128 | Должен совпадать с настройкой встраивания |
--top_k | -1 | Должен совпадать с настройкой встраивания |
--key | 42 | Должен совпадать с ключом встраивания |
--input_file | (обязательный) | Путь к TSV-файлу, полученному от кодера |