
Esteganografía lingüística demostrablemente segura que incrusta mensajes secretos en texto generado por LLM mediante codificación de rango rotativa. Incluye scripts de incrustación, extracción y verificación de ida y vuelta.
Esteganografía por Codificación de Rango Rotacional (RRC) — un método esteganográfico lingüístico eficiente y demostrablemente seguro que incrusta mensajes secretos en texto en lenguaje natural generado por modelos de lenguaje de gran tamaño.
Artículo: Efficient Provably Secure Linguistic Steganography via Range Coding
| Paso | Descripción |
|---|---|
| Incrustar (Algoritmo 3) | Convertir el mensaje secreto a un valor decimal y rotarlo iterativamente dentro de un intervalo decreciente guiado por la distribución de probabilidad del LM y un desplazamiento generado por PRNG. Cada paso de rotación produce un token. |
| Extraer (Algoritmo 4) | Volver a ejecutar el LM sobre el estegotexto para recuperar los límites del intervalo y luego invertir la rotación hasta el valor decimal original y binarizarlo. |
El mecanismo de rotación resuelve dos problemas de la esteganografía por codificación de rango básica:
.
├── 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
Instalar dependencias:
pip install -r requirements.txt
La prueba de ida y vuelta utiliza meta-llama/Llama-2-7b-hf y se ejecuta en CPU/CUDA:
python test_roundtrip.py
Salida esperada:
>>> Step 3: Verification
Original: 10110011001010111010011100101011...
Extracted: 10110011001010111010011100101011...
✅ SUCCESS — extracted message matches perfectly!
Prepare un archivo de prompts 0.Prompts.tsv con las columnas idx y text y luego ejecute:
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
⚠️ Importante: El emisor y el receptor deben usar el mismo modelo de lenguaje, clave, longitud de bits y configuración top-k para una extracción correcta.
RRC_embed.pyRRC_extract.pyEl tipo Decimal de Python usa división truncada para el operador %, que puede devolver restos negativos (p. ej., Decimal('-19672') % Decimal('65536') → -19672 en lugar de 45864). Esta implementación utiliza un helper decimal_mod que garantiza que el resultado esté siempre en [0, m):
def decimal_mod(a, m):
return a - m * (a / m).to_integral_value(rounding=ROUND_FLOOR)
⚠️ Para una extracción fiable del secreto, algunas operaciones (sort, cumsum) se descargan a la CPU con precisión float64 para evitar el no determinismo de CUDA. Esto intercambia una cantidad de velocidad por una consistencia garantizada de codificación-decodificación.
| Argumento | Predeterminado | Descripción |
|---|
--language_model | meta-llama/Llama-3.1-8B | Identificador de modelo HuggingFace |
--bit_length | 128 | Longitud del mensaje secreto en bits |
--top_k | -1 | Truncamiento top-k; -1 = vocabulario completo |
--key | 42 | Clave simétrica K (semilla PRNG) |
--part / --part_max | 0 / 2 | Para ejecución paralela en conjuntos grandes de prompts |
| Argumento | Predeterminado | Descripción |
|---|
--language_model | meta-llama/Llama-3.1-8B | Debe coincidir con el modelo de incrustación |
--bit_length | 128 | Debe coincidir con la configuración de incrustación |
--top_k | -1 | Debe coincidir con la configuración de incrustación |
--key | 42 | Debe coincidir con la clave de incrustación |
--input_file | (requerido) | Ruta al TSV del codificador |