You are browsing as a guest. Sign up (or log in) to start making projects!

SteganoHide

  • 4 Devlogs
  • 8 Total hours

This project is an interactive Command-Line Interface (CLI) application, the tool implements steganography—the art and science of hiding secret pieces of data inside an ordinary file. Specifically, this application allows users to safely encode a hidden text message within the pixel data of a standard PNG image, and conversely, decode a modified image to extract and reveal the hidden text. To a human observer, the original image and the encoded image look completely identical, making it an excellent way to pass secret messages.

Ship #1 Pending review

I built SteganoHide, a CLI tool that hides secret text messages inside PNG images using LSB steganography. The image looks completely normal to the human eye, but the hidden data is stored in the Red channel of each pixel.
The most challenging part was the decoder, it has to follow the exact same pixel path as the encoder, and getting the stop signal logic right took a few tries.
I'm proud that it's fully installable via pip install steganohide and works in under a minute.
To test it: install it, grab any PNG image, run the tool, hide a message, then decode it back. Windows users may need to run the full .exe path from the Scripts folder if the command isn't recognized.

  • 4 devlogs
  • 8h
Try project → See source code →
Open comments for this post

1h 55m 49s logged

Shipping day!

Spent the last couple of days on everything around the code, which turned out to be way more work than I expected. Setting up git properly, fixing merge conflicts, getting PyPI to accept the upload, writing a .gitignore, creating a release tag. None of this is hard individually but it’s a lot of steps and each one has its own way of going wrong.
Also fixed two real bugs I hadn’t noticed: the tool would crash on non-ASCII characters like emoji, and nothing stopped you from saving the output as a .jpg (which would silently destroy the hidden data since JPEG is lossy). Both are one-liners to fix but they matter.
The project is now on PyPI at pip install steganohide, fully open source, with a proper README and release. It actually works and anyone can try it.

Shipping day!

Spent the last couple of days on everything around the code, which turned out to be way more work than I expected. Setting up git properly, fixing merge conflicts, getting PyPI to accept the upload, writing a .gitignore, creating a release tag. None of this is hard individually but it’s a lot of steps and each one has its own way of going wrong.
Also fixed two real bugs I hadn’t noticed: the tool would crash on non-ASCII characters like emoji, and nothing stopped you from saving the output as a .jpg (which would silently destroy the hidden data since JPEG is lossy). Both are one-liners to fix but they matter.
The project is now on PyPI at pip install steganohide, fully open source, with a proper README and release. It actually works and anyone can try it.

Replying to @iva33

0
2
Open comments for this post

1h 56m 42s logged

Devlog 3 — the decoder!

This one took more thinking than I expected. The decoder has to follow the exact same path as the encoder: same starting corner, same row-by-row order, otherwise it reads the wrong pixels and gets messy. The trickiest part was the stop signal logic. The decoder reads Red values one by one and asks “is this a 0?” at every pixel. If yes, stop and convert everything collected so far back to text. If no, keep going. Sounds simple but getting the edge cases right (what if the image has no message at all? what if it hits the end without finding a stop?) took a few tries.
When I finally ran encode → decode end to end and saw my message come back perfectly that was a relief.

Devlog 3 — the decoder!

This one took more thinking than I expected. The decoder has to follow the exact same path as the encoder: same starting corner, same row-by-row order, otherwise it reads the wrong pixels and gets messy. The trickiest part was the stop signal logic. The decoder reads Red values one by one and asks “is this a 0?” at every pixel. If yes, stop and convert everything collected so far back to text. If no, keep going. Sounds simple but getting the edge cases right (what if the image has no message at all? what if it hits the end without finding a stop?) took a few tries.
When I finally ran encode → decode end to end and saw my message come back perfectly that was a relief.

Replying to @iva33

0
2
Open comments for this post

2h 30m 50s logged

Devlog 2!

Ran into my first real problem today, the SimpleImage library I started with wasn’t giving me direct pixel access the way I needed. Switched to Pillow and it made things a lot easier. getpixel() and putpixel() are what I needed.
Writing the encoder felt satisfying. You loop through every pixel, overwrite the Red channel with your character’s ASCII value, move to the next pixel, repeat. It sounds almost too simple but it works and the encoded image looks identical to the original.
Added a safety check too: if your message is longer than the image has pixels, it’ll tell you instead of crashing silently.

Devlog 2!

Ran into my first real problem today, the SimpleImage library I started with wasn’t giving me direct pixel access the way I needed. Switched to Pillow and it made things a lot easier. getpixel() and putpixel() are what I needed.
Writing the encoder felt satisfying. You loop through every pixel, overwrite the Red channel with your character’s ASCII value, move to the next pixel, repeat. It sounds almost too simple but it works and the encoded image looks identical to the original.
Added a safety check too: if your message is longer than the image has pixels, it’ll tell you instead of crashing silently.

Replying to @iva33

0
2
Open comments for this post

1h 19m 40s logged

First devlog!

I’ve been wanting to build something that feels like actual secret agent stuff, and steganography caught my eye, hiding messages inside images that look completely normal. Nobody would ever know.
Getting started was harder than I expected. I didn’t know how pixel data actually worked at first, I just knew images were made of pixels. Turns out every pixel has three numbers (R, G, B) and ASCII characters are also just numbers, so you can literally swap one for the other. That clicked for me and I got excited.
Built the two core helper functions today: message_to_numbers which converts text to ASCII values, and numbers_to_message which does the reverse. The stop signal (0) idea came from wondering “how does the decoder know when to stop?” you need a flag at the end, like a period at the end of a sentence.

First devlog!

I’ve been wanting to build something that feels like actual secret agent stuff, and steganography caught my eye, hiding messages inside images that look completely normal. Nobody would ever know.
Getting started was harder than I expected. I didn’t know how pixel data actually worked at first, I just knew images were made of pixels. Turns out every pixel has three numbers (R, G, B) and ASCII characters are also just numbers, so you can literally swap one for the other. That clicked for me and I got excited.
Built the two core helper functions today: message_to_numbers which converts text to ASCII values, and numbers_to_message which does the reverse. The stop signal (0) idea came from wondering “how does the decoder know when to stop?” you need a flag at the end, like a period at the end of a sentence.

Replying to @iva33

0
2

Followers

Loading…