2015-10-03 23:29:52 +00:00
|
|
|
Steganographic
|
|
|
|
==============
|
|
|
|
|
2016-05-21 19:51:36 +00:00
|
|
|
2016 05 12:
|
|
|
|
Now pads the remaining pixels with random data. Previously, the fact that the secret
|
|
|
|
file resided in only as many pixels as it needed meant there was a sudden decrease in
|
|
|
|
visual noise when the secret ended. Now there is noise throughout.
|
|
|
|
Your secret file should resemble random noise for this to be effective. Thus
|
|
|
|
encryption is recommended.
|
|
|
|
This does not change decoding, because the decoder only reads as many bytes as
|
|
|
|
needed.
|
|
|
|
|
|
|
|
2016 01 15:
|
2016-01-17 01:43:17 +00:00
|
|
|
Now supports variable "bitness", the number of bits per color channel to overwrite.
|
|
|
|
Previously, bitness was always 1, to maximize transparency.
|
|
|
|
Now, bitness can be 1-8 to favor transparency or information density.
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-10-03 23:29:52 +00:00
|
|
|
Let's be honest, this was really just an excuse to make big Terminal headers out of hashmarks.
|
|
|
|
|
2015-10-09 21:57:03 +00:00
|
|
|
|
|
|
|
|
|
|
|
Requires `pip install pillow`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Hide files in images!
|
|
|
|
|
|
|
|
For each color channel of each pixel in an Image, modify the least significant bit to represent a bit of the Secret file.
|
|
|
|
This changes the RGB value of the pixel by a usually-imperceptible amount.
|
|
|
|
The first 32 bits (10.66 pixels) will be used to store the length of the Secret content in big endian.
|
|
|
|
Then, the Secret's extension is stored. A null byte indicates the end of the extension. This section is of variable length.
|
|
|
|
A file with no extension requires only that null byte. A file with an extension requires 1 additional byte per character.
|
|
|
|
|
|
|
|
Smallest image possible = 16 pixels with 48 bit secret: 32 for header; 8 for null extension; 8 for data.
|
|
|
|
Each Image pixel holds 3 Secret bits, so the Image must have at least `((secretbytes * (8 / 3)) + 14)` pixels.
|
|
|
|
An Image can hold `((3 * (pixels - 14)) / 8)` Secret bytes.
|
|
|
|
|
|
|
|
Usage:
|
2016-01-17 01:43:17 +00:00
|
|
|
> steganographic.py encode imagefilename.png secretfilename.ext bitness
|
|
|
|
> steganographic.py decode lacedimagename.png bitness
|
|
|
|
|
|
|
|
where bitness defaults to 1 in both cases.
|
2015-10-09 21:57:03 +00:00
|
|
|
|
|
|
|
|
2016-01-17 01:43:17 +00:00
|
|
|
Reference table for files with NO EXTENSION and bitness of 1.
|
2015-10-09 21:57:03 +00:00
|
|
|
For each extension character, subtract 1 byte from secret size
|
|
|
|
|
|
|
|
pixels | example dimensions | Secret file size
|
|
|
|
100 | 10 x 10 | 32 bytes
|
|
|
|
400 | 20 x 20 | 144 bytes
|
|
|
|
2,500 | 50 x 50 | 932 bytes
|
|
|
|
10,000 | 100 x 100 | 3,744 bytes
|
|
|
|
40,000 | 200 x 200 | 14,994 bytes
|
|
|
|
25,000 | 500 x 500 | 93,744 bytes (91 kb)
|
|
|
|
1,000,000 | 1,000 x 1,000 | 374,994 bytes (366 kb)
|
|
|
|
4,000,000 | 2,000 x 2,000 | 1,499,994 bytes (1.43 mb)
|
|
|
|
25,000,000 | 5,000 x 5,000 | 9,374,994 bytes (8.94 mb)
|
|
|
|
100,000,000 | 10,000 x 10,000 | 37,499,994 bytes (35.7 mb)
|
|
|
|
|
|
|
|
pixels | example dimensions | Secret file size
|
|
|
|
100 | 10 x 10 | 32 bytes
|
|
|
|
697 | 25 x 28 (700) | 256 bytes
|
|
|
|
2,745 | 50 x 55 (2,750) | 1,024 bytes (1 kb)
|
|
|
|
21,860 | 142 x 154 (21,868) | 8,192 bytes (8 kb)
|
|
|
|
87,396 | 230 x 380 (87,400) | 32,768 bytes (32 kb)
|
|
|
|
349,540 | 463 x 755 (349,565) | 131,072 bytes (128 kb)
|
|
|
|
1,398,116 | 1146 x 1120 (1,398,120) | 524,288 bytes (512 kb)
|
|
|
|
2,796,217 | 1621 x 1725 (2,796,225) | 1,048,576 bytes (1 mb)
|
|
|
|
11,184,825 | 3500 x 3200 (11,200,000) | 4,194,304 bytes (4 mb)
|
|
|
|
44,739,257 | 6700 x 6700 (44,890,000) | 16,777,216 bytes (16 mb)
|
|
|
|
89,478,500 | 9500 x 9500 (90,250,000) | 33,554,432 bytes (32 mb)
|
|
|
|
|
2015-10-03 23:29:52 +00:00
|
|
|
<p align="center">
|
2016-01-17 01:43:17 +00:00
|
|
|
<img src="https://github.com/voussoir/else/blob/master/.GitImages/steganographic_logo.png?raw=true" alt="steganographic"/>
|
2015-10-03 23:29:52 +00:00
|
|
|
</p>
|