旋转范围编码 (RRC) 隐写术 — 一种高效且可证明安全的语言隐写方法,通过大型语言模型生成的文本嵌入秘密消息。
论文: 通过范围编码实现高效可证明安全的语言隐写
| 步骤 | 描述 |
|---|---|
| 嵌入 (算法 3) | 将秘密消息转换为十进制值,并在语言模型概率分布和 PRNG 生成偏移量引导的收缩区间内迭代旋转该值。每次旋转产生一个 token。 |
| 提取 (算法 4) | 在隐写文本上重新运行语言模型以恢复区间边界,然后逆向旋转回原始十进制值并二值化。 |
旋转机制解决了标准范围编码隐写术的两个问题:
.
├── RRC_embed.py # 嵌入 (算法 3)
├── RRC_extract.py # 提取 (算法 4)
├── test_roundtrip.py # 自包含端到端验证脚本
├── requirements.txt # Python 依赖
└── 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.pyPython 的 Decimal 类型使用截断除法进行 % 运算,可能返回负数余数(例如 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)
⚠️ 为了确保可靠提取秘密消息,某些操作(排序、累加和)会卸载到 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 文件路径 |