Hide Messages in Chess Games
Convert any text into a legally playable chess game. Play it anywhere — then decode the hidden message.
Decode the Hidden Message
Paste any PGN from Chess.com, Lichess, or any platform. Watch the game replay as the message is extracted.
Create a Dead Drop
Generate a reference card. Share only the pointer — the data lives on the chess platform.
How It Works
Chess steganography — mathematically concealing information inside legally playable games.
Text is converted to binary. At each position, legal moves are sorted alphabetically (deterministic). k = floor(log₂(N)) bits are encoded by choosing move index. The game looks natural: pawn moves, development, castling, captures. Works cross-platform — import into Chess.com, Lichess, or any PGN viewer.
The FEN channel never hides messages — it generates a random, fully legal chess position to use as a portable encryption key instead of a typed password. Only the visual arrangement of pieces matters for the key: whose turn it is, castling rights, en passant, and move counters are all ignored, since none of that is visible on a static picture of a board. Two people who independently arrive at the same-looking position, by any means (ChessCipher, Lichess, a printed diagram), always derive the exact same key — even if they typed or exported the rest of the FEN differently. Paste a generated FEN into the Key field on either the Encode or Decode page — the app detects it automatically and hashes the piece placement into the encryption key.
There's no separate mode switch to remember — it's entirely driven by the Key field. Leave it blank and the message encodes in public mode: no key, anyone can decode it. Type or paste anything into it — a password, or a FEN from the Random FEN Secret Key generator — and that's used to encrypt the message. The app checks automatically whether what you entered contains a recognizable FEN piece placement and, if so, derives the key from just that placement; otherwise it uses the text directly as a password. The same key field, checked the same way, is used on both the Encode and Decode page, so there's nothing that can get out of sync between them.
Wrong or missing key returns a plausible chess commentary message — never an error. Decoys are deterministic: hash(PGN + wrong_key) → same decoy every time. Three tiers: normal chess commentary (60%), mildly suspicious (30%), subtle troll (10%).
At each chess position with N legal moves: k = ⌊log₂(N)⌋ bits can be encoded by choosing a move index in [0, 2^k). This guarantees all chosen indices are valid moves. Moves are sorted by SAN notation to ensure identical ordering at encode and decode time. A 2-byte length prefix is prepended to the payload before bit-encoding, enabling exact message reconstruction regardless of trailing bits.