StegoToolkit

WAV Steganography Extractor

Extract hidden text or files from WAV audio. WAVSTEG auto-detect, RIFF chunk inspector, DeepSound signature detection, spectrogram analysis, 13-setting ranked guess, CTF flag detector. Processed in your browser, not uploaded.

WAVSTEG auto-detect
DeepSound + Spectrogram analysis
Flag detector

Before uploading: share the output only as a file attachment (email, cloud storage, Discord file). Services that re-encode audio to a lossy format (YouTube, streaming services, most messaging apps) can change sample values and corrupt LSB data or prevent its recovery; individual services have not been tested.

Try demo — extract hidden message instantly

Loads a short sample WAV — no upload needed

Drop a WAV file here

PCM integer or IEEE float — MP3/ADPCM not supported

Processed in your browser

Your audio is processed in this browser tab and not sent to a server. Usage statistics may record which options were used, never your audio.

How to Extract Hidden Data from a WAV File (5 steps)

  1. Upload the WAV file to check (16-bit PCM is best; other sample sizes are converted to 16-bit for reading).
  2. Click Extract. A file made by the WAV Hider is read instantly through its 20-byte header.
  3. No header? Forensic mode shows the Samples, Chunks, Spectrogram and DeepSound tabs, and the Extractor ranks 13 header-less reading settings, including the real stego-lsb layout.
  4. Enter the passphrase if the payload was encrypted; PRNG files made with a passphrase also need it to find the right samples.
  5. Copy the text or download the hidden file.

WAV Steganography Decoding — What This Tool Handles

MethodTechniqueWhen to UseBest For
WAVSTEG headerReads the 20-byte header from the lowest bit of the first 160 samples and checks its CRC-32Files made by this tool's HiderInstant, no settings; confidence score 97 out of 100 (a score, not a probability; a successful header read scores 97, a header-less guess at most 92) when the header, password and length check out
Ranked header-less scanReads up to 4,096 bytes with each of 13 listed settings (11 distinct reads) and ranks them by how readable they areFiles with no headerA guess, not proof. Finds messages of 10+ readable characters (14+ when they include non-ASCII text), a flag, or a file signature; shorter ones need Manual mode
stego-lsb layoutOne of the 13 settings: bit 8 of each sample, most-significant-bit first, from sample 0Files made by the real stego-lsb (WavSteg) programTested against stego-lsb 1.7.2 in both directions
DeepSound markerLooks for a LIST chunk containing 'DeepSound' or 'INFOSOFTWARE'CTF files that carry the markerOnly a marker; it does not decode DeepSound's own format

How the Extractor Decides What It Found

First it reads the lowest bit of the first 160 samples and checks for the WAVS header and its CRC-32. A valid header gives the method, bit depth, channels, password flag and length, so nothing needs to be configured. If the payload was encrypted you are asked for the passphrase. Decryption either succeeds or fails authentication, and a wrong passphrase and damaged encrypted data give the same failure, so you get an error rather than unauthenticated garbage text.

Without a header the Extractor reads 13 listed settings and scores each by how readable the result is: a file signature of 3 or more bytes, flag shapes, printable text. Three of the listed settings (the plain 1-bit both-channel read, the 'DeepSound 2.x format' entry and the 'interleaved L/R' entry) read exactly the same samples, so there are 11 distinct reads. A result is shown only if it passes a plausibility check, which helps reject implausible results; none of the seven clean recordings was reported as carrying a message, but see the false-positive rate below.

What the Scan Can and Cannot Find

In our tests (npm run test:measure:scan:wav), 70 of 70 header-less messages (a 25-character flag and a 38-character sentence, each hidden with five of the listed settings: 1 bit on both, left and right channels, 2 bits and 3 bits on both, in seven real recordings: five macOS system sounds, one of them mono, and one speech clip) were returned by the ranked scan, and none of the seven clean recordings was reported as carrying a message. A wider run of 12 sentences gave 420 of 420. These results apply to the tested messages, carriers and settings; they do not measure how often arbitrary WAV files or unknown methods are found. An earlier version of the scoring ranked the single-channel read of a message hidden on both channels (every second bit, which looks like capital-letter gibberish) above the true read in 1 of 420; the score now rewards text-like opening runs.

It cannot find messages shorter than 10 readable characters, encrypted payloads that have no header, headerless payloads whose positions depend on a passphrase, or settings outside the 13 listed. Header-based PRNG files are read when the correct passphrase is given. Manual mode overrides the header's method, bit depth and channels with the ones you choose and reads the first 4,096 bytes from sample 0. For Spectrogram it decodes tone slots from the start of the file only: there is no field for a block offset, so a spectrogram viewer can help you see where a block sits, but this Extractor can decode it only if it starts at the beginning (this tool's own Spectrogram files are found through their header). PRNG extraction requires the correct passphrase to reproduce the sample positions. Manual mode also needs the payload length: a usable header provides it, and without one this Extractor cannot determine the PRNG payload length.

The Forensic Tabs

Samples shows a chi-square test of the lowest bit (even or odd) over the first 100,000 samples, using a chi-square test with one degree of freedom. A low p-value is evidence against an even 50/50 split, but silence, synthetic audio and very quiet recordings also produce uneven bits, so it does not identify the cause. A high p-value does not establish that the audio is natural or encrypted. The test does not say whether a message is hidden. Chunks lists the RIFF chunks and marks those that are not standard. Spectrogram describes 4 to 8 kHz energy variation and DeepSound reports the marker.

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.

The 13 Header-less Reading Settings

Each reads at most 4,096 bytes and is scored; settings marked 'same read' repeat the first row.

SettingBitsChannelsStarts at
LSB 1-bit both channels sequential1bothsample 160
LSB 1-bit left only sequential1leftsample 160
LSB 1-bit right only sequential1rightsample 160
LSB 2-bit both sequential2bothsample 160
DeepSound 2.x format (same read as the first row, +10 score if a LIST chunk exists)1bothsample 160
Raw sample bit 0, no header, from sample 0 (LSB-first)1bothsample 0
LSB 1-bit both, MSB byte order (bit 15 of each sample)1bothsample 160
RIFF LIST/custom chunk payloadn/an/achunk
LSB 2-bit left only2leftsample 160
LSB 1-bit interleaved L/R (same read as the first row)1bothsample 160
LSB 3-bit both channels3bothsample 160
LSB 1-bit right only, reversed order1rightend of file
stego-lsb (WavSteg) layoutbit 8, MSB-firstbothsample 0

Examples

Input: A WAV made by this site's Hider with a passphrase, opened with the right passphrase

Result: Method, bit depth and channels come from the header; confidence 97; 'AES-GCM authenticated decryption succeeded'.

Meaning: The header CRC-32 matched and AES-GCM authenticated decryption succeeded. That supports successful recovery of the encrypted payload; it does not show who created the file.

Input: A file from the real stego-lsb program hiding 'HELLO', header-less

Result: The top ranked setting is 'stego-lsb (WavSteg) layout'; the text appears (with trailing noise because the format stores no length).

Meaning: Checked against stego-lsb 1.7.2 on mono and stereo 16-bit files.

Input: An ordinary clean recording

Result: 'No hidden payload found' with the reasons and the 13 settings listed with their scores.

Meaning: None of the settings produced a signature, a flag or 10 readable characters. This does not prove nothing is hidden.

How the WAV Extractor Works

Read the file

The WAV is parsed in a Web Worker; non-16-bit samples are converted to 16-bit numbers for reading.

Look for the header

The first 160 low bits are read and checked against the WAVSTEG layout and its CRC-32.

Extract by the header's method

LSB and PRNG read bits from samples, RIFF reads the 'steg' chunk, Spectrogram measures eight tones per byte with a Goertzel filter.

Reed-Solomon, decryption, decompression

Parity is applied, then AES-256-GCM decryption with your passphrase, then inflation if the header says the payload was compressed.

No header: rank and filter

13 settings are read and scored; only a result that passes the plausibility check is returned.

What the results mean

ResultWhat it meansWhat to do
Extraction successfulThe header passed its CRC-32 check. For an encrypted payload, AES-GCM authentication also succeeded, which verifies the ciphertext under the derived key; an unencrypted payload has no such authentication. A file hidden with its name shows the name and downloads under it.Copy or download it.
Hidden data found, but it could not be readA valid header was found but the passphrase is missing or wrong, the stored data could not be unpacked, or the header declares more bytes than the file can hold.Read the reasons listed under the heading; enter or correct the passphrase.
WAVSTEG header found but decryption failed — wrong passphrase, or the data was damagedThe payload is encrypted and the passphrase did not authenticate; a wrong passphrase and damaged data look the same.Check the passphrase; PRNG files use it for positions as well.
WAVSTEG header found, enter the passphraseThe password flag is set and none was supplied.Enter it and extract again.
No hidden payload foundNo header, and none of the 13 settings gave a signature, a flag or 10 readable characters.Try Manual mode, a spectrogram viewer, or another tool. A lossy conversion can corrupt or prevent recovery of low-bit data.
Brute-force top candidateA header-less reading passed the plausibility check. Confidence is a ranking score, not a probability.Read it; if it is partly noise, the message is shorter than the window.

Limitations

  • The ranked scan finds only 10+ readable characters (14+ with non-ASCII text), a flag or a file signature, and only in its 13 listed settings.
  • Pure random noise in the lowest bits can occasionally pass the readability check: 2 of 8,000 synthetic uniform-noise files were reported as carrying a message, none of 7 real recordings was. A result from a header-less scan is a lead to check, not proof.
  • The stego-lsb read has no length, so extra characters can follow the message.
  • Spectrogram payloads are decoded through the header; after lossy conversion the header is gone and you must find the tone block yourself.
  • The chi-square and spectrogram tabs are descriptions, not detectors.
  • Measurements used seven short files (one speech clip, five system sounds, one in both mono and stereo); other recordings may behave differently. Individual websites and apps were not tested.

Privacy

The WAV is processed in your browser tab with a Web Worker and the Web Crypto API; it is not uploaded. Usage statistics may record which options were used, never the audio, the extracted text or the passphrase. The hosting provider keeps ordinary request logs for page loads.

Which Tool Next?

Frequently Asked Questions

Can this decode DeepSound-encoded WAV files?

No. It detects a LIST chunk containing 'DeepSound' or 'INFOSOFTWARE' (the marker this tool's Hider writes), and then reads the file like any other. DeepSound's own bit-level format is not implemented, so a file made by DeepSound itself is unlikely to decode.

Can it read files made by stego-lsb (WavSteg)?

Yes, for 16-bit WAV files. The real program writes the message into bit 8 of each sample, most-significant-bit first, from the first sample, with no header and no length. The ranked scan includes that layout and, in our tests with stego-lsb 1.7.2, returned the text for mono and stereo files. Because there is no length, you may see extra characters after the message.

Does the Extractor restore the name of a hidden file?

Yes, when the file was hidden by this site's Hider with a header: the name is stored inside the hidden data, shown above the download button and used as the download's file name. Files hidden as typed text, in the stego-lsb layout, or by other programs carry no name, so they download as extracted_from_<carrier>.bin.

Why can't PRNG mode be brute-forced?

PRNG mode chooses sample positions from the passphrase. Without the same passphrase the positions cannot be reconstructed, and this tool does not guess passphrases. With no passphrase at embedding time the seed is 0, so the header-based reader finds those files without any input.

What does the Spectrogram tab show?

A description of how much the energy in the 4 to 8 kHz band changes over time, sampled over the whole file. It is not a detector: in our test on 7 recordings it scored clean speech and sound effects as high as files with hidden tones. To look for a tone message, open the file in a spectrogram viewer such as Audacity or Sonic Visualiser.

The ranked scan found nothing, but I think there is a message.

The scan reports a result only for a file signature, a flag shape or at least 10 readable characters from the start, so shorter messages, encrypted data without a header, other bit depths and shuffled orders are not found automatically. In Forensic mode choose Manual and set the method, bits per sample and channels. A message hidden with a lossy conversion in between can be unrecoverable, because the conversion rewrites the sample values that carry the low bits.

Is my audio uploaded anywhere?

No. Decoding runs in your browser tab (a Web Worker and the Web Crypto API); the audio is not sent to a server. Usage statistics may record which options were used, never your audio or passphrase.

Related Tools