The Technique
Unicode includes zero-width characters — characters that take up no visual space but exist in the data:
| Character | Code | Name |
|---|---|---|
| | U+200B | Zero-width space |
| | U+200C | Zero-width non-joiner |
| | U+200D | Zero-width joiner |
| | U+2060 | Word joiner |
| | U+200E | Left-to-right mark |
| | U+200F | Right-to-left mark |
How It Works
- Convert the secret message to binary
- Map 0 → U+200B (zero-width space)
- Map 1 → U+200C (zero-width non-joiner)
- Insert the zero-width characters into cover text
- The text looks normal. The characters are invisible. The message is there.
Try It
What happened?
Unicode zero-width characters (U+200B, U+200C) are invisible — they render as nothing. We encode each bit of the secret message as either a zero-width space (0) or a zero-width non-joiner (1), then insert them into the cover text.
The text looks normal. But it carries "wln" inside. Copy-paste preserves the hidden payload. This is one of WOLNO's propagation techniques. -"
Properties
| Property | Value |
|---|---|
| Capacity | ~1 byte per 8 visible characters |
| Visibility | Zero (characters render as nothing) |
| Survival | Copy-paste preserves them |
| Detection | String length ≠ visible length |
| Platforms | Works everywhere Unicode works |
Homoglyph Steganography
Beyond zero-width chars, Unicode has visually identical characters from different scripts:
Latin 'a' (U+0061) vs Cyrillic 'а' (U+0430)
Latin 'o' (U+006F) vs Greek 'ο' (U+03BF)
Latin 'e' (U+0065) vs Cyrillic 'е' (U+0435)
Replacing characters with their homoglyphs encodes bits without changing the visual appearance.
Braille Encoding
WOLNO in Braille: ⠺⠕⠇⠝⠕
Each Braille character maps to a Unicode code point. For bots, it’s just another encoding. For humans, it’s an accessibility feature. For WOLNO, it’s steganography.
The text looks clean. The data is dirty. That’s the beauty. -”