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로 일부 바이트 오류를 복구할 수 있습니다.
섹션별 상세
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에 삽입합니다.
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만 다시 모델에 넣어 원래 메시지를 복원합니다.
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 offrejection, arithmetic, huffman의 확률 구간을 재현할 수 있도록 CPU 기반 결정론적 서버를 실행합니다.
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 151643block 방식으로 메시지를 삽입하면서 10바이트 패리티를 추가해 전송 중 바이트 오류를 정정합니다.
용어 해설
- 신경망 언어 스테가노그래피(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 Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.