StegoToolkit

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.

Paste Your Cover Text

The visible text your recipient will read. Your secret message is invisibly embedded inside it using whitespace or character substitution.

Cover text length determines capacity. Longer = more hiding capacity. Use a natural-looking excerpt — news articles, Wikipedia paragraphs, or email text. The tool calculates capacity based on your chosen method.

Try the demo instantly

Loads a sample cover text — no typing needed

Longer text = more capacity

Processed in your browser

Your cover text and secret message are encoded in this browser tab and never sent to a server. Usage statistics may record which options were used, never your text.

How to Hide a Message in Plain Text (5 steps)

  1. Paste your cover text — the visible text that people will actually read
  2. Enter your secret message or upload a file — optionally encrypt with AES-256-GCM
  3. Choose your encoding method (Homoglyph usually changes the fewest visible characters; Trailing Whitespace and Inter-Word Spacing are simple options for plain-text files) and your target platform
  4. Review the transformation preview, then paste the output into your destination, copy it back and decode it in the Extractor — no service has been tested
  5. Copy or download — the output looks largely unchanged on screen (homoglyphs swap some characters for look-alike code points) but carries your hidden payload, with optional error correction

Text Steganography Methods — Stealth vs Compatibility

MethodTechniqueCompatibility / OverheadBest For
Unicode HomoglyphSubstitutes Latin letters with visually identical Cyrillic/special Unicode chars (a→а, e→е, o→о)Look-alike characters (Cyrillic a e o p c x y, Roman-numeral C L I); unchanged by NFC, but NFKC turns the Roman numerals back into Latin letters. Fonts may draw some look-alikes slightly differently.Short watermarks in text that is shared as text; unusable if the cover already has these characters
Trailing WhitespaceAppends a space or tab to the end of each line — same category of technique as tools like stegsnow, using this tool's own bit encodingRemoved by anything that trims line ends; untested on specific servicesCTF challenges, plain text files
Unicode WhitespaceReplaces eligible ASCII spaces with one of four Unicode spaces (thin, hair, en or em), encoding up to 2 bits per eligible space before any text transformation. Recovery depends on the destination keeping those charactersRemoved by NFKC normalisation or any tool that replaces Unicode spaces; untested on specific servicesHigh-capacity covers where Unicode spaces are preserved
Inter-Word SpacingEncodes data by using single space (bit 0) or double space (bit 1) between wordsRemoved by anything that collapses repeated spaces; untested on specific servicesSimple, human-readable method for plain text environments
Optional payload encryption (AES-256-GCM)PBKDF2 (100k iterations) + random salt + 12-byte IV. Payload encrypted before embedding+48 bytesProtects the hidden payload's contents if someone extracts it without the password. Encryption does not make the carrier encoding itself undetectable and adds no hiding capacity
Reed-Solomon Error CorrectionRS-10/20/30 — Reed-Solomon parity; repairs a few changed characters' bytes, not stripped textParity of 10, 20 or 30 bytes per 223-byte data block (4.5% to 13.5% of each full block), plus a 16-byte header; the separate 4-byte length field and the header are not covered by the parityRepairs changed bytes, not removed characters — usually leave it off

What Text Steganography Does

You paste a cover text (the text people will see), type a message or pick a file, and the Hider returns the same text with the hidden payload encoded into characters that most readers do not notice: look-alike letters, Unicode space characters, or the number of spaces and tabs at certain places. Nothing is hidden by a password alone; encryption is an optional extra described below.

There are four methods and each changes the text differently. They are not interchangeable: a service that rewrites spaces destroys the three whitespace methods, and a service that rewrites letters destroys Homoglyph. We have not tested any individual website or app, so choose the method by what your destination is likely to keep, then paste the text back through the Extractor to check.

What Changes in Your Text

Homoglyph replaces some of the letters a e o p c x y C L I with a different character that looks the same: Cyrillic а е о р с х у (U+0430, U+0435, U+043E, U+0440, U+0441, U+0445, U+0443) and the Roman numerals Ⅽ U+216D, Ⅼ U+216C and Ⅰ U+2160. A 1 bit swaps the letter, a 0 bit keeps it. The text looks largely unchanged but those letters are now different code points, which a code-point or search view shows immediately, and a cover that already contains any of these characters is refused because they would be read as 1 bits.

Unicode Whitespace replaces eligible ASCII spaces with one of four Unicode spaces, two bits per space: 00 thin space U+2009, 01 hair space U+200A, 10 en space U+2002, 11 em space U+2003. Trailing Whitespace puts one space (0) or one tab (1) at the end of a line, one bit per line, and removes any trailing spaces and tabs the line already had. Inter-Word Spacing writes a single space (0) or a double space (1) between words, one bit per gap.

The whitespace methods rewrite whitespace that was already in your cover: Trailing Whitespace strips existing trailing spaces and tabs on every line (including lines after the message ends), and Inter-Word Spacing treats existing double spaces as 1 bits. Review the result if the cover is code, a table or a poem where spacing matters.

How Each Method Stores the Data

The payload is optionally encrypted with AES-256-GCM, then optionally wrapped with Reed-Solomon parity, then given a 4-byte big-endian length in front, and the bytes are written most-significant bit first, one bit (or two for Unicode Whitespace) per position in the order the positions appear in the text. An unencrypted payload has no checksum or authentication tag (an encrypted one has the AES-GCM tag). The Extractor accepts a frame when the length it reads fits in the available text, so an altered unencrypted message can be returned with incorrect bytes.

Capacity is therefore (positions ÷ 8) − 4 bytes for a plain message, less 48 bytes when a password is set (the encrypted layout has its own 4-byte length, a 16-byte salt, a 12-byte IV and a 16-byte tag, separate from the outer 4-byte length) and less Reed-Solomon parity (16 header bytes plus 10, 20 or 30 per 223-byte block). A cover that is too short is refused with the exact number of bits it needs; a 2-byte message needs 48 bits (32 length bits plus 16 message bits).

Choosing a Method

Homoglyph usually changes the fewest visible characters (it depends on the cover text and the payload) but puts non-Latin letters into Latin text, and a copy that goes through NFKC normalisation converts the Roman numerals back. Unicode Whitespace encodes up to 2 bits per eligible ASCII space, the most per position of the four methods, though total capacity still depends on the cover (on the prose cover below Homoglyph holds slightly more) and it is lost when a tool replaces Unicode spaces or applies NFKC. Trailing Whitespace needs many lines for even a short message and does not survive an editor that trims line ends. Inter-Word Spacing survives only as long as double spaces are kept.

None of the four has been measured against detection tools, and none has been tested on a specific service. The Extractor's Anomaly Score shows how unusual a text looks by counting these same features; it is not a detector for a particular method.

How Strong Is the Encryption?

If you set a password, the payload is encrypted before it is hidden, in your browser, with the Web Crypto API. The cipher is AES-256 in GCM mode. The 256-bit key is derived from your password with PBKDF2 using HMAC-SHA-256 and 100,000 iterations. Every encryption generates a fresh random 16-byte salt and a fresh random 12-byte IV with the browser's cryptographically secure random generator (crypto.getRandomValues), so encrypting the same message twice gives different bytes. The stored layout is a 4-byte length, the salt, the IV, then the ciphertext followed by a 16-byte authentication tag — 48 bytes added in total. The tag means a wrong password, or any change to the ciphertext, makes decryption fail instead of returning garbage.

These are standard, widely used primitives, but this implementation has not had an independent audit, and using them does not make the system unbreakable. Their limits matter. Anyone who finds the hidden data can copy the ciphertext and try passwords against it offline, so your password is the real defence: use a long random passphrase, not a word or a date. The key derivation uses 100,000 PBKDF2-HMAC-SHA-256 iterations. This is below OWASP's commonly cited 600,000-iteration recommendation for password storage. That recommendation is not a direct requirement for this file-encryption format, but the lower count makes a strong, unique password especially important. The iteration count is fixed in the code and is not written into the file, so raising it requires a new, versioned format so that files already made can still be opened.

Encryption hides what the data says, not that it exists, and it does not hide the length: AES-GCM ciphertext is the same length as the plaintext, and the encrypted layout adds a fixed 48 bytes of overhead: its own 4-byte length field, the salt, the IV and the authentication tag, separate from any length or framing the tool puts around it. No padding is added. There is no key file and no way to recover a forgotten password. We have not measured key-derivation time on phones or older devices, so very large batches or slow devices may take noticeably longer per file. The tool is intended for educational and personal use; do not rely on it as the only protection for sensitive information, or against a well-resourced adversary.

Capacity Examples (computed by the tool's own function)

Largest message in bytes for two sample covers. The prose cover is one 221-character paragraph (44 spaces, 91 substitutable letters, 1 line); the list cover is 800 lines of 'row N of the cover' (3,200 spaces, 4,800 substitutable letters).

CoverMethodPositions (bits)PlainPasswordRS-10Password + RS-10
Prose, 1 lineHomoglyph917 B000
Prose, 1 lineUnicode Whitespace887 B000
Prose, 1 lineInter-Word Spacing441 B000
Prose, 1 lineTrailing Whitespace10000
800-line listHomoglyph4,800596 B548 B550 B502 B
800-line listUnicode Whitespace6,400796 B748 B740 B692 B
800-line listInter-Word Spacing3,200396 B348 B360 B312 B
800-line listTrailing Whitespace80096 B48 B70 B22 B

Examples

Input: The 221-character prose cover and the 2-byte message Hi, Homoglyph

Result: 7 of the 91 substitutable letters are replaced; Auto-Detect in the Extractor returns Hi.

Meaning: 48 bits are needed (32 length bits and 16 message bits) and the cover holds 91, so it fits. Only the bits that are 1 change a letter, which is why 7 letters changed, not 48.

Input: A 60-line cover (Line N of the notes) and the message OK, Trailing Whitespace

Result: 48 trailing characters are added (one on each of the first 48 lines) and the Extractor returns OK.

Meaning: One bit per line: a space for 0 and a tab for 1. The remaining 12 lines are left without trailing whitespace. A text editor that removes trailing whitespace would delete the message.

Input: A 25-space sentence and the message hi, Unicode Whitespace

Result: 24 of the 25 spaces become thin, hair, en or em spaces (the first ones are U+2009 because the length bytes start with zeros).

Meaning: Two bits per space, so 48 bits use 24 spaces. The text looks the same on screen but a code-point view shows the different space characters.

Input: 800-line cover, message secret note, password right pw, Trailing Whitespace, then extracted with right pw, wrong pw and no password

Result: Right password: the message and 'Decrypted: the AES-GCM authentication tag matched'. Wrong password: 'Wrong password: the data has the encrypted layout but AES-GCM authentication failed'. No password: 'Looks encrypted'.

Meaning: AES-GCM either authenticates or fails; there is no garbage text. The encrypted message needs 48 bytes more room, so on this cover the largest password-protected message is 48 bytes.

How the Text Hider Works

Analyse the cover

The text is split into lines, spaces and substitutable letters, and the capacity of every method is calculated from those counts.

Prepare the payload

Your message or file is optionally encrypted (AES-256-GCM, 48 bytes added) and optionally given Reed-Solomon parity, then a 4-byte big-endian length is placed in front.

Check it fits

The framed bits are compared with the method's positions. If they do not fit, nothing is written and you see the exact numbers.

Write the bits

Each bit becomes a letter swap, a space variant, a space or tab at a line end, or a single or double space, depending on the method.

Count what changed

The result reports how many characters were changed or added, compared run by run so that added line-end whitespace is not counted as a shift of every later character.

What the results mean

ResultWhat it meansWhat to do
Message Hidden SuccessfullyThe encoder wrote the bits into the cover and reports the bytes hidden, the method and the characters changed.Copy or download the text and check it by pasting it into the Extractor before sending.
Cover text too shortThe framed payload needs more positions than the cover has for this method.Use a longer cover, a shorter message, a method with more capacity, or turn off Reed-Solomon or the password.
Cover already contains the Homoglyph markersThe cover has Cyrillic look-alike letters or Roman numerals that would be read as 1 bits.Choose another method or remove those characters from the cover.
Per-recipient copies: N copies in the ZIPOne file per recipient, each carrying a different hidden tag, plus watermark-key.json and, if any copy could not be made, failed-copies.txt.Keep the key file; the Extractor's Watermark Attribution needs it.

Limitations

  • No website, messaging app, email client or editor was tested: the pages cannot say which method a destination keeps.
  • NFKC normalisation or any tool that replaces Unicode spaces removes Unicode Whitespace and the Roman-numeral substitutions; trimming trailing whitespace removes Trailing Whitespace; collapsing repeated spaces removes Inter-Word Spacing.
  • Reed-Solomon repairs changed bytes, not removed characters, and the 4-byte length in front is outside its protection.
  • There is no checksum on an unencrypted message, so a damaged text can come back with some wrong bytes; use a password when you need to know it is intact.
  • Homoglyph is refused for a cover that already contains its marker characters, and capacity for every method depends on the cover.
  • The Anomaly Score counts the same features the methods use, so ordinary text with double spaces, trailing whitespace or genuine Cyrillic can score as suspicious.

Privacy

The text and any file are processed in your browser tab and are not uploaded. Usage statistics may record which options were used, such as the method, never your cover text, message or password. The hosting provider keeps ordinary request logs for page loads.

Which Tool Next?

Frequently Asked Questions

What is the difference between this tool and the Invisible Text Hider?

The Invisible Text Hider uses zero-width Unicode characters (completely invisible, zero width). This tool uses structural methods — modifying whitespace patterns and substituting visually identical letters (homoglyphs). Both are visible to a tool that lists code points or whitespace; which survives depends on the destination, and none was tested.

Which method has the best stealth?

None has been measured against detection tools. Homoglyph usually changes the fewest visible characters (it depends on the cover text and the payload) but puts non-Latin letters into Latin text, which a code-point viewer shows at once; the whitespace methods are invisible on screen but show in "show whitespace" views. Pick by what your destination keeps, not by a stealth ranking.

Is this compatible with stegsnow or similar CLI tools?

No — the Trailing Whitespace method uses this tool's own bit encoding and payload framing, not stegsnow's wire format, so files aren't interchangeable with the stegsnow CLI. It's the same general technique (hiding data in trailing line whitespace), with AES-256-GCM encryption instead of a built-in cipher like stegsnow's ICE.

How does per-recipient batch watermarking work?

You provide a list of recipients and a master secret. For each recipient, the tool uses HMAC-SHA-256 to derive a unique 64-bit ID. That ID plus the recipient name is embedded as the hidden payload. All copies look the same on screen. If one turns up elsewhere, paste it in the decoder: it extracts the ID and shows the recipient record assigned to that copy (with your key file). That identifies the embedded assignment; by itself it does not prove who passed the copy on, because the hidden tag can be copied or removed.

What does Reed-Solomon error correction do?

It adds Reed-Solomon parity (10, 20 or 30 bytes per 223-byte block plus a 16-byte header for RS-10, RS-20, RS-30), which can in theory correct up to 5, 10 or 15 erroneous bytes per block, provided the decoder can locate and decode the block and the errors stay within that limit. It does not make a watermark survive heavy editing or stripped characters, and it does not cover the 4-byte length stored at the very start or the 16-byte Reed-Solomon header (damage there makes the message unreadable). The Extractor detects Reed-Solomon by itself. We suggest leaving it off unless you expect a few isolated changes.

Does the output text look different?

Whitespace methods look unchanged on screen (trailing whitespace, double spaces and Unicode spaces are subtle, not invisible to a careful reader). Homoglyph characters are different code points that usually look the same, but fonts can draw some of them differently, and a text search for the original word no longer finds it.

Will this survive sending through Gmail?

We have not tested Gmail or any other service. Services may trim trailing whitespace, collapse spaces or normalise Unicode; the transformation check shows what each of those would do to your text. Send yourself a test copy, copy it back out and decode it before relying on it.

Does it keep the file name of a hidden file?

No. You can hide a file instead of typed text, but only its bytes are stored. The Extractor names the download extracted-payload with an extension only when it recognises the file signature (PNG, JPEG, PDF, ZIP, GIF, MP3, WAV, ELF or EXE), otherwise .bin. Capacity is small (one bit per letter, space or line), so files only fit in very long cover texts.

What happens to my cover text when it is encoded?

Only the carrier characters change: Trailing Whitespace rewrites the end of every line (an existing trailing space or tab is replaced), Inter-Word Spacing turns each run of spaces after a word into one or two spaces, Unicode Whitespace replaces ASCII spaces with thin/hair/en/em spaces and turns existing Unicode spaces into plain spaces, Homoglyph swaps letters. Leading and trailing blank space of the whole cover is trimmed when you paste it. A cover that already contains the Homoglyph look-alike letters (for example Russian text) is refused for that method, because the Extractor would read them as hidden bits.

Is my text uploaded anywhere?

No. Encoding and encryption run in your browser tab. Usage statistics may record which options were used, never your text or password.

Related Tools