BMP Steganography Extractor
Extract hidden data from BMP files made by the BMP Steganography Hider. Auto-detect covers pixel LSB (1 to 4 bits), palette LSB and reserved bytes; Forensic mode takes exact settings.
Try the demo instantly
Loads a BMP with a hidden message already embedded
Drop a BMP here or click to browse
Uncompressed BMP (8, 24 or 32-bit) · Max 50 MB
Processed in your browser
Your BMP is read and changed in this browser tab. The file itself is never sent to a server.
How to Extract Hidden Data from a BMP (4 steps)
- Upload the BMP image that may contain hidden data
- Pick a mode: Quick runs Auto-Detect; Standard lets you choose the method; Forensic adds bit depth, channels, pixel order and seed
- Enter the password if the data was encrypted
- Click Decode to extract the hidden payload
BMP Extraction Methods — What Auto-Detect Tries
| Method | Technique | Auto-Detect Scope | Best For |
|---|---|---|---|
| Pixel LSB | Reads the lowest bits of the colour bytes of each pixel in file order or a seeded order, then looks for the 4-byte length and the STGB header | Auto-Detect tries 1, 2, 3 and 4 bits on R+G+B in sequential order; anything else needs Forensic mode | Files made by the BMP Steganography Hider |
| Palette LSB | Reads the lowest bits of the blue, green and red bytes of each colour-table entry | Auto-Detect tries 1 bit; 2 to 4 bits need Forensic mode | 8-bit indexed BMPs |
| Reserved Bytes | Reads the length byte and up to 3 data bytes from the file header's reserved fields | Up to 3 bytes | Tiny hints and CTF challenges |
What This Extractor Can and Cannot Read
This Extractor reads data written by the BMP Steganography Hider. Pixel LSB and Palette LSB data use one layout: a 4-byte little-endian length, then (normally) a header starting with the bytes STGB, then the payload, with bits stored lowest-first. Data written by another BMP tool uses a different layout, so this Extractor will not read it even if it is also LSB-based. For other LSB layouts try the LSB Extractor or a general tool such as zsteg or StegSolve.
Reserved Bytes is a separate, much smaller layout and does not follow the one above: the BMP file header's reserved bytes 6 to 9 hold one length byte (1 to 3) and up to 3 data bytes, with no 4-byte length, no STGB signature and no encryption.
BMP pixel data is physically stored in B, G, R (and A) byte order. The Extractor takes the selected channels in the fixed order R, G, B, Alpha inside each pixel, the same order the Hider uses, and visits pixels in file order (a bottom-up BMP's bottom row first) or in the seeded shuffle for Random order. Palette LSB instead reads each colour-table entry's bytes in file order: blue, green, red.
A BMP must be uncompressed. RLE-compressed files and 32-bit BMPs with unusual colour masks (not the standard BGRA layout) are rejected; 32-bit BMPs with standard BI_BITFIELDS masks are read like ordinary 32-bit files.
What Auto-Detect Tries, and What Counts as Success
Quick mode runs Auto-Detect: Pixel LSB at 1, 2, 3 and 4 bits (R+G+B, sequential order), Palette LSB at 1 bit, and Reserved Bytes, in that order. It skips Palette LSB if the BMP has no colour table and Pixel LSB for BMPs under 8 bits per pixel. It does not try 6 or 8 bits, a different channel selection (for example Blue only), a random pixel order, or Palette LSB at 2 to 4 bits, because the header that records those settings can only be read after the bits have been found with the right settings. In our tests a file hidden with random order, with Blue only, or at 6 bits was not found by Auto-Detect and was recovered immediately in Forensic mode with matching settings.
An attempt counts as a success in two steps. First the bits must start with a plausible length: more than zero and no larger than the image can hold (Reserved Bytes instead needs its length byte to be 1, 2 or 3). Then the extracted bytes are checked. If they begin with the STGB signature (the four bytes S-T-G-B followed by a version byte of 1 or 2; there is no checksum, so this is about a 1 in 2 billion coincidence), the attempt is accepted as a real Hider file even when its payload is low-entropy or mostly unprintable (for example a file of zeros) and everything after it (error correction, decryption) is reported honestly, including "Data is encrypted. Please provide a password." or a failed decryption. If there is no signature, the bytes are still accepted unless they look like noise (fewer than 30% printable characters and a byte entropy below 3 bits), and the result page then shows a warning that no STGB signature was found.
That second path can produce false positives. For a random-looking image, the chance that a random 32-bit length happens to fit inside an 800 × 600 image at 1 bit (180,000 bytes) is about 180,000 ÷ 2^32, roughly 1 in 24,000 per attempt, if the low bits were random; real images are not random and smaller images have worse odds. Reserved Bytes is more exposed, because any BMP whose reserved byte 6 is 1, 2 or 3 matches. Treat any result without the signature notice cleared as unconfirmed.
Forensic Mode: Entering the Exact Settings
In Forensic mode, choose the method, then set the bit depth (Pixel LSB: 1, 2, 3, 4, 6 or 8; Palette LSB: 1 to 4). For Pixel LSB you also choose the channels (R, G, B, and Alpha on 32-bit files) and the pixel order. If the order is Random (seeded), enter the seed number the Hider showed after encoding. A wrong seed does not produce an error message of its own: you get unreadable data or a "payload length" error, the same as any wrong setting.
The Forensic mode switch "Plausible deniability payload" is for BMPs made with the Hider's headerless option: there is no STGB signature to find, so it must be told the exact method and settings. The separate "Plausible Deniability Decode: Decoy + Real Payload" section tries the two-layer scheme: it always shows the decoy (red channel) and, if you enter the passphrase, the real payload (green channel).
Passwords and Encrypted Payloads
If the payload was encrypted, the Extractor needs the same password. A result whose bytes look random (entropy above 7.4 bits per byte, or the layout of an encrypted payload) is reported as "Possibly encrypted or compressed data". That is a clue, not proof: compressed data looks the same, and this label does not mean the payload really is encrypted.
The password is turned into a key with PBKDF2-HMAC-SHA-256 (100,000 iterations) and the salt stored in the payload, and the AES-256-GCM authentication tag then checks it. A wrong password and a damaged payload both simply report failure, so the tool cannot tell you which it was, and there is no way to recover a forgotten password. The full description, including what this scheme does not protect, is on the BMP Steganography Hider page.
Which Settings Auto-Detect Finds (tested)
Each row is one unit-test case on a 64 × 64 24-bit test image with a 19-byte message, encoded by this tool's Hider and decoded by the same functions the Extractor uses.
| How the file was made | Quick mode (Auto-Detect) | Forensic mode with matching settings |
|---|---|---|
| Pixel LSB, 1 bit, R+G+B, sequential | Found | Found |
| Pixel LSB, 2, 3 or 4 bits, R+G+B, sequential | Found | Found |
| Pixel LSB, 6 bits, R+G+B, sequential | Not found | Found |
| Pixel LSB, 1 bit, Blue only | Not found | Found |
| Pixel LSB, 1 bit, random order with a seed | Not found | Found with the same seed; a different seed or sequential order fails |
Examples
Input: A BMP made by the Hider with defaults (Pixel LSB, 1 bit, R+G+B, sequential, no password), Quick mode
Result: The Extractor reads the first bits, finds the STGB header, and shows the text. The Result stats list Method PIXEL LSB, Bit depth 1-bit, Encryption None.
Meaning: This is the case Auto-Detect is built for. Source: the bmp unit-test round trips and the Extractor's result view.
Input: A BMP made with the "Smallest change" preset (1 bit, R+G+B, random order, seed shown on the Hider's result screen)
Result: Quick mode ends with an error from its last attempt, for example "No valid data in reserved bytes". In Forensic mode: Pixel LSB, 1-bit, Random (seeded), seed from the Hider → the message appears.
Meaning: Random order is not auto-detectable. The seed is the key to the order, so keep it with the file. Source: unit tests with seed 987654 (right seed finds it; 987655 and sequential order do not).
Input: A 256-colour 8-bit BMP hidden with Palette LSB at 2 bits
Result: Auto-Detect reads Palette LSB at 1 bit and fails. Standard or Forensic mode with Palette LSB selected and Forensic bit depth 2 reads it.
Meaning: Palette LSB bit depths above 1 need Forensic mode. Source: bmpDecode.ts auto-detect list.
Input: A payload that decodes to random-looking bytes
Result: The result shows "Possibly encrypted or compressed data" with the entropy figure, or "Unrecognized Data" if it looks like noise.
Meaning: Entering the right password turns an encrypted payload into the original. If a password is not involved, the settings probably do not match what the Hider used. Source: the interpretation rules in lib/payloadInterpret.ts (entropy above 7.4 → encrypted; printable text under 6 bits entropy → text).
How the Extractor Works
1. Parse
The file and DIB headers are read for the size, bit depth, compression, colour count and where the pixel data and colour table start. Compressed BMPs are rejected.
2. Extract bits
For the chosen method, the lowest bits are read in the same order the Hider writes them: the selected colour channels of each pixel in the fixed order R, G, B (then Alpha) — the logical order, even though a BMP physically stores the bytes as B, G, R — with pixels visited in file order or in a shuffle driven by the seed. Palette LSB reads each colour-table entry in file byte order (B, G, R) and Reserved Bytes reads the four header bytes directly.
3. Find the header
The first 32 bits are a length (Reserved Bytes instead reads one length byte); the bytes that follow should start with STGB. A valid header says the method, bit depth, whether the data is encrypted, and (for Pixel LSB) the channels, order and seed that were used.
4. Decode and decrypt
The payload is taken out of the Reed-Solomon wrapper if one was used (repairing changed bytes up to its limit), then decrypted with your password if the header says it is encrypted.
5. Interpret
The bytes are classified as text, a known file type (by its magic bytes), encrypted-looking data, other binary or noise, and CTF-style flags are highlighted.
What the results mean
| Result | What it means | What to do |
|---|---|---|
| Text | Mostly printable characters with low entropy | Read or copy it |
| File | A known file signature (for example PNG, ZIP, PDF) was found at the start | Download it; the original filename is not stored, so you get a guessed extension |
| Possibly encrypted or compressed data | High entropy or the layout of an encrypted payload. A clue, not proof | Go back and enter the password; if none was set the data may just be compressed |
| No STGB signature was found (amber notice) | The bytes passed a length check and did not look like noise, but no header confirmed them | Treat as unconfirmed. Try Forensic mode with exact settings, or the file may not come from this tool |
| Unrecognized Data | Low-entropy, mostly non-printable bytes | Check bit depth, channels, order and seed; the file may use another tool's layout |
| Data is encrypted. Please provide a password. | The header says the payload is encrypted and no password was given | Enter the password |
| Decryption failed - wrong password or corrupted data | Wrong password or the data was altered | Retry. The tool cannot tell which; there is no password recovery |
| Invalid payload length in pixel LSB data | The first 32 bits do not describe a length that fits in the image: nothing was written with these settings | Try other settings in Forensic mode, or the BMP has no hidden data |
Limitations
- The Extractor only reads this tool's format. It does not read other tools' hidden data, and it cannot read a BMP that was re-saved, converted to JPEG, or resized after hiding.
- Auto-Detect covers a small set of settings (see above). A file hidden with other settings looks empty to Quick mode. That is not proof nothing is hidden.
- The tool cannot tell a wrong password from a damaged payload, and a forgotten password cannot be recovered.
- Compressed BMPs (RLE) and 32-bit BMPs saved with colour masks (BI_BITFIELDS) are rejected. Re-save as an uncompressed BMP only if you are sure that is the same pixel data.
- To check whether an image contains hidden data at all, use the Steganography Detector or the Steganography Analyzer. Their statistical tests are not specific to this tool, and a negative result is not proof.
Privacy
Your BMP is read in your browser, in a Web Worker, and is not sent to a StegoToolkit upload server: the BMP code makes no network requests. The extracted payload and any password stay on your device. Page views are counted by Vercel Analytics, which is cookieless. Tool events (the options you choose such as the method, bit depth, channels, pixel order or error-correction level; the file's type and a size range; and how long processing took) are sent to Google Analytics only if the site has it configured and you accepted analytics cookies. The code does not pass the image, the extracted data, a password, the seed number or the filename to analytics, and a filter drops fields with names such as password, payload, data or filename before anything is sent. If you accept cookies, the site may also load advertising and other analytics scripts that are outside this tool's code. Your display mode preference is kept in this browser's localStorage. As on any website, the host keeps ordinary request logs for loading the page (IP address, URL, browser); because the file is never uploaded, the image, payload and password are not part of any request.
Which Tool Next?
- BMP Steganography Hider — Hide a message in a BMP
- LSB Extractor — Read LSB data from PNG and other images
- Palette Steganography Extractor — Palette-based extraction for GIF, indexed PNG and 8-bit BMP
- Steganography Detector — Test whether an image shows signs of hidden data
- Steganography Analyzer — Look at bit planes and statistics when you do not know the method
Frequently Asked Questions
How does auto-detect work?
Auto-detect tries Pixel LSB at 1, 2, 3 and 4 bits (R+G+B, sequential order), then Palette LSB at 1 bit, then Reserved Bytes, and stops at the first attempt that passes a length check and either carries this tool's STGB signature (always accepted) or, without a signature, does not look like noise: fewer than 30% printable characters and entropy below 3 bits count as noise (the result page warns when the signature is missing, because such a result can be a coincidence). A valid signature followed by a missing or wrong password is reported as exactly that. It does not try 6 or 8 bits, other channel selections, random pixel order or Palette LSB above 1 bit.
What if I know the settings used?
Switch to Forensic mode, pick the method and set the bit depth. For Pixel LSB also set the channels and the pixel order; if it was Random (seeded), enter the seed number the Hider showed.
The decoder says encrypted but I don't have a password?
The data was encrypted with AES-256-GCM. Without the password you only see ciphertext. The tool cannot recover a lost password, and cannot tell a wrong password from a damaged payload.
Can this extract data hidden by other BMP stego tools?
Not in general. It reads the layout its own Hider writes (4-byte length, STGB header, lowest-bit-first). Another tool's LSB layout is different, so the result will be unreadable. Try the LSB Extractor or a general tool such as zsteg or StegSolve.
Why does extraction fail for compressed BMPs?
RLE-compressed BMPs and 32-bit BMPs saved with colour masks (BI_BITFIELDS) store pixels in a form this tool does not read. Only plain uncompressed BMPs are accepted.
I see random data. How do I know if something is hidden?
Random-looking bytes can be encrypted or compressed data (entropy above about 7.4 bits per byte is reported as encrypted-looking), or a sign that the bit depth, channels, order or seed is wrong. Try the password first, then other settings in Forensic mode. To test whether a file is likely to contain hidden data at all, use the Steganography Detector.
Where do I enter the seed for random pixel order?
In Forensic mode, choose Pixel LSB, then Pixel Order → Random (seeded). A seed field appears. The seed was shown on the Hider's result screen and in its exported config.json.
Related Tools
BMP Steganography Hider
Hide text or files inside BMP images using pixel LSB, palette, or reserved field methods. Optional AES-256 encryption. Original, encoded and difference views after encoding.
Image Steganography Extractor
Extract hidden messages from steganographic image files. Auto-detect mode, bit plane analysis.
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.