Audio Steganography Hider
Hide text or files in WAV audio (an MP3 is converted to WAV first) with AES-256 encryption, Reed-Solomon error correction, a capacity meter and an SNR quality report. Processed in your browser.
Try the demo
Loads a 1-second, 8 kHz mono WAV containing a 440 Hz tone — created in your browser, nothing is uploaded
Drop a WAV or MP3 file here or click to browse
PCM WAV (8/16/24/32-bit) · MP3 (auto-converted) · Max 500 MB
MP3 files are decoded to PCM locally via Web Audio API
Processed in Your Browser
Audio decoding and extraction run locally in your browser, and the audio is not uploaded. MP3 files are decoded to PCM locally via the Web Audio API. Usage analytics (cookieless page views, plus tool events only if you accept cookies) are separate: they record option choices and coarse file facts (type, size and duration ranges), never the audio, the extracted data or a password.
How to Hide a Message in Audio (4 steps)
- Upload a WAV (8/16/24/32-bit PCM) or an MP3 — an MP3 is decoded to a 16-bit WAV in your browser first
- Enter a text message or attach any file as the hidden payload
- Choose an algorithm — LSB Audio (highest capacity) or Phase Coding; Forensic mode adds Spread Spectrum and the experimental Echo Hiding
- Optionally enable AES-256-GCM encryption and Reed-Solomon error correction — then click Encode and download the WAV
Audio Steganography Algorithms — What This Tool Handles
| Method | Technique | Quality / Cost | Best For |
|---|---|---|---|
| LSB Audio (1–4 bit) | Overwrites the lowest 1–4 bits of each sample, left, right or both channels | Highest capacity: 661,496 bytes per minute of 44.1 kHz stereo at 1 bit (4× at 4 bits). Does not survive MP3/AAC/Vorbis | Lossless transfer of WAV files, CTF-style challenges |
| Phase Coding | Sets the sign of the real part of the first non-zero-frequency FFT bin (about 10.8 Hz at 44.1 kHz) in each 4096-sample block, one bit per block (the imaginary part is set to zero) | About 76 bytes per minute. Decoded exactly after MP3 128–320 kbps, AAC 128–256 kbps and Vorbis 160 kbps in tests | Short messages that must survive a lossy re-encode |
| Spread Spectrum | Adds a seeded pseudo-random pattern, Starts at 1,024 sample frames per bit in the Lossy-safe profile or 256 in the High-capacity profile; the encoder's read-back check may raise it, up to 8,192, scaled to the local loudness | Lossy-safe profile: up to 314 bytes per minute of 44.1 kHz stereo (High capacity: up to 1,283, but it failed more of our conversions). Decoded exactly after MP3 128–320 kbps, AAC 256 kbps and Vorbis 160 kbps in tests | Larger messages that must survive a lossy re-encode (Forensic mode) |
| Echo Hiding | Adds a short echo (50 or 100 samples) in each 1024-sample block | Experimental (Forensic mode). 318 bytes per minute on paper, but the encoder refused every real recording we tried | Experiments; use Phase Coding or Spread Spectrum for real work |
| AES-256-GCM | PBKDF2-HMAC-SHA-256, 100,000 iterations, random 16-byte salt and 12-byte IV per encryption | Adds 48 bytes to the payload | Available with every algorithm |
What Hiding Data in Audio Actually Changes
An uncompressed WAV file is a long list of numbers, one per sample per channel — 44,100 samples per second per channel for CD-quality audio. Audio steganography hides a payload by making very small, structured changes to those numbers, or to the frequencies they add up to, so the change is small relative to the recording. How audible it is depends on the algorithm, the payload size and the recording: LSB changes can be very small, Echo Hiding can be heard, and Phase Coding and Spread Spectrum leave signal components that a spectrum analyser can show. This tool supports four ways of doing that, and they differ far more in what they survive than in how they sound.
The output is always a WAV file. If you upload an MP3, your browser first decodes it to 16-bit PCM and the tool embeds into that decoded audio — the hidden data is in the resulting WAV, not in an MP3. To hide data directly inside an MP3 file's structure, use the separate MP3 Steganography Embedder.
Which Algorithm Should You Choose?
Use LSB Audio when the WAV will travel as a WAV — email, USB, a download link, a CTF challenge — and you want the most room. It changes only the lowest bits of the first samples it needs, so a short message touches a fraction of a millisecond of audio. It is also relatively straightforward to investigate with statistical analysis, especially at higher embedding rates.
Use Phase Coding or Spread Spectrum when you need to test recovery after a lossy conversion to MP3, AAC or Ogg Vorbis. In our tests, which used the three test carriers (computer-synthesised speech, a music loop and an ambient track) converted with real MP3, AAC and Vorbis encoders, Phase Coding was decoded exactly after every conversion and Spread Spectrum after all but one (speech through AAC 128 kbps) — see the test matrix below (results apply to the tested encoders and carriers, not to every file or conversion workflow). Phase Coding is the simplest but holds only about 76 bytes per minute; Spread Spectrum in the Lossy-safe profile holds up to 314 bytes per minute (the High-capacity profile up to 1,283, but it failed more of the conversions in the matrix) and is available in Forensic mode.
Echo Hiding is included for completeness and experiments, is available in Forensic mode only, and is labelled experimental in the tool. On the three test carriers, the tool could not read its own Echo output back reliably, so the encoder refuses the file rather than hand you something undecodable. It is not the right choice for speech or music.
Capacity: What Fits in How Much Audio
Capacity depends on the algorithm, the length of the audio, its sample rate and its channel count — not on its file size in megabytes. All figures here are raw embedding capacity in bytes, before overhead, for exactly one minute of 44.1 kHz stereo audio (2,646,000 samples per channel), and they come from the same formulas the capacity meter uses. The largest message or file you can actually hide is smaller: 1 byte for the filename flag, 48 bytes with a password, plus Reed-Solomon parity if you choose a level; the tool's capacity check subtracts those for your chosen options. LSB at 1 bit, writing to both channels: (2,646,000 × 2 channels × 1 bit − 32 bits of length header) ÷ 8 = 661,496 bytes. At 4 bits per sample that is 2,645,996 bytes. Writing to one channel only halves it, and a mono file holds half as much as the same audio in stereo. Counting convention: capacity is counted in sample frames (one frame is one sample for each channel, so one minute is 2,646,000 frames). LSB multiplies by the number of channels it writes to. Phase Coding writes channel 0 only, and Spread Spectrum adds the same noise-like chips to every channel and reads the average of the channels, so neither grows with the channel count. Spread Spectrum at 1024 frames per bit (the Lossy-safe minimum) holds at most 314 bytes: (2,646,000 ÷ 1,024 = 2,583 bits ÷ 8 = 322 bytes) − 8 bytes of header. This is raw capacity after the Spread Spectrum header and before any filename flag (1 byte), encryption (48 bytes) or Reed-Solomon parity, so the largest message you can hide is 313 bytes without a password and 265 with one. If the read-back check fails the encoder doubles the spreading factor (up to 8,192 frames per bit), so a carrier that needs a higher factor holds less. Echo Hiding holds 318 bytes and Phase Coding 76 bytes.
A note on units: 661,496 bytes is 646 KiB. The capacity meter on the tool divides by 1,024 and labels the result "KB", so it shows about 646 KB where this page says 661,496 bytes (about 661 kilobytes in decimal units). Capacity is the space for what the encoder embeds, which includes anything added before embedding: AES-256-GCM adds 48 bytes (a 4-byte length, a 16-byte salt, a 12-byte IV and a 16-byte authentication tag), the filename wrapper adds a few bytes for a file, and Reed-Solomon adds 10, 20 or 30 parity bytes to every block of up to 223 bytes plus a small header. Spread Spectrum also stores an 8-byte header describing its settings, which the 314-byte figure already excludes.
Self-Check: The Encoder Reads Back What It Wrote
After embedding, the tool decodes its own output with the Audio Extractor's decoding routines — without the Extractor's shifted-start search, so it only accepts a file that reads back exactly as written — and compares the result to what it meant to hide. If they differ, you get a clear error instead of a file that silently cannot be decoded. For Spread Spectrum this check drives the settings: the encoder starts at the minimum spreading factor of the selected profile (1,024 sample frames per bit for Lossy-safe, 256 for High capacity) and, if the read-back fails, doubles it step by step, up to 8,192, until the payload reads back exactly. A higher factor means lower capacity. The factor is written into an 8-byte header together with the length and a checksum; because that header is itself spread at that factor, the Extractor tries each factor from 256 to 8,192 with your seed and accepts the one whose header agrees.
Encryption and Error Correction
Without a password the payload is embedded as-is and anyone who finds it can read it. With one, it is encrypted first — see "How Strong Is the Encryption?" below for the exact scheme and its limits.
Reed-Solomon error correction is optional. RS-10, RS-20 and RS-30 add 10, 20 or 30 parity bytes per block and can repair up to 5, 10 or 15 corrupted bytes in each block; if a block has more damage than that, decoding almost always stops with an error. Very rarely, damage beyond the limit can look like a different valid block and decode to wrong bytes. In our simulation (20,000 random trials per level, changing one byte more than the level's limit inside one block) the decoder reported failure every time and never returned wrong bytes; we make no claim for other damage patterns, and over-limit damage can in principle produce either a decoding failure or an incorrect result. Order matters: the payload is Reed-Solomon coded first and the result is then encrypted, so on extraction the password check comes first and Reed-Solomon second. With a password, any damage to the extracted bytes makes the AES-GCM check fail before Reed-Solomon can repair it, so Reed-Solomon helps only payloads hidden without a password; and because AES-GCM authenticates the encrypted bytes before Reed-Solomon decoding, it cannot detect an incorrect Reed-Solomon correction made afterwards (a limitation of the current processing order). Without a password it can repair scattered errors in the extracted payload when the embedding method still lets the payload be extracted; it does not make a lossy conversion safe by itself. It cannot rescue LSB data from MP3 compression, which damages nearly every sample rather than a few.
What the Seed Is For
Spread Spectrum uses a numeric seed to generate its pseudo-random pattern, and the decoder must use the same seed. The default is 42, which the Audio Extractor's Auto-Detect tries automatically. A different seed means you must enter it by hand when decoding, in the Extractor's Forensic mode. A seed is a 32-bit number, so it is a convenience and a mild obstacle, not a substitute for a password — use encryption for secrecy.
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.
Measured Test Matrix: Does the Payload Survive Conversion?
Each row hides a 25-byte message with that method (no password, seed 42; passed straight to the encoder, so without the 1-byte flag the web page adds), converts the WAV with a real encoder, decodes the result with this tool's own extractor, and compares the bytes. ✓ = recovered exactly, ✗ = not recovered, 'refused' = the encoder would not produce the file. Encoders: FFmpeg (WebAssembly) libmp3lame, native AAC and libvorbis. Carriers: 60 s, 44.1 kHz, stereo, 16-bit — computer-synthesised speech, a 6-second music loop repeated to 60 s, and a 13-second ambient track repeated to 60 s (so the music and ambient audio repeats). The converted audio was decoded with codec delay removed, as FFmpeg does. One message, one seed and three carriers is a small sample, so read ✓ as 'worked in this test', not 'always works'. Opus is in the second table.
| Method | Carrier | No conversion | MP3 320k | MP3 128k | AAC 256k | AAC 128k | Vorbis 160k |
|---|---|---|---|---|---|---|---|
| LSB 1-bit | Speech | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Phase Coding | Speech | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Spread · Lossy-safe | Speech | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ |
| Spread · High capacity | Speech | ✓ | ✗ | ✗ | ✓ | ✗ | ✗ |
| Echo Hiding | Speech | refused | – | – | – | – | – |
| LSB 1-bit | Music | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Phase Coding | Music | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Spread · Lossy-safe | Music | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Spread · High capacity | Music | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Echo Hiding | Music | refused | – | – | – | – | – |
| LSB 1-bit | Ambient | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Phase Coding | Ambient | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Spread · Lossy-safe | Ambient | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Spread · High capacity | Ambient | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Echo Hiding | Ambient | refused | – | – | – | – | – |
Measured Test Matrix: Opus (Voice-Message Codec) and a Second AAC Encoder
Same idea, different tools: a 29-byte message (no password, seed 42), 48 kHz stereo 16-bit carriers of about 45 seconds (computer-synthesised speech, and six macOS system sounds tiled to 40 seconds), converted with Apple's CoreAudio encoders through macOS afconvert, then decoded with this tool's Auto-Detect. This is Apple's Opus encoder, not libopus, and not the encoder inside any messaging app. Opus runs at 48 kHz (macOS would not encode Opus from 44.1 kHz audio), so a 44.1 kHz recording is resampled before Opus, which changes every sample. With the Opus decoder's output aligned to the original at lag 0, the speech sample came back at only about 8.6 dB signal-to-noise: Opus does not keep the waveform, so failures here are not a timing shift. Repeat with `npm run test:codec:audio-opus` (macOS).
| Method | Carrier | No conversion | Opus 16k | Opus 24k | Opus 32k | Opus 64k | Opus 96k | AAC 128k (Apple) |
|---|---|---|---|---|---|---|---|---|
| LSB 1-bit | Speech | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Phase Coding | Speech | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ |
| Spread · Lossy-safe | Speech | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Spread · High capacity | Speech | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| LSB 1-bit | System sounds | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| Phase Coding | System sounds | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ |
| Spread · Lossy-safe | System sounds | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ |
| Spread · High capacity | System sounds | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✓ |
Examples
Input: 30-second 44.1 kHz stereo 16-bit WAV + the 10-character text FLAG{demo}, LSB 1-bit, both channels
Result: A WAV of identical length. The web page adds a 1-byte filename flag to every payload, so the text is 11 bytes; with the 4-byte length that is 15 bytes = 120 bits, written to the lowest bit of the first 120 samples — the first 60 frames, about 1.4 ms.
Meaning: The rest of the file is untouched. Anyone can read it back with any LSB tool, and it is generally gone after a lossy conversion. Source: arithmetic from the capacity formula and lib/payloadFilename.ts.
Input: The same WAV and message, now with a password
Result: The 11-byte wrapped payload grows to 59 bytes (+48 for AES-256-GCM) before embedding.
Meaning: The extracted bytes are random-looking ciphertext until the correct password is supplied. Source: in a direct test of the encryption function, a 41-byte payload came out as 89 bytes.
Input: A 25-character message, Spread Spectrum, Lossy-safe profile, 60-second speech recording
Result: 26 bytes with the filename flag + the 8-byte header = 34 bytes = 272 bits, spread over 1024 samples each: 278,528 samples, about 6.3 seconds of the file.
Meaning: The encoder decoded its own output before offering the download. Source: on the 60-second speech, music and ambient recordings in the test matrix below, the Lossy-safe profile settled on 1024 sample frames per bit and the High-capacity profile on 256, and the 25-byte test payload survived MP3 128 and 320 kbps, AAC 256 kbps and Vorbis 160 kbps.
Input: A 41-character message, Phase Coding, 30-second 44.1 kHz stereo file
Result: Refused with the message: "Payload too large for PHASE on this audio file. Needs 42 bytes, capacity is 36 bytes." (42 bytes = the text plus the 1-byte flag. Convention: 44.1 kHz stereo, one bit per 4,096-sample block of channel 0, a 32-bit length header. 30 s × 44,100 = 1,323,000 frames = 322 whole blocks = (322 − 32) ÷ 8 = 36 bytes; 42 bytes plus the 4-byte length need 368 blocks = 1,507,328 frames, about 34.2 s.)
Meaning: Phase Coding is the smallest-capacity method — use a longer file, a shorter message, or Spread Spectrum. Source: the message wording is from the code; the 36-byte capacity of a 30-second stereo file was measured.
Input: A 25-byte message, Echo Hiding, speech / music / ambient recordings
Result: Refused on all three recordings with the message: "Echo Hiding could not be read back reliably from this carrier. Echo detection is weak on speech and music (cepstral peaks of the audio itself compete with the hidden echo). Try Phase Coding or Spread Spectrum, or a different carrier."
Meaning: This is the self-check working. Switch to Phase Coding or Spread Spectrum rather than shipping an unreadable file. Source: the exact text is from the encoder; the refusal on all three recordings was observed in the test run.
Input: A payload hidden without a password with Reed-Solomon, then corrupted bytes in the extracted data
Result: Two separate tests. Within the limit: across 100 separate runs on a 100-byte payload we corrupted one byte per run, at a different position each time, and all 100 runs were recovered at RS-10, RS-20 and RS-30 (up to 5, 10 or 15 corrupt bytes per 223-byte block are repairable); this tests single-byte damage only. Beyond the limit: in the simulation described under Encryption and Error Correction (20,000 random trials per level, one byte more than the limit), the decoder reported failure every time. The first test does not establish the second.
Meaning: Reed-Solomon corrects within its limit and, beyond it, almost always reports failure rather than guessing. It is not a guarantee against every pattern of damage.
How the Encoder Works
1. Parse
The WAV header is read to find the sample format, channel count and where the audio data starts. MP3 files are decoded to 16-bit PCM by the browser's Web Audio API first.
2. Prepare the payload
Your text or file is given a small filename wrapper, optionally Reed-Solomon coded, then optionally encrypted with AES-256-GCM (in that order, so Reed-Solomon sits inside the encryption).
3. Embed
LSB overwrites low bits; Phase Coding forces the sign of the real part of the first non-zero-frequency FFT bin (about 10.8 Hz at 44.1 kHz) per 4096-sample block; Echo Hiding adds a short echo per 1024-sample block; Spread Spectrum adds a seeded pseudo-random pattern whose level follows the audio's loudness.
4. Verify
The encoder runs the real extractor on its own output and compares the bytes. Spread Spectrum raises its spreading factor until this check passes.
5. Report
The result shows the signal-to-noise ratio measured between your original and the new file, how many samples changed, and which codecs the chosen method survived in our tests.
What the results mean
| Result | What it means | What to do |
|---|---|---|
| SNR: Excellent (40 dB or more) | The new file differs from the original by a very small amount compared with the signal | No action. LSB on normal audio is typically far above this |
| SNR: Acceptable (30–40 dB) | A measurable but small difference | Fine for most uses; listen to quiet passages if it matters |
| SNR: under 30 dB | A comparatively large measured difference that may be audible, depending on the recording and the algorithm (for example Echo Hiding or a very quiet carrier). Listen to the output, especially in quiet passages | Use a louder or longer carrier, or a different algorithm |
| Samples modified | How many sample values actually changed | Small for short LSB payloads; large for Phase, Echo and Spread, which touch whole blocks |
| Spreading factor | Spread Spectrum only: samples used per bit, chosen by the self-check | Higher means more robust and less capacity |
| Encoder refused the file | The self-check could not read the payload back, or it does not fit | Use a longer 16-bit file, a smaller payload, or a different algorithm |
Limitations
- The output is always a WAV file. Hiding data in an MP3 file's own structure is a different technique — use the MP3 Steganography Embedder.
- LSB payloads are generally not recoverable after lossy audio conversion, because the encoding changes the sample values that carry the hidden data. If you need to test recovery after a conversion, use Phase Coding or Spread Spectrum.
- Survival figures come from our own tests with FFmpeg's MP3, AAC and Vorbis encoders on speech, music and ambient recordings. Spread Spectrum (Lossy-safe) failed on speech after AAC 128 kbps. "Lossy-safe" is the name of a profile (a higher minimum spreading factor and a stronger signal), not a guarantee: results varied by codec, bitrate and recording, so always convert the file and extract from the converted copy before relying on it. Opus, the codec behind WhatsApp and Telegram voice messages, was tested only with Apple's CoreAudio encoder (second table below): none of the four methods survived it at 16–96 kbps. libopus, messaging apps and streaming services were not tested, and services may apply their own processing. The matrix was decoded with the codec's start delay removed, as FFmpeg does. If a decoder leaves that padding in place, the Extractor searches for the shifted start (Phase Coding and Spread Spectrum, up to about 8,000 samples); the repository's tests cover shifts of 576, 1,105 and 2,112 samples, but not every real-world decoder. Resampling (for example 44.1 to 48 kHz) changes the samples themselves and is not handled.
- Echo Hiding is unreliable on speech and music, and is audible on its own: its echo sits only about 9 dB below the audio inside the blocks it modifies (a calculation from the fixed 0.35 echo level; the whole-file SNR the tool reports is higher because only part of the file changes). The encoder refuses carriers it cannot read back.
- Phase Coding writes a component near 10.8 Hz at no less than about −48 dBFS, which is below normal hearing and most speakers, but a spectrum analyser will show it. Spread Spectrum adds noise-like energy around 6% of the local loudness in the Lossy-safe profile and is not undetectable.
- 8-bit WAV files are very coarse, and Spread Spectrum and Phase Coding often fail their self-check on them; use 16-bit or higher. WAV formats other than integer PCM (for example IEEE float) are rejected — re-export as PCM.
- A WAV whose header declares more audio than the file holds (a cut-off download, or streamed output whose size field is 0xFFFFFFFF) is read up to the whole frames that really exist; the duration and capacity shown are for those frames.
- Maximum file size is 500 MB on desktop and 50 MB on mobile. An MP3 expands about 10× when decoded to PCM, so large MP3s need a lot of memory.
- Not tested: libopus and any real messaging app, streaming service or social site; listening tests with people; steganalysis tools such as Aletheia against these methods; editing in an audio editor (trimming, fades, volume changes, noise reduction); resampling; WAV files of more than two channels beyond LSB; how long key derivation takes on phones.
- Steganography hides that a message exists; it is not a replacement for encryption. Anyone who suspects a file can run statistical tests such as chi-square analysis against it — see the Steganography Detector.
Privacy
Your audio and payload are processed in your browser, in a Web Worker, and are not sent to a StegoToolkit upload server. The encoded file is created on your device and downloaded from it. Usage analytics are separate (cookieless page views, plus tool events only if you accept cookies) and record which options you choose (such as the algorithm), coarse facts about the file such as its type and size and duration ranges, and how long processing took — never the audio, the payload, a filename or a password. Your display mode preference is kept in this browser's localStorage.
Which Tool Next?
- Audio Steganography Extractor — Read back what you just hid
- WAV Steganography Hider — A WAV-specific tool with RIFF-chunk and spectrogram methods
- MP3 Steganography Embedder — Hide data inside an MP3 file's own structure
- Steganography Detector — Test whether a file shows signs of hidden data
Frequently Asked Questions
How do I hide a message or text in an audio file?
Upload a WAV (or an MP3, which is decoded to a WAV first), type the message or attach a file, pick LSB Audio if the file will stay a WAV or Phase Coding / Spread Spectrum if you need to test recovery after a conversion to MP3, optionally add a password, and click Encode. You download a new WAV; the tool reads it back with its own extractor before offering it. Open the Audio Steganography Extractor to read the message again.
Will the audio sound different after encoding?
For LSB at 1 bit on normal 16-bit audio, the change is far below audibility — the tool reports the measured signal-to-noise ratio for your file. Phase Coding adds a component near 10.8 Hz at no less than about −48 dBFS. Spread Spectrum adds low-level noise that follows the audio's loudness. Echo Hiding is the audible one: its echo sits only about 9 dB below the audio in the blocks it modifies. The SNR figure on the result page is measured, not estimated.
Which algorithm should I use?
LSB Audio if the file will stay a WAV and you want the most room. Phase Coding or Spread Spectrum if you need to test recovery after a conversion to MP3, AAC or Vorbis. Echo Hiding is experimental and refused on all three of our test carriers.
What audio formats can I use?
PCM WAV at 8, 16, 24 or 32 bits, mono or stereo, and MP3. An MP3 is decoded to 16-bit WAV in your browser using the Web Audio API, and the output is a WAV. Convert FLAC or OGG to WAV first. Floating-point WAV is not supported.
Is my audio uploaded anywhere?
No. Encoding runs in your browser in a Web Worker, using the Web Crypto API for encryption. The file is not sent to a StegoToolkit upload server.
How much data can I hide?
It depends on the algorithm and the length of the audio. For one minute of 44.1 kHz stereo, in bytes of raw capacity: LSB 661,496 at 1 bit (both channels), Spread Spectrum (Lossy-safe) up to 314, Echo Hiding 318, Phase Coding 76. The capacity meter shows the exact figure for your file, in units of 1,024 bytes, so it displays the LSB figure as about 646 KB. Each figure is counted after that method's own header (a 32-bit length for LSB, Echo and Phase Coding, the 8-byte header for Spread Spectrum) and before the filename flag (1 byte), encryption (+48 bytes) and Reed-Solomon parity, which come out of that space; see "Capacity: What Fits in How Much Audio" for the conventions.
What is the Spread Spectrum seed?
A number that generates the pseudo-random pattern the data is spread with. The decoder needs the same seed; the default is 42, which Auto-Detect tries automatically. It is a 32-bit value, so treat it as a convenience, not as a second password.
How do I decode the result?
Open the Audio Steganography Extractor, upload the encoded WAV, leave it on Auto-Detect (or choose the same algorithm), and enter the password if you used one.
What does Reed-Solomon error correction do here?
It adds parity bytes so scattered corrupted bytes in the extracted payload can be repaired: up to 5, 10 or 15 per block for RS-10, RS-20 and RS-30. If a block has more errors than that, decoding almost always reports failure. Over-limit damage can in principle be mistaken for a valid correction. In our simulation (20,000 random trials per level, changing one byte more than the level's limit inside one block) the decoder reported failure every time and never returned wrong bytes; we make no claim for other damage patterns, and over-limit damage can in principle produce either a decoding failure or an incorrect result. With a password it cannot help: the payload is Reed-Solomon coded before it is encrypted, so damage to the extracted bytes fails the AES-GCM check first, and the tag cannot detect a wrong Reed-Solomon correction made after it. Without a password it can repair a few scattered errors in the extracted payload of a Phase Coding or Spread Spectrum file, as long as the payload can still be extracted; it does not help LSB data, which a lossy conversion destroys wholesale.
Will the hidden data survive converting to MP3?
LSB data will not. In our tests with real MP3, AAC and Vorbis encoders on speech, music and ambient recordings, Phase Coding was decoded exactly after every tested conversion (MP3 128 and 320 kbps, AAC 128 and 256 kbps, Vorbis 160 kbps, and Apple's AAC 128 kbps in the second table). Spread Spectrum (Lossy-safe profile) was decoded exactly after MP3 128–320 kbps, AAC 256 kbps and Vorbis 160 kbps, but failed on speech after AAC 128 kbps. Opus did not work in our test: with Apple's Opus encoder at 16–96 kbps none of the four methods was recovered, Phase Coding and Spread Spectrum included, so do not rely on any of them for a voice message. Always decode a converted copy yourself before relying on it.
Can audio steganography be detected?
Yes. LSB changes can be found with statistical tests such as chi-square at high capacity. Phase Coding and Spread Spectrum leave a faint low-frequency tone or low-level noise-like energy that a spectrum analysis can show. None of the methods is undetectable. Encrypting the payload hides what it says, not that it exists.
Related Tools
Audio Steganography Extractor
Extract hidden text or files from WAV or MP3 audio. Auto-detect tries ten common LSB, Echo, Phase and Spread Spectrum settings; AES-256 decryption; CTF flag highlighting. Processed in your browser.
Steganography Capacity Calculator
Calculate exact hidden-payload capacity for PNG, BMP, WebP, WAV, FLAC, AIFF and more — plus PSNR and detection risk, all client-side. Links to the right specialist hider/extractor for your file type.
MP3 Steganography Embedder
Hide secret text in MP3 files using ID3v2 tag, frame padding, or part2_3_length parity (MP3Stego-style). AES-256. No upload. 100% client-side.
MP3 Steganography Extractor
Extract hidden messages from MP3 files. Auto-detects ID3v2, frame padding, and parity methods (MP3Stego-style). CTF flag detection. No upload.