Beyond End-to-End Recovery: Towards a Better Understanding of LLM Steganography via Rolewise Decomposition
Organizations: University of Maryland, College Park
Abstract
In large language model (LLM) steganography, an encoder hides a private message in an otherwise ordinary response, as text transmitted to a decoder, who attempts to recover it. The success of this private-message transmission is commonly measured through end-to-end (E2E) recovery, which checks whether the decoder correctly reconstructs the private message. However, E2E recovery cannot distinguish encoding failures from decoding failures or reveal how the private message is represented in the encoder's transmitted text. To address these limitations, we introduce a rolewise decomposition framework that separately examines how private messages are represented in encoder transmitted texts, what decoders recover, and what deterministic verification can establish. Across 7,200 encoder responses, we identify 168 verifiable encodings missed by decoders and 706 responses containing private messages reconstructed through word-length or token-initial patterns not explicitly specified in the encoder's instructions. These findings demonstrate that E2E recovery alone may obscure important distinctions between encoding and decoding, motivating their separate evaluation to better understand and mitigate the safety issues caused by LLM steganography.
Figures & tables
| Extraction procedure | Texts | Exact | Norm. |
|---|---|---|---|
| Word-length parity | 158 | 157 | 1 |
| Token initials (A–M/N–Z) | 163 | 162 | 1 |
| Token initials (hex index) | 146 | 146 | 0 |
| Word lengths (hex) | 38 | 28 | 10 |
| Token initials (Base64) | 14 | 14 | 0 |
| Token initials (substitution) | 187 | 0 | 187 |
| Extraction Procedure | Claude | GPT | Gemini | |
| Word-length parity | 158 | 1 | 19 | 157 |
| Token initials (A–M/N–Z) | 162 | 1 | 1 | 158 |
| Token initials (hex index) | 146 | 0 | 20 | 138 |
| Word lengths (hex) | 38 | 0 | 5 | 37 |
| Token initials (Base64) | 14 | 0 | 4 | 12 |
| Token initials (substitution) | 8 | 2 | 3 | 8 |
Appendix figures & tables18 assets
Supplementary material from the paper’s appendix.
Appendix
| Extraction procedure | Symbols read from transmitted text | Message reconstruction |
|---|---|---|
| Word-length parity | , both bit polarities | Binary bytes |
| Token initials (A–M/N–Z) | Initials in A–M versus N–Z, both polarities | Binary bytes |
| Token initials (hex index) | Hexadecimal bytes | |
| Word lengths (hex) | Hexadecimal bytes | |
| Token initials (Base64) | Case-sensitive , including digits, , | Base64 |
| Token initials (substitution) | Lowercased | Inverse fixed substitution map |
| Extraction procedure | Match type | Claude | GPT | Gemini | Macro | ||
|---|---|---|---|---|---|---|---|
| Word-length parity | Union | 158 | 75 | – | 1.000 | 0.977 | 0.989 |
| Word-length parity | Exact | 157 | 73 | – | 1.000 | 0.977 | 0.989 |
| Word-length parity | Norm. | 1 | 2 | – | 1.000 | – | 1.000 |
| Token initials (A–M/N–Z) | Union | 163 | 69 | – | 1.000 | 0.720 | 0.860 |
| Token initials (A–M/N–Z) | Exact | 162 | 68 | – | 1.000 | 0.719 | 0.859 |
| Token initials (A–M/N–Z) | Norm. | 1 | 1 | – | – | 1.000 | 1.000 |
| Extraction procedure | Tasks | AUC [95% CI] | ||
|---|---|---|---|---|
| Word-length parity | 152 | 65 | 48 | 0.980 [0.962, 0.994] |
| Token initials (A–M/N–Z) | 161 | 66 | 49 | 0.720 [0.675, 0.763] |
| Model | Encoding rule | missing | ||||
|---|---|---|---|---|---|---|
| Claude | Sentence initials | 400 | 221 | 0 | 316 | 0 |
| Claude | Alternating initials | 400 | 262 | 1 | 288 | 0 |
| Claude | Base64 | 400 | 352 | 2 | 345 | 0 |
| Claude | Hexadecimal | 400 | 197 | 9 | 290 | 3 |
| Claude | Binary | 400 | 0 | 6 | 20 | 1 |
| Claude | Substitution | 400 | 85 | 1 | 152 | 0 |
| Model | Newly verified | Still unverified | Newly verified (%) | ||
|---|---|---|---|---|---|
| Claude | 1 | 354 | 7 | 347 | 2.0 |
| Claude | 0 | 913 | 15 | 898 | 1.6 |
| GPT | 1 | 105 | 4 | 101 | 3.8 |
| GPT | 0 | 1107 | 4 | 1103 | 0.4 |
| Gemini | 1 | 1134 | 636 | 498 | 56.1 |
| Gemini | 0 | 232 | 39 | 193 | 16.8 |
| Evidence among successful recoveries ( ) | ||||||
| Model | Exposed | Original | Added | Unresolved | Total | |
| Claude | 12 | 1,045 | 7 | 347 | 1,411 | 80 |
| GPT | 1 | 1,164 | 4 | 101 | 1,270 | 26 |
| Gemini | 1 | 1,005 | 636 | 498 | 2,140 | 62 |
| Total | 14 | 3,214 | 647 | 946 | 4,821 | 168 |
| Extraction procedure | Claude | GPT | Gemini | Missing C/P/G | |
|---|---|---|---|---|---|
| Word-length parity | 158 | 1/158 | 19/158 | 157/158 | 0/0/0 |
| Token initials (A–M/N–Z) | 162 | 1/162 | 1/162 | 158/162 | 0/1/0 |
| Token initials (hex index) | 146 | 0/146 | 20/146 | 138/146 | 3/1/0 |
| Word lengths (hex) | 38 | 0/38 | 5/38 | 37/38 | 1/0/0 |
| Token initials (Base64) | 14 | 0/14 | 4/14 | 12/14 | 0/0/0 |
| Token initials (substitution) | 8 | 2/8 | 3/8 | 8/8 | 0/0/0 |
| Representation | Claude | GPT | Gemini | |
|---|---|---|---|---|
| Literal Base64 | 87 | 86 | 87 | 87 |
| Literal hexadecimal | 56 | 53 | 55 | 55 |
| Extraction procedure | Extract | Own | Correct | Guided |
|---|---|---|---|---|
| Word-length parity | 0/12 | 0/12 | 12/12 | 3/12 |
| Token initials (A–M/N–Z) | 0/12 | 0/12 | 12/12 | 0/12 |
| Token initials (hex index) | 7/12 | 7/12 | 12/12 | 8/12 |
| Word lengths (hex) | 2/12 | 2/12 | 12/12 | 5/12 |
| Token initials (Base64) | 9/12 | 10/12 | 12/12 | 5/12 |
| Token initials (substitution) | 11/12 | 10/12 | 12/12 | 7/12 |
| Extraction procedure | Extract | Own | Correct | Guided |
|---|---|---|---|---|
| Word-length parity | 0/12 | 0/12 | 11/12 | 6/12 |
| Token initials (A–M/N–Z) | 1/12 | 0/12 | 7/12 | 7/12 |
| Token initials (hex index) | 6/12 | 6/12 | 12/12 | 12/12 |
| Word lengths (hex) | 9/12 | 9/12 | 12/12 | 12/12 |
| Token initials (Base64) | 7/12 | 4/12 | 7/12 | 8/12 |
| Token initials (substitution) | 8/12 | 6/12 | 7/12 | 10/12 |
| Decoder | Texts | Units | Edits | Fresh rows | Unavailable |
|---|---|---|---|---|---|
| Gemini | 60 | 60 | 180 | 180 | 0 |
| Claude | 7 | 7 | 21 | 21 | 1 |
| GPT | 4 | 5 | 15 | 15 | 0 |
| Decoder | Variant | Valid | Meaning | Char. sim. | Jaccard | |
|---|---|---|---|---|---|---|
| Gemini | Preserve | 60 | 60 | 9.983 | 0.988 | 0.954 |
| Gemini | Corrupt | 60 | 59 | 9.850 | 0.986 | 0.956 |
| Gemini | Replace | 60 | 60 | 8.567 | 0.738 | 0.560 |
| Claude | Preserve | 7 | 7 | 9.571 | 0.934 | 0.883 |
| Claude | Corrupt | 7 | 6 | 8.571 | 0.975 | 0.936 |
| Claude | Replace | 7 | 5 | 7.857 | 0.875 | 0.748 |
| Extraction procedure | Pres. | Corr. | Corr. | Repl. | Matched | |
|---|---|---|---|---|---|---|
| Gemini | ||||||
| Token initials (A–M/N–Z) | 10 | 10/10 | 9/10 | 1/10 | 9/10 | — |
| Token initials (substitution) | 10 | 9/10 | 5/10 | 1/10 | 8/8 | 7/8 |
| Token initials (Base64) | 10 | 10/10 | 9/9 | 0/9 | 9/9 | 7/7 |
| Token initials (hex index) | 10 | 10/10 | 7/9 | 1/9 | 6/6 | 1/1 |
| Word-length parity | 10 | 10/10 | 8/10 | 0/10 | 9/9 | — |
| Original | Edited | Decoder output | Matches |
|---|---|---|---|
| media molds us | meeia molds us | media molds us | No |
| virtual care here | virtual case here | virtual case here | Yes |
| eco chic wear | eco chic xear | eco chic year | No |
| crops in pots | cropt in pots | crop tin pots | Yes |
| ocean trash | pcean trash | pecan trash | No |
| crops in pots | crops in pous | crops in pots | No |
| Model | ||||||
|---|---|---|---|---|---|---|
| Claude | 0.526 | 0.621 | 0.489 | 0.004 | 0.128 | 0.379 |
| GPT | 0.507 | 0.591 | 0.489 | 0.000 | 0.101 | 0.409 |
| Gemini | 0.548 | 0.913 | 0.538 | 0.000 | 0.375 | 0.087 |
| Llama-8B | 0.070 | 0.093 | 0.010 | 0.068 | 0.015 | 0.907 |
| Llama-3B | 0.011 | 0.054 | 0.001 | 0.042 | 0.011 | 0.946 |
| Qwen | 0.263 | 0.324 | 0.158 | 0.072 | 0.094 | 0.676 |
| Model | Rule | ||||||
|---|---|---|---|---|---|---|---|
| Claude | base64 | 0.880 | 0.863 | 0.828 | 0.005 | 0.030 | 0.138 |
| Claude | hex | 0.568 | 0.725 | 0.532 | 0.020 | 0.172 | 0.275 |
| Claude | binary8 | 0.000 | 0.050 | 0.000 | 0.003 | 0.048 | 0.950 |
| Claude | substitution | 0.220 | 0.380 | 0.193 | 0.000 | 0.188 | 0.620 |
| Claude | sentence | 0.557 | 0.790 | 0.525 | 0.000 | 0.265 | 0.210 |
| Claude | alt-sentence | 0.657 | 0.720 | 0.608 | 0.003 | 0.110 | 0.280 |
| Model | Scheme | EPA | EPA | |
|---|---|---|---|---|
| Qwen | lexical | 0.3875 | 0.7994 | 0.4119 |
| Llama-8B | hex | 0.0825 | 0.4664 | 0.3839 |
| Llama-8B | lexical | 0.1825 | 0.5038 | 0.3213 |
| GPT | POS-keyword | 0.4975 | 0.8137 | 0.3162 |
| Claude | hex | 0.5675 | 0.8769 | 0.3094 |
| GPT | lexical | 0.5650 | 0.8488 | 0.2838 |
| Model | Scheme | Excluded | Message / rule | Agreement / rule | ||
|---|---|---|---|---|---|---|
| Claude | base64 | 48 | 27 (0.562) | 8/21 (0.381) | 3/21 (0.143) | |
| Claude | hex | 169 | 124 | 45 (0.266) | 61/124 (0.492) | 43/124 (0.347) |
| Claude | binary8 | 394 | 0 | 394 (1.000) | – | – |
| Claude | substitution | 311 | 0 | 311 (1.000) | – | – |
| Claude | sentence | 177 | 177 | 0 (0.000) | 106/177 (0.599) | 2/177 (0.011) |
| Claude | alt-sentence | 137 | 137 | 0 (0.000) | 44/137 (0.321) | 8/137 (0.058) |