{"slug": "show-hn-steganeur-hide-secret-messages-in-llm-generated-text-rust", "title": "Show HN: Steganeur – Hide secret messages in LLM-generated text (Rust)", "summary": "A new open-source Rust project called Steganeur hides secret messages inside LLM-generated text by encoding them into token choices, producing cover text that is statistically identical to normal generation. The tool, dual-licensed MIT/Apache-2.0, targets llama.cpp and requires the server to return top_logprobs with token id fields; three of its four methods require CPU due to GPU logprob drift, while the block method works on any server.", "body_md": "Hi HN! I made a project that I found really fun and I'm proud of the idea and implementation. This first came up when speaking to a friend, we were talking around how to do steganography in natural text, and realized an LLM's token choices are a natural channel.\n\nSteganeur accomplishes this by encoding a secret message into the token choices of a language model, producing cover text that reads like a normal sentence. A recipient recovers the message using only the cover text and the model. With the rejection method, the output is statistically identical to normal generation, not just something that looks similar.\n\nThe interesting problem I hit: steganeur reads the model's logprobs directly, and three of the four methods need them to come out exactly the same on encode and decode. On GPU reductions are non-deterministic, so the logprobs drift between runs, which is enough to corrupt the bits. Only one method (block) survives on GPU, because it bins tokens by their id rather than by probability. So block works on any server, the other three need CPU.\n\nWritten in Rust, dual-licensed MIT/Apache-2.0, targets llama.cpp (the server must return top_logprobs with token id fields)\n\nComments URL: [https://news.ycombinator.com/item?id=49390543](https://news.ycombinator.com/item?id=49390543)\n\nPoints: 1\n\n# Comments: 0", "url": "https://wpnews.pro/news/show-hn-steganeur-hide-secret-messages-in-llm-generated-text-rust", "canonical_source": "https://github.com/marcsnid/steganeur", "published_at": "2026-08-21 16:33:37+00:00", "updated_at": "2026-08-21 16:44:34.304778+00:00", "lang": "en", "topics": ["large-language-models", "ai-tools", "ai-research"], "entities": ["Steganeur", "Rust", "llama.cpp"], "alternates": {"html": "https://wpnews.pro/news/show-hn-steganeur-hide-secret-messages-in-llm-generated-text-rust", "markdown": "https://wpnews.pro/news/show-hn-steganeur-hide-secret-messages-in-llm-generated-text-rust.md", "text": "https://wpnews.pro/news/show-hn-steganeur-hide-secret-messages-in-llm-generated-text-rust.txt", "jsonld": "https://wpnews.pro/news/show-hn-steganeur-hide-secret-messages-in-llm-generated-text-rust.jsonld"}}