Skip to content

gzcharleszhang/stego

Repository files navigation

Stego CLI

Github Action Build Go Report Card

Stego is a command-line interface for encoding and decoding secret data in images, using the Least Significant Bit (LSB) steganography technique. Currently, Stego only supports PNG images, but is able to hide any type of data and files.

Stego achieves this by first prepending the size of the secret data to the data itself. It then writes each bit of the data to the least significant bit of each pixel's RGB values in the image. When Stego decodes an image, it collects each least significant bit of the image, then recompose the bits back into data. The first 8 LSB will tell Stego the total size of the hidden data.

Stego is also available as a Go package.

Getting Started

$ go get -u github.com/gzcharleszhang/stego

Usage

Encoding data in an image

$ stego encode ./stego/example.png --data "Stego is a steganography CLI tool."

By default, Stego will add a -out suffix to the output image. For example, the above encoded image can be found at ./stego/example-out.png

To specify an output path, use the --out or -o flag

$ stego encode ./stego/example.png -d "Stego is a steganography CLI tool." -o ./out/example.png

Use the --bits or -b flag to specify the number of bits in a byte used for encoding.

For example, this will tell Stego to use up to 2 bits per byte. If Stego already used all of the least significant bits in an image but there is still more data to encode, then Stego will encode using the second least significant bit.

$ stego encode ./stego/example.png -d "Stego is a steganography CLI tool." -b 2

Decoding data from an image

$ stego decode ./example.png
Stego is a steganography CLI tool.

Checking the maximum encoding size of an image

Before encoding data in an image, you may want to know how much hidden data an image can hold.

Stego has a size command that calculates the maximum encoding size of an image in bytes.

$ stego size ./example.png
1179644

Use the --bits or -b flag to specify the number of bits in a byte used for encoding.

$ stego size ./example.png -b 2
2359292

Pretty print using the --pretty or -p flag.

$ stego size --pretty ./example.png
1.12 MB

Using Stego as a package

Package-only installation

$ go get -u github.com/gzcharleszhang/stego/pkg/stegolsb

Encoding

Stego can encode data into an image from the Go image package

import (
    "fmt"
    "github.com/gzcharleszhang/stego/pkg/stegolsb"
    "image"
	"image/png"
	"os"
)

func main() {
    // read image from file
    file, _ := os.Open("/path/to/image")
    img, _, _ := image.Decode(file)
 
    // encode data using Stego
    outImg, err := stego_lsb.LSBEncode(img, "Hello, world!")
    if err != nil {
        fmt.Printf("Error encoding data: %v\n", err)
    }
}

Encoding with more than 1 bit

The package also supports encoding with multiple bits per byte. This allows the image to encode more data, however it will decrease the encoded image quality compared to the original image.

Stego will first use the least significant bit, then the second least significant bit, and so on.

Encoding an image using up to 2 bit per byte

outImg, err := stego_lsb.Encode(img, "Hello, world!", 2)
if err != nil {
    fmt.Printf("Error encoding data: %v\n", err)
}

Decoding

Stego attempts to decode an image and prints the hidden data.

data, err := stego_lsb.Decode(img)
if err != nil {
    fmt.Printf("Error decoding image: %v\n", err)
}

Maximum encoding size

Stego can calculate the maximum number of bytes available for encoding in an image.

maxSize, err := stego_lsb.MaxLSBEncodeSize(img)
if err != nil {
    fmt.Printf("Error getting max encode size: %v", err)
}

Use stego_lsb.MaxEncodeSize to get the max size if using more than 1 bit per byte for encoding.

The maximum number of bytes available in the image when using up to 2 bits per byte for encoding.

maxSize, err := stego_lsb.MaxEncodeSize(img, 2)
if err != nil {
    fmt.Printf("Error getting max encode size: %v", err)
}

About

Hide secret data in images using LSB steganography

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages