본문으로 건너뛰기

LLM 텍스트에 숨은 메시지를 심는 Steganeur

Steganeur는 LLM의 토큰 선택에 메시지를 삽입하고 같은 모델로 cover text에서 이를 복원하는 Rust 도구입니다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

Steganeur는 같은 언어 모델을 공유하는 두 사용자가 일반 문장처럼 보이는 cover text만으로 비밀 메시지를 교환하도록 만든 Rust 기반 Neural Linguistic Steganography 구현입니다. rejection, arithmetic, huffman, block 네 방식이 토큰 확률 분포나 token ID hash를 이용해 메시지 비트를 토큰 선택에 매핑하며, CPU에서는 rejection이 가장 자연스럽고 arithmetic이 높은 용량을 제공합니다. GPU의 cuBLAS 비결정성으로 로그확률이 0.05에서 0.30만큼 흔들릴 수 있어 세 방식은 깨질 수 있지만 block은 hash bin을 사용해 안정적으로 작동합니다. temperature 1.0에서는 토큰당 0.5~2비트, 2.0에서는 2~6비트, 3.0 이상에서는 6~8비트를 담을 수 있고 Reed-Solomon ECC로 일부 바이트 오류를 복구할 수 있습니다.

섹션별 상세

01
Steganeur는 비밀 메시지를 언어 모델의 토큰 선택에 삽입해 일반 문장처럼 읽히는 cover text를 만드는 Rust 구현입니다. 송신자는 비밀 메시지와 문맥을 입력하고, 수신자는 같은 모델·온도·샘플링 설정으로 cover text만 다시 처리해 메시지를 복원합니다. 토큰 파일이나 별도 side channel 없이 텍스트 자체가 통신 채널이 된다는 점이 이 도구의 핵심 구조입니다.
bash
echo "Meet me at noon" \
| steganeur encode \
--method rejection --rejection-bits 2 --seed 42 \
--temperature 1.0 --top-k 300 \
--context "The old lighthouse stood at the edge of the cliff, its beam sweeping across the dark waters each night." \
--llama-url "http://127.0.0.1:11434" \
--model "Qwen3.6-27B-GGUF" \
--vocab-size 152064 --eos-token 151643

지정한 문맥과 LLM 설정을 사용해 비밀 문장을 자연스러운 cover text에 삽입합니다.

bash
cat cover.txt \
| steganeur decode \
--method rejection --rejection-bits 2 \
--temperature 1.0 --top-k 300 \
--context "The old lighthouse stood at the edge of the cliff, its beam sweeping across the dark waters each night." \
--llama-url "http://127.0.0.1:11434" \
--model "Qwen3.6-27B-GGUF" \
--vocab-size 152064 --eos-token 151643

토큰 파일이나 별도 채널 없이 cover text만 다시 모델에 넣어 원래 메시지를 복원합니다.

02
네 가지 부호화 방식은 자연스러움, 토큰당 비트 수, 서버 결정성 요구 조건에서 서로 다른 절충을 만듭니다. rejection은 모델 분포를 2^b개의 동일 확률 구간으로 나누고 메시지 비트가 지정한 구간에서 토큰을 뽑아 KL divergence를 0으로 유지하며, arithmetic과 huffman은 확률 분포에 따라 가변 비트 수를 담고 block은 토큰 ID의 고정 hash 구간에서 토큰을 선택합니다. CPU 서버에서는 rejection이 가장 자연스러운 문장을 만들고 arithmetic이 높은 용량을 제공하며, GPU처럼 로그확률이 흔들리는 환경에서는 block이 안정적으로 작동합니다.
bash
llama-server -m model.gguf --host 0.0.0.0 --port 11434 \
--n-gpu-layers 0 \
--cache-type-k f16 --cache-type-v f16 \
--flash-attn off

rejection, arithmetic, huffman의 확률 구간을 재현할 수 있도록 CPU 기반 결정론적 서버를 실행합니다.

03
이 구현에서 가장 큰 제약은 송신자와 수신자가 모델의 확률 분포를 같은 방식으로 재현해야 한다는 점입니다. CPU에서는 동일한 프롬프트의 forward pass가 bit-identical 로그확률을 내지만, GPU에서는 cuBLAS 행렬 곱셈의 reduction 비결정성 때문에 로그확률이 호출마다 0.05에서 0.30만큼 달라질 수 있어 rejection·arithmetic·huffman의 구간과 코드가 어긋납니다. block은 로그확률의 크기가 아니라 token ID hash로 구간을 정하므로 GPU에서도 이 drift의 영향을 받지 않습니다.
bash
echo "Meet me at noon" | steganeur encode --ecc --ecc-parity 10 --method block --block-bits 2 \
--temperature 2.0 --top-k 300 \
--context "She walked through the forest" \
--llama-url "http://127.0.0.1:11434" \
--model "Qwen3.6-27B-GGUF" \
--vocab-size 152064 --eos-token 151643

block 방식으로 메시지를 삽입하면서 10바이트 패리티를 추가해 전송 중 바이트 오류를 정정합니다.

04
온도는 확률 분포의 평탄함과 메시지 용량 사이의 조절 변수로 작동합니다. temperature 1.0에서는 토큰당 0.5~2비트로 1~5바이트의 매우 짧은 메시지에 적합하고, 2.0에서는 2~6비트로 5~50바이트를 처리하며, 3.0 이상에서는 6~8비트로 약 200바이트까지 늘어납니다. 다만 온도를 높이면 자연스러운 확률 분포에서 멀어질 수 있으므로 arithmetic에는 2.0 이상을 권장하고 block은 온도 변화에 덜 민감하게 설계했습니다.
05
Reed-Solomon 기반 ECC는 로그확률 drift나 기타 잡음으로 생기는 비트 오류를 메시지 바이트 앞뒤에서 복구하는 보조 계층입니다. GF(2^8) 위에서 동작하며 --ecc-parity N으로 N개의 패리티 바이트를 추가하면 최대 floor(N/2)개의 바이트 오류를 정정할 수 있습니다. 오류가 토큰별로 국소화되는 block과 rejection에는 효과적이지만, arithmetic에서 한 번의 구간 오류가 이후 비트 전체로 전파되는 경우에는 제한적으로만 작동합니다.
06
실행에는 Rust와 top_logprobs 및 token ID를 반환하는 OpenAI-compatible /v1/completions 서버가 필요합니다. llama.cpp, Ollama, vLLM, TGI 같은 서버를 사용할 수 있지만 full-quality 방식에는 CPU 설정이 요구되고, GPU 환경에서는 block을 선택해야 합니다. 프로젝트는 짧은 텍스트와 수십 바이트 규모의 메시지를 대상으로 하며 27B 모델도 CPU에서 인코딩과 디코딩을 각각 수 초 안에 처리할 수 있다고 설명합니다.

용어 해설

신경망 언어 스테가노그래피(Neural Linguistic Steganography)
언어 모델이 다음 토큰을 선택하는 과정에 비밀 메시지의 비트를 삽입해 겉보기에는 자연스러운 문장을 생성하는 기술입니다. 수신자는 동일한 모델과 설정으로 문장을 다시 처리해 토큰 선택에 담긴 메시지를 복원하며, 별도의 토큰 파일이나 통신 채널이 필요하지 않습니다.
거부 샘플링(Rejection Sampling)
모델의 토큰 확률 분포를 여러 구간으로 나누고 메시지 비트가 지정한 구간에서 토큰이 나올 때까지 샘플을 반복하는 방식입니다. 모델 분포에서 직접 토큰을 뽑기 때문에 일반 생성과 통계적으로 같은 출력을 만들 수 있지만, 확률값이 실행마다 달라지면 구간 경계가 바뀝니다.
산술 부호화(Arithmetic Coding)
비밀 메시지를 이진 소수로 간주한 뒤 모델의 누적 확률 구간 안에서 해당 값이 들어가는 토큰을 선택하는 부호화 방식입니다. 한 토큰이 1~8비트를 담을 수 있어 분포가 평평할수록 용량이 커지지만, 한 번의 확률 구간 오류가 이후 상태 전체로 전파될 수 있습니다.
상위 토큰 로그확률(top_logprobs)
언어 모델이 다음 토큰 후보에 부여한 상위 로그확률과 토큰 ID 목록입니다. Steganeur는 샘플링된 결과가 아니라 이 확률값을 읽어 토큰 분포를 재구성하고, 이를 기준으로 메시지 비트에 맞는 토큰을 선택합니다.
Reed-Solomon 오류 정정 코드(Reed-Solomon Code)
메시지 바이트에 패리티 바이트를 추가해 전송 중 발생한 오류를 복원하는 오류 정정 기법입니다. Steganeur는 GF(2^8) 위에서 동작하며 패리티 N바이트를 추가하면 최대 floor(N/2)개의 바이트 오류를 고칠 수 있지만, 산술 부호화처럼 오류가 긴 연속 손상으로 번지는 경우에는 효과가 제한됩니다.

기술

  • Rust
  • llama.cpp
  • Ollama
  • vLLM
  • TGI
  • Qwen3.6-27B-GGUF
  • top_logprobs
  • Reed-Solomon
  • GF(2^8)
  • cuBLAS

활용 사례

  • 포럼 게시글에 비밀 메시지를 숨겨 교환하는 통신
  • 이메일이나 블로그의 자연스러운 문장에 메시지를 삽입하는 통신
  • 동일한 커뮤니티 기본 설정을 사용하는 구성원 간 텍스트 기반 메시지 교환
  • GPU 서버에서 block과 ECC를 조합한 오류 내성형 메시지 전달
AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 08. 22.수집 2026. 08. 22.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.