Invisible Text Extractor
Detect and extract hidden messages from text containing zero-width Unicode characters. Tries six character-set combinations, decrypts AES-256-GCM payloads when you give the password and highlights CTF flags. Processed in your browser; the text is not uploaded to StegoToolkit's server.
Paste Suspicious Text
Paste any text to instantly detect hidden zero-width characters. Counts appear before you click anything.
🔒 Your text is decoded in this tab and not sent to StegoToolkit's server
How to Find a Hidden Message in Text (4 steps)
- Paste the suspicious text. The count of zero-width characters appears at once, before you press anything.
- Look at the ZW Visualizer to see which invisible characters are present and where.
- Click Auto-Detect, which tries six character-set combinations, or choose the mode yourself.
- Enter the password if the payload is AES-encrypted, then copy or download the decoded message.
Zero-Width Steganography Detection — What This Tool Handles
| Feature | Technique | Speed | Best For |
|---|---|---|---|
| Auto-Detect | Tries six predefined character-set combinations in a fixed order: four binary pairs, then quaternary and octal. Results are ranked by validation rules, with authenticated AES-GCM decryption preferred over readable text, encrypted-looking data and noise. | Runs in your browser; encoding plus decoding 20 kB in a 1-million-character text took under one second in our test | Text made by this site's Invisible Text Hider, and puzzles that use the same character sets |
| ZW Visualizer | Shows each zero-width character as a coloured marker | Instant | Seeing exactly which characters are present and where |
| Suspicion score | A 0–100 heuristic based on zero-width character presence, density, number of distinct character types and balance between two types. A triage aid, not a probability that a hidden message exists. | Instant | A quick hint only — see the FAQ for why it is not a verdict |
| AES-256-GCM decryption | Recognises this site's encrypted format and decrypts with the password you give | Recognizes the 48-byte encryption wrapper | Needs the exact password; a wrong one is reported as not decrypted |
| CTF flag detection | Looks in the decoded text for flag{…}, CTF{…}, HTB{…}, picoCTF{…} and similar shapes in printable ASCII | Instant | One-click copy of a flag |
What This Extractor Reads
It looks for the nine zero-width characters it recognises (the Invisible Text Hider writes eight of them) — U+200C, U+200D, U+2060, U+200E, U+200F, U+200B, U+00AD, U+2062 and U+2064 — counts them, and tries to read them as a stream of bits: one bit per character (two characters), two bits (four) or three bits (eight), grouped into bytes. The first four bytes must be a length that fits in the data; if they do, that many bytes are the payload. Other invisible characters, such as U+FEFF, are neither counted nor removed.
Auto-Detect tries six fixed character-set combinations and keeps the best one. Ranking: a result that passed AES-GCM authentication comes first; a reading whose length field accounts for every byte ranks above one that does not; then readable text ranks above encrypted-looking data, which ranks above noise; a reading with damage beyond repair loses points. Positions do not matter and no seed is needed, because the decoder reads every matching character in order. A message made with a character set outside those six needs Manual mode with the matching mode.
Reading the Results
'Hidden Message Extracted' means the bytes decode as readable UTF-8. 'Encrypted Payload Found' means the payload matches the decoder's encrypted-format checks (the length field of this site's encrypted format) or is random-looking enough (entropy above 7.4 bits per byte) to warrant further inspection. Neither alone proves it is encrypted: compressed or random data looks the same. If you expect an AES-GCM message, enter the password and decode again. A wrong password and a missing password give the same result — the tool cannot tell them apart, and it never shows a green 'decrypted' mark unless AES-GCM authentication passed.
Short payloads are not judged by entropy alone. Entropy estimates are less reliable for short payloads, because a small sample may not represent the underlying data well, so for short payloads the extractor also checks the structure of this site's encrypted format. Neither high entropy nor a matching structure alone proves that data is encrypted: compressed or random data looks the same.
The Suspicion Score Is a Hint, Not a Verdict
The score is computed from the character counts only: 30 for any zero-width character, up to 30 for density above 0.1% or 1%, 25 for two or more types, and 15 when exactly two types occur in similar numbers. Legitimate text can reach a moderate score: scripts such as Persian and the Indic languages use U+200C and U+200D in ordinary spelling, and emoji sequences use U+200D. A high score means 'worth decoding', not 'a message is hidden'; a low score does not prove there is none.
When Nothing Decodes
Work down this list. (1) Is it the original text? Any application that strips or replaces invisible characters changes the stream and breaks it — a single removed character shifts every bit after it. (2) Is a password needed? Encrypted data shows the 'Encrypted Payload Found' result. (3) Try Manual mode with each mode in turn. (4) The characters may be innocent typography. (5) For other hiding places in text, try the Text Steganography Extractor or the Whitespace Steganography Extractor.
Examples
Input: A paragraph made by the Invisible Text Hider with 'Meet at noon', Binary mode, no password.
Result: Auto-Detect finds 128 zero-width characters and returns 'Meet at noon' as readable text.
Meaning: No setting was needed: the character set is one of the six tried.
Input: A text with a PNG file hidden in it by the Hider (file name pic.png).
Result: 'Hidden File Extracted' with the name pic.png and the type PNG; Download saves it under that name.
Meaning: The name is read from this tool's file frame and the type from the first bytes where they match a known signature. A file hidden by another program may not use this tool's file-name format; then the recovered bytes are shown without a reliably recovered original name.
Input: A message hidden with Reed-Solomon where some bytes were altered.
Result: A green note says how many bytes were repaired; beyond what Reed-Solomon can repair, an amber note says the bytes are shown as found.
Meaning: Repairs apply to changed bytes only. Removed characters shift the bits after them and cannot be repaired.
Input: The same message encrypted with 'right', decoded with 'wrong'.
Result: 'Encrypted Payload Found' — not decrypted, no text shown.
Meaning: AES-GCM authentication failed. Enter the correct password.
Input: Plain text with no zero-width characters.
Result: 'No zero-width characters found', with possible reasons.
Meaning: Nothing to decode — or the platform removed them.
Input: A cover text that already contained zero-width characters before encoding.
Result: The Extractor returns the encoded message when the Hider removed the conflicting characters or selected a character pair that avoids them.
Meaning: Pre-existing characters from the pair used for encoding could otherwise be read as part of the hidden bit stream.
How the Invisible Text Extractor Works
1. Count
Every code point is checked against the nine zero-width characters; the counts and positions feed the visualizer and the score.
2. Read bits
For each character set tried, the matching characters are turned into bits in order and grouped into bytes.
3. Check the frame
The first four bytes are a length. If it is zero or longer than the data, the attempt is rejected. If it is shorter than the data, the extra bytes are ignored and the attempt ranks below one whose length accounts for every byte.
4. Repair and decrypt
A Reed-Solomon wrapper is repaired if present; with a password AES-GCM decryption is tried, and only a passing tag counts as decrypted.
5. Rank
Attempts are ranked using AES-GCM authentication, whether the length field accounts for every byte, readability, the encrypted-format or entropy checks, and damage beyond repair. A successfully authenticated decryption ranks highest; the other results are ranked by those rules (the exact weights are in the Auto-Detect explanation above). Everything runs in your browser tab.
What the results mean
| Result | What it means | What to do |
|---|---|---|
| Hidden Message Extracted | The bytes decode as readable text. | Copy or download it. |
| Hidden File Extracted | The payload carries a file name (it was hidden as a file by the Hider). | Download it; the type shown comes from its first bytes when they match a known signature, otherwise no type is shown. |
| Encrypted Payload Found | The payload matches the encrypted-format checks or looks random; this is an inference, not proof. Decryption is confirmed only when AES-GCM authentication passes. | Enter the password; a wrong password looks identical. |
| Data Extracted (binary) | Valid framing, not readable text, not recognised as encrypted. | Download it and check its type with the File Type Detector. |
| No zero-width characters found | The text contains none of the nine characters. | Check the text is the original; a platform may have removed them. |
Limitations
- Only the nine characters listed above are read. Other invisible characters, and hiding methods that are not zero-width (homoglyphs, trailing spaces), need the other tools.
- Auto-Detect tries six fixed character sets. A different set needs Manual mode.
- A short, unencrypted binary payload can score as noise or be outranked by a lucky readable reading from another character set; if the result looks wrong, try Manual mode.
- The suspicion score is a heuristic over character counts and can be high for ordinary text in scripts that use U+200C/U+200D.
- Download Clean Text removes the nine characters above only.
- Reed-Solomon repair covers the payload, not the 4-byte length at the start; a text whose characters were removed cannot be repaired. Damage beyond the limit is usually flagged but can occasionally be “repaired” into wrong bytes; with a password, a failed AES-GCM check exposes that.
- A file name is only known for files hidden with this site's Hider; the file type is recognised from the first bytes where they match a supported signature, so unrecognised data can still be downloaded without a type.
Privacy
Your pasted text and password are processed in this browser tab and are not sent to a StegoToolkit server by the tool's own code. Site analytics, if you accept them, may record which options and buttons you used (for example the mode, a copy or a download), never your text or password; the host keeps ordinary request logs for page requests.
Which Tool Next?
- Invisible Text Hider — Make the zero-width message you are decoding.
- Text Steganography Extractor — Homoglyph and whitespace methods.
- Whitespace Steganography Extractor — Spaces, tabs and line endings (SNOW-style).
- File Type Detector — Identify a binary payload by its magic bytes.
Frequently Asked Questions
How does Auto-Detect work?
It tries six character-set combinations in this order: binary ZWNJ/ZWJ, binary ZWSP/ZWJ, binary ZWNJ/WJ, binary LRM/RLM, quaternary and octal. Each attempt must contain a valid length and then readable text, a payload that matches the encrypted-format checks or looks random, or neither. The best-ranked attempt is shown: authenticated decryption first, then readings whose length field accounts for every byte, then readable text above encrypted-looking data above noise.
Why did Auto-Detect fail?
The usual reasons: (1) the text is not the original, because an app removed or changed invisible characters; (2) the payload is encrypted and no password was given or the password is wrong; (3) the message used a character set outside the six tried — use Manual mode; (4) the zero-width characters are ordinary typography, not a message; (5) the hiding method is not zero-width at all.
The output is garbled. What does that mean?
Either the data is encrypted (enter the password) or the mode does not match (try Manual mode with each mode). The entropy shown helps: a very high value on a long payload is consistent with encryption or compression (it proves neither); for short payloads the tool looks at the encrypted format's structure instead, because short random data cannot reach a high entropy value.
I see zero-width characters but nothing decodes. Why?
They may be innocent: Persian, Indic and emoji text use U+200C and U+200D normally. The suspicion score is only a hint. If the text is meant to hold a message, a different character set, an altered copy or a password is the next thing to check. The seed is not needed.
How do I solve a zero-width CTF challenge?
Paste the text and click Auto-Detect. The most common puzzle uses U+200C and U+200D as 0 and 1, which is the first combination tried. Flag shapes such as flag{…} or picoCTF{…} in the decoded text are highlighted. If it fails, use Manual mode, or check whether the bits are written in a different order or a different character pair.
Can I get the text without the hidden characters?
Yes. Copy Clean Text or Download Clean Text removes the nine zero-width characters this tool reads. Other invisible characters, such as U+FEFF, are kept.
How do I find hidden or invisible characters in a text file?
Paste the text (or open the file) in the box. The tool counts the nine zero-width characters it knows — ZWSP, ZWNJ, ZWJ, word joiner, soft hyphen, the direction marks and the invisible times and plus characters — before you press anything, and the ZW Visualizer shows each one as a coloured marker in the text. A text file is read as text only; other invisible characters, such as U+FEFF, are not counted.
Is this a ZWSP / zero-width text decoder?
Yes. U+200B (ZWSP) is read in the binary ZWSP/ZWJ combination and in Octal mode, U+200C/U+200D in the default binary combination, and the other characters in the remaining sets; Auto-Detect tries all six. If a puzzle used another pair, switch to Manual mode and choose the mode that matches.
What happens if the hidden payload is a file?
A file hidden with this site's Hider carries its name, which is shown together with the type recognised from the first bytes where they match a supported signature (PNG, ZIP, PDF and so on). Download saves it under that name. A file hidden by another program may not use this tool's file-name format; if no recognised name is present you get the recovered bytes without a reliably recovered original name (a .bin download for binary data) and can identify them with the File Type Detector.
Is my text sent to any server?
No. Scanning, decoding and AES decryption run in your browser tab, and in our browser check no request carried the text or password. Usage statistics may record the options you used and step timings, never your text or password; Google Analytics and Ahrefs load only after you accept, while Vercel's cookieless page-view counter always runs, and the host keeps ordinary request logs.
Related Tools
Invisible Text Hider
Hide secret messages inside visible text using zero-width Unicode characters. Add optional AES-256-GCM encryption and check payload capacity before encoding. Processing happens in your browser; the text and payload are not uploaded to StegoToolkit's server.
Steganography Detector
Statistical steganalysis with three published tests — chi-square, RS analysis and Sample Pairs — fused into one score and checked against the real StegExpose on a small test set. Payload size estimate. Method fingerprint. WAV audio support. Processed in your browser, not uploaded.
Text Steganography Hider
Hide secret messages or watermarks in plain text using Unicode homoglyphs, trailing whitespace, Unicode spaces, or inter-word spacing. Optional AES-256-GCM encryption and Reed-Solomon parity. Processed in your browser, not uploaded.
Text Steganography Extractor
Auto-detect and extract messages hidden with this site's Text Steganography Hider using homoglyph, whitespace, and spacing methods. Anomaly hints and attribution of this tool's batch watermarks. Processed in your browser, not uploaded.