GithubHelp home page GithubHelp logo

ragibson / steganography Goto Github PK

View Code? Open in Web Editor NEW
540.0 11.0 91.0 200 KB

Least Significant Bit Steganography for bitmap images (.bmp and .png), WAV sound files, and byte sequences. Simple LSB Steganalysis (LSB extraction) for bitmap images.

License: MIT License

Python 100.00%
steganography steganalysis bitmap wav

steganography's Introduction

Steganography

Steganography illustration

Table of Contents

If you are unfamiliar with steganography techniques, I have also written a basic overview of the field in Steganography: Hiding Data Inside Data.

Installation

This project is on PyPI and can be installed with

pip install stego-lsb

Alternatively, you can install it from this repository directly:

git clone https://github.com/ragibson/Steganography
cd Steganography
python3 setup.py install

Byte Sequence Manipulation

bit_manipulation provides the ability to (quickly) interleave the bytes of a payload directly in the least significant bits of a carrier byte sequence.

Specifically, it contains four primary functions:

# Interleave the bytes of payload into the num_lsb LSBs of carrier.
lsb_interleave_bytes(carrier, payload, num_lsb, truncate=False)

# Deinterleave num_bits bits from the num_lsb LSBs of carrier.
lsb_deinterleave_bytes(carrier, num_bits, num_lsb)

# Runs lsb_interleave_bytes with a List[uint8] carrier.
lsb_interleave_list(carrier, payload, num_lsb)

# Runs lsb_deinterleave_bytes with a List[uint8] carrier.
lsb_deinterleave_list(carrier, num_bits, num_lsb)

Running bit_manipulation.py, calling its test() function directly, or running stegolsb test should produce output similar to

Testing 1.0 MB payload -> 10.0 MB carrier...
Progress: [################################]
----------------------------------------
| # LSBs | Encode Rate  | Decode rate  |
| 1      | 60.6   MB/s  | 95.9   MB/s  |
| 2      | 56.6   MB/s  | 52.7   MB/s  |
| 3      | 82.5   MB/s  | 77.4   MB/s  |
| 4      | 112.4  MB/s  | 105.9  MB/s  |
| 5      | 135.9  MB/s  | 129.8  MB/s  |
| 6      | 159.9  MB/s  | 152.4  MB/s  |
| 7      | 181.7  MB/s  | 174.6  MB/s  |
| 8      | 372.8  MB/s  | 1121.8 MB/s  |
----------------------------------------

WavSteg

WavSteg uses least significant bit steganography to hide a file in the samples of a .wav file.

For each sample in the audio file, we overwrite the least significant bits with the data from our file.

How to use

WavSteg requires Python 3

Run WavSteg with the following command line arguments:

Command Line Arguments:
 -h, --hide               To hide data in a sound file
 -r, --recover            To recover data from a sound file
 -i, --input TEXT         Path to a .wav file
 -s, --secret TEXT        Path to a file to hide in the sound file
 -o, --output TEXT        Path to an output file
 -n, --lsb-count INTEGER  How many LSBs to use  [default: 2]
 -b, --bytes INTEGER      How many bytes to recover from the sound file
 --help                   Show this message and exit.

Example:

$ stegolsb wavsteg -h -i sound.wav -s file.txt -o sound_steg.wav -n 1
# OR
$ stegolsb wavsteg -r -i sound_steg.wav -o output.txt -n 1 -b 1000

Hiding Data

Hiding data uses the arguments -h, -i, -s, -o, and -n.

The following command would hide the contents of file.txt into sound.wav and save the result as sound_steg.wav. The command also outputs how many bytes have been used out of a theoretical maximum.

Example:

$ stegolsb wavsteg -h -i sound.wav -s file.txt -o sound_steg.wav -n 2
Using 2 LSBs, we can hide 6551441 bytes
Files read                     in 0.01s
5589889 bytes hidden           in 0.24s
Output wav written             in 0.03s

If you attempt to hide too much data, WavSteg will print the minimum number of LSBs required to hide your data.

Recovering Data

Recovering data uses the arguments -r, -i, -o, -n, and -b

The following command would recover the hidden data from sound_steg.wav and save it as output.txt. This requires the size in bytes of the hidden data to be accurate or the result may be too short or contain extraneous data.

Example:

$ stegolsb wavsteg -r -i sound_steg.wav -o output.txt -n 2 -b 5589889
Files read                     in 0.02s
Recovered 5589889 bytes        in 0.18s
Written output file            in 0.00s

LSBSteg

LSBSteg uses least significant bit steganography to hide a file in the color information of an RGB image (.bmp or .png).

For each color channel (e.g., R, G, and B) in each pixel of the image, we overwrite the least significant bits of the color value with the data from our file. In order to make recovering this data easier, we also hide the file size of our input file in the first few color channels of the image.

How to use

You need Python 3 and Pillow, a fork of the Python Imaging Library (PIL).

Run LSBSteg with the following command line arguments:

Command Line Arguments:
 -h, --hide                      To hide data in an image file
 -r, --recover                   To recover data from an image file
 -a, --analyze                   Print how much data can be hidden within an image   [default: False]
 -i, --input TEXT                Path to an bitmap (.bmp or .png) image
 -s, --secret TEXT               Path to a file to hide in the image
 -o, --output TEXT               Path to an output file
 -n, --lsb-count INTEGER         How many LSBs to use  [default: 2]
 -c, --compression INTEGER RANGE
                                 1 (best speed) to 9 (smallest file size)  [default: 1]
 --help                          Show this message and exit.

Example:

$ stegolsb steglsb -a -i input_image.png -s input_file.zip -n 2
# OR
$ stegolsb steglsb -h -i input_image.png -s input_file.zip -o steg.png -n 2 -c 1
# OR
$ stegolsb steglsb -r -i steg.png -o output_file.zip -n 2

Analyzing

Before hiding data in an image, it can be useful to see how much data can be hidden. The following command will achieve this, producing output similar to

$ stegolsb steglsb -a -i input_image.png -s input_file.zip -n 2
Image resolution: (2000, 1100, 3)
Using 2 LSBs, we can hide:     1650000 B
Size of input file:            1566763 B
File size tag:                 3 B

Hiding Data

The following command will hide data in the input image and write the result to the steganographed image, producing output similar to

$ stegolsb steglsb -h -i input_image.png -s input_file.zip -o steg.png -n 2 -c 1
Files read                     in 0.26s
1566763 bytes hidden           in 0.31s
Image overwritten              in 0.27s

Recovering Data

The following command will recover data from the steganographed image and write the result to the output file, producing output similar to

$ stegolsb steglsb -r -i steg.png -o output_file.zip -n 2
Files read                     in 0.30s
1566763 bytes recovered        in 0.28s
Output file written            in 0.00s

StegDetect

StegDetect provides one method for detecting simple steganography in images.

How to Use

You need Python 3 and Pillow, a fork of the Python Imaging Library (PIL).

Run StegDetect with the following command line arguments:

Command Line Arguments:
 -i, --input TEXT         Path to an image
 -n, --lsb-count INTEGER  How many LSBs to display  [default: 2]
 --help                   Show this message and exit.

Showing the Least Significant Bits of an Image

We sum the least significant n bits of the RGB color channels for each pixel and normalize the result to the range 0-255. This value is then applied to each color channel for the pixel. Where n is the number of least significant bits to show, the following command will save the resulting image, appending "_nLSBs" to the file name, and will produce output similar to the following:

$ stegolsb stegdetect -i input_image.png -n 2
Runtime: 0.63s

steganography's People

Contributors

nic0lette avatar ragibson avatar sh4nks avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

steganography's Issues

LSBSteg ignores alpha channel when computing maximum storage

For LSBSteg,

  1. Pre-steganography analysis should be tweaked to be aware of the number of color channels
  2. Tests should be added to explicitly cover transparent images
  3. Tests should be added to demonstrate inability to exceed the maximum storage limit

Consider the following 100x100 image with transparency (and thus, four color channels).
rgba_ex

When analyzing the image, LSBSteg claims that it can hide 7500 bytes with two LSBs.

$ stegolsb steglsb -a -i rgba_ex.png 
Image resolution: (100, 100)
Using 2 LSBs, we can hide:     7500 B
File size tag:                 2 B

which would be true for a typical RGB image (3*100*100*2/8 = 7500). However, we can actually use the alpha channel as well in this image, which should allow for 10k bytes to be stored.

Indeed, if you hide the supposed limit here, you'll see that the end of the image is unused. To my eye, it looks like it is using all four channels when it expected to be able to only use three.

$ stegolsb steglsb -h -i rgba_ex.png -s <(dd if=/dev/urandom bs=1 count=7498) -o rgba_ex_steg.png
Files read                     in 0.00s
7498 bytes hidden              in 0.00s
Image overwritten              in 0.00s
$ stegolsb stegdetect -i rgba_ex_steg.png 
Runtime: 0.01s

rgba_ex_steg_2LSBs

Error on run

Hello,

On running stegolsb after installing it with pip (or git clone), I get this error :

Traceback (most recent call last):
  File "/usr/local/bin/stegolsb", line 11, in <module>
    load_entry_point('stego-lsb==1.0', 'console_scripts', 'stegolsb')()
  File "/home/majordome/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 489, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/home/majordome/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2793, in load_entry_point
    return ep.load()
  File "/home/majordome/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2411, in load
    return self.resolve()
  File "/home/majordome/.local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2417, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/usr/local/lib/python2.7/dist-packages/stego_lsb-1.0-py2.7.egg/stego_lsb/cli.py", line 20, in <module>
    from stego_lsb import LSBSteg, StegDetect, WavSteg, bit_manipulation
  File "/usr/local/lib/python2.7/dist-packages/stego_lsb-1.0-py2.7.egg/stego_lsb/LSBSteg.py", line 88
    log.debug(f"Files read".ljust(30) + f" in {time() - start:.2f}s")
                          ^
SyntaxError: invalid syntax

Is it normal ?

Improve error messages and user-friendliness in general

Some use cases that should obviously raise an error just crash the program.

E.g. trying to recover data from an invalid image in LSBSteg (say, the filesize tag doesn't make sense) will just crash even though this problem could be detected and a useful message could be printed.

Similarly, one should probably be allowed to analyze an image in LSBSteg without a payload of interest.

Fix logging messages

The LSBSteg warning that an image cannot hold the requested payload doesn't print correctly (instead, it prints a logging error).

This should be fixed (in fact, it actually should raise an error and abort rather than attempting to continue in this case) and the other logging messages should be checked for correctness.

Unknown format 6?

python WavSteg.py -r -s /testing.wav -o wave.txt -n 1 -b 1000
Ran into an error during execution. Check input and try again.

unknown format: 6

stegolsb not recognized as command

I used pip3 install stego-lsb to install and everything seemed to go fine but in windows command prompt I'm getting

'stegolsb' is not recognized as an internal or external command,
operable program or batch file.

Anyone know how to fix that?
If it helps I'm using the windows store install of Python 3.8 and didn't have wheel installed when I installed stegolsb
Thanks much!

WavSteg: update to support higher sample widths (python3.12)

Python3.12's wave module now supports higher sample widths.

Locally, I managed to modify WavSteg.py so it can handle a 24 bit sample width 44100Hz .wav file, with an lsb-count of 1.
Both hiding and recovering worked well.

My knowledge of python is limited and my tests were few, so I'd rather not submit the ugly fix I made as a pull request.

Here is a summary anyway:
WavSteg.py: Both in hide_data() and recover_data()
If a sample_width of 3 is detected, change it to 4

34  sample_width = sound.getsampwidth()
35         if sample_width == 3:
36             sample_width = 4;

The if protecting the maximum sample_width must be changed as well

ValueError: buffer is smaller than requested size

Hi,
I'm running into an error when running stegolsb steglsb -r -i lsb_RGB.png -o output.zip, here's the error output :

Files read                     in 0.95s
Traceback (most recent call last):
  File "/usr/local/bin/stegolsb", line 11, in <module>
    load_entry_point('stego-lsb==1.1', 'console_scripts', 'stegolsb')()
  File "/usr/local/lib/python3.6/dist-packages/Click-7.0-py3.6.egg/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/Click-7.0-py3.6.egg/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.6/dist-packages/Click-7.0-py3.6.egg/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.6/dist-packages/Click-7.0-py3.6.egg/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.6/dist-packages/Click-7.0-py3.6.egg/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/Click-7.0-py3.6.egg/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/stego_lsb-1.1-py3.6.egg/stego_lsb/cli.py", line 93, in steglsb
    LSBSteg.recover_data(input_fp, output_fp, lsb_count)
  File "/usr/local/lib/python3.6/dist-packages/stego_lsb-1.1-py3.6.egg/stego_lsb/LSBSteg.py", line 154, in recover_data
    data = recover_message_from_image(steg_image, num_lsb)
  File "/usr/local/lib/python3.6/dist-packages/stego_lsb-1.1-py3.6.egg/stego_lsb/LSBSteg.py", line 145, in recover_message_from_image
    color_data[tag_bit_height:], 8 * bytes_to_recover, num_lsb
  File "/usr/local/lib/python3.6/dist-packages/stego_lsb-1.1-py3.6.egg/stego_lsb/bit_manipulation.py", line 112, in lsb_deinterleave_list
    deinterleaved = lsb_deinterleave_bytes(carrier_bytes, num_bits, num_lsb)
  File "/usr/local/lib/python3.6/dist-packages/stego_lsb-1.1-py3.6.egg/stego_lsb/bit_manipulation.py", line 84, in lsb_deinterleave_bytes
    np.frombuffer(carrier, dtype=carrier_dtype, count=plen).view(np.uint8)
ValueError: buffer is smaller than requested size

Do you know what causes this or what I'm doing wrong?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.