
Встраивайте несколько секретных сообщений в выбор токенов чата LLM с помощью арифметических/Discop стеганографических кодеров, с побитово точным декодированием и оценкой стегоанализа.
Исследовательский код для лингвистической стеганографии в диалогах LLM-чатов, с однопотоковым базовым вариантом и пакетным многопотоковым (HiTMS) протоколом, который скрывает сразу несколько независимых секретных сообщений и использует пакетную обработку GPU для гораздо более высокой пропускной способности.
Модель Боба задаёт вопросы; модель Алисы отвечает, скрыто кодируя полезную нагрузку в свой выбор токенов с помощью стеганографического кодера; Боб повторно прогоняет модель на ответе Алисы, чтобы восстановить биты. Кодирование и декодирование побитово точны, поэтому секрет восстанавливается без потерь.
arithmetic*.py)discop*.py)single_stream.py): без накладных расходов на обрамление — каждый
бит канала является полезной нагрузкой (~100% утилизация).protocol.py): m секретных потоков
разбиваются на фрагменты по раундам, управляемое PRF отображение поток→слот, слоты-приманки, 16-битные
заголовки длины и заполняющий keystream. Несколько ответов за раунд генерируются за
один пакетный прямой проход, поэтому пропускная способность масштабируется с размером батча.Модели, использованные в экспериментах: meta-llama/Llama-3.2-3B-Instruct и
google/gemma-3-4b-it. Наборы данных: креативные/открытые подмножества
databricks/databricks-dolly-15k и HuggingFaceH4/no_robots.
data/ содержит результаты каждого эксперимента из статьи — ёмкость,
пропускную способность, утилизацию, оценки судьи и AUROC детекторов — в виде одного JSON-объекта
на прогон. Полную схему см. в data/README.md.
Сам сгенерированный стеготекст не включён: исходные логи содержат
вопрос и ответ для каждого фрагмента, из-за чего они занимают ~1 ГБ, поэтому
export_data.py удаляет эти поля и сохраняет все измерения (~24 МБ). Во всех
драйверах зафиксированы сиды, поэтому повторный запуск перебора воспроизводит текст точно.
Исходные выходные каталоги (
sweep_logs/,single_sweep_logs/,scaling_logs/,judge_logs/,cover_logs/,run_logs/,steganalysis_logs/) находятся в .gitignore — они большие (последний содержит обученные контрольные точки детекторов на несколько ГБ) и полностью воспроизводимы.
conda create -n ems python=3.10 -y && conda activate ems
pip install torch transformers datasets numpy
pip install openai # only needed for judge_quality.py
Для запуска LLM требуется GPU CUDA. Контрольные точки Llama и Gemma
ограничены доступом на Hugging Face Hub, поэтому перед первым использованием
выполните huggingface-cli login (после предоставления доступа к этим моделям).
Соберите пулы вопросов (один раз):
python build_question_pool.py # -> dolly15k_creative_questions.json
python build_norobots_pool.py # -> norobots_creative_questions.json
Одиночный подробный прогон (проверка корректности):
# multi-stream
CUDA_VISIBLE_DEVICES=0 python multi_round_demo.py
# single-stream
CUDA_VISIBLE_DEVICES=0 python single_stream_demo.py
# override model / coder / pool via env
ROUND_TRIP_MODEL=google/gemma-3-4b-it STEGO_ALGORITHM=discop \
STEGO_QUESTION_POOL=norobots_creative_questions.json \
CUDA_VISIBLE_DEVICES=0 python multi_round_demo.py
Полные эксперименты (с возобновлением — повторный запуск той же команды продолжит выполнение):
# multi-stream (8 streams x 1024 bits), all model/pool/coder combos, 500 trials
CUDA_VISIBLE_DEVICES=0 python run_sweep.py --trials 500
# single-stream baseline
CUDA_VISIBLE_DEVICES=0 python run_single_sweep.py --trials 500
# stream-count scaling (dolly + Llama + Discop)
CUDA_VISIBLE_DEVICES=0 python run_scaling_sweep.py --x-values 4 8 16 32 64
Оценка незаметности (требуется ключ OpenAI в OPENAI_API_KEY или
локальный файл OPENAI_API_key.txt, оба в .gitignore):
python judge_quality.py --dry-run # plan only, no API calls
python judge_quality.py --limit 2 # tiny live smoke test
python judge_quality.py # full run (resumable)
python judge_quality.py --aggregate-only # recompute the score table
Каждый драйвер фиксирует свои сиды (перемешивание запросов, выборка полезной нагрузки,
RNG выборки, torch.manual_seed) и потребляет запросы из детерминированного потока,
учитывающего номер прохода, поэтому полный перебор воспроизводим от начала до конца
и после прерывания возобновляется ровно с контрольной точки.
OPENAI_API_key.txt, *.key и .env игнорируются.| Path | Описание |
|---|
arithmetic.py, arithmetic_batch.py | Стего на арифметическом кодировании (одиночный + пакетный кодер/декодер потока). |
discop.py, discop_batch.py | Стего-кодер Discop + общий PRG (одиночный + пакетный). |
utils.py | Общие вспомогательные функции (преобразование бит/целых чисел, энтропия, top-k, проверки завершения предложений). |
protocol.py | Многопотоковый протокол HiTMS (отображение потоков, приманки, заголовки, заполнитель). |
single_stream.py | Однопотоковый протокол (без обрамления; обрезание на L-м бите). |
round_trip.py, batch_round_trip.py | Минимальные одноразовые демо/тесты round-trip. |
multi_round_demo.py | Запускатор многопотоковых прогонов (run_trial) + подробное демо одиночного прогона. |
single_stream_demo.py | Запускатор однопотоковых прогонов (run_single_trial) + демо. |
run_sweep.py | Многопотоковый перебор по {model}×{pool}×{coder}, с возобновлением. |
run_single_sweep.py | Однопотоковый аналог перебора. |
run_scaling_sweep.py | Перебор масштабирования по количеству потоков (x ∈ {1,2,4,8,16,32,64}) для любых модель/пул/кодер. |
run_x1_shards.py, run_x1_finish.sh, merge_x1_shards.py | Абляция x=1: разбиение одной ячейки на несколько GPU с последующим слиянием и проверками покрытия. |
judge_quality.py | Скорер незаметности LLM-в-роли-судьи (один QA на вызов, с возобновлением). |
gen_cover.py | Генерация «обложечного» текста (cover) без полезной нагрузки (эталон для стеганализа). |
steganalysis_bert.py | Детектор cover-vs-stego (BERT / RoBERTa / DeBERTa-v3 / ELECTRA). |
export_data.py | Создаёт публикуемое зеркало только со сводными данными в data/. |
build_question_pool.py, build_norobots_pool.py | Собирают пулы вопросов из наборов данных Hugging Face (HF). |
*_creative_questions.json | Готовые пулы вопросов. |
legacy/ | Более ранние скрипты/пулы, сохранены для справки. |