I love late August in the suburbs. For all the shit the suburbs get, they deserve credit for late August. City kids have place to go; we go to the parking lot behind 7-Eleven and talk.
At the end of August, we pack our bags and go to schools hundreds of miles apart. This begins to press on us in late August; it puts conversations and relationships on a deadline. In early August we go to the city to do things. In late August we go to the parking lot behind 7-Eleven.
The lot is dark and quiet. It’s slow. It’s probably my own deficiency that I need it, but it’s the only thing lets me listen and speak clearly. No, not that; speech is superficial—it lets me understand and be understood. Dark and quiet, like the streets at night after it rains—that’s another one. I need a setting.
It’s just contemplation, but some people don’t know that you don’t have to be alone to contemplate. I sometimes forget that, but I remember in late August in the suburbs.
The middle class protocol dictates four years of a migrant lifestyle. Keep your home friends for the winter and summer gaps. Make college friends for the rest. So I did, and I do the same sorts of things with both groups. Except that at school, there is nobody with whom to share dark and quiet, and I’m not smart enough to contemplate by myself.
Some people fail to follow the protocol. The guy who hanged himself after graduating from high school. The girl who didn’t make friends at college and whose home friends don’t keep her. The guy who became an asshole when he started drinking. These things are discussed behind 7-Eleven.
I continue the cycle: I have another two years of late Augusts guaranteed. I don’t know what comes after that. At that point everybody gets to choose. I wouldn’t choose suburbs—everybody there drives too much. I don’t like cars, I like parking lots.
Here’s a character I came up with several months ago and never used, quoted directly from my notes:
Power: mind control
Looks like: me
Beekeeper uses mind control to convince people to throw rocks at beehives.
He’s now available for public use. Comments are open for you to post stories using this character. Please feel no pressure to make a full or non-sucky story; just post whatever you come up with. Though the character lends himself to comedy, any genre is OK.
A Free Rider level I made:
-ev,-1b,-p1,-5p -h3,1t,-h3,-b -h3,-b,-gm,-8 -gm,-8,-ge,2 -gq,-18,-e0,-d -ge,2,-gf,f -gf,f,-gn,k -gn,k,-h3,k -gl,v,-gk,1m -g4,1r,-fr,1h -fr,1h,-fq,u -gk,1m,-gd,1r -gd,1r,-g4,1r -fq,u,-fq,1r -1h,1i,-ev,-1b -e0,-d,-en,-5 -e2,-e,-ef,-11 -ep,16,-eu,v -eu,v,-f7,v -f7,v,-fh,17 -fh,17,-f9,1d -f9,1d,-ev,1g -ev,1g,-er,1m -eg,2,-ej,1t -ei,18,-ec,16 -er,1m,-f2,1q -f2,1q,-fb,1t -fb,1t,-fi,1k -e3,1c,-e2,1t -e2,1c,-ec,17 -cg,b,-cj,20 -d2,1t,-d2,1a -d2,1a,-ci,1a -cj,20,-d2,1t -c8,1a,-bn,1b -bn,1b,-bn,20 -ca,1u,-c8,1b -bh,1d,-bc,21 -bc,21,-b3,1g -b3,1g,-au,22 -bn,20,-ca,1u -av,21,-ak,1g -ae,25,-ab,1g -ab,1g,-ac,1l -ac,1l,-a5,1h -a5,1h,-9t,1k -9t,1k,-9t,25 -3k,-59,-3n,-3s -3l,-4k,-38,-4t -38,-4t,-3l,-5a -3n,-3s,-37,-47 -37,-47,-3l,-4k -30,-4v,-2v,-56 -30,-3u,-2v,-4i -2l,-4h,-2m,-41 -2m,-41,-28,-3v -28,-3v,-29,-4e -29,-4e,-2l,-4f -29,-3u,-2b,-3h -2b,-3h,-2o,-3j 1m,-2e,-1s,-2e -1s,-2e,-1s,-32 -1s,-32,-2s,-20 -2s,-20,-20,-12 -20,-12,-20,-1o -20,-1o,1l,-1o -1i,-3v,-13,-58 -13,-58,-n,-3v -e,-4u,-8,-4v -t,-4i,-1c,-4i -c,-4j,-d,-3v -3,-3u,-2,-4i -2,-4e,3,-4h -1i,1i,1i,1i -5,1s,8i,19 3,-4h,9,-4d c,29,8q,15 10,2j,95,10 1l,-1o,1k,-2e 1i,1i,5b,1i 1p,2s,a6,l 2d,32,a4,i 38,36,a2,f 45,3a,a3,b 4v,3b,a4,7 5t,3b,a5,2 6m,3h,as,-r 7f,3f,b7,-1e 86,3e,bg,-23 8s,37,br,-2v 9c,3a,c0,-3e 9v,3a,c2,-3s ah,38,c3,-4b cj,-4m,d0,-4h dm,-4o,dj,-3o dt,-4n,dq,-3o cj,-3q,cj,-4m d0,-4h,cu,-49 cu,-49,cj,-4a d0,-47,d1,-3q d1,-3q,d8,-3q d8,-3q,dd,-47 dd,-47,db,-3p eg,-48,ed,-3n ed,-3n,ej,-3m ej,-3m,er,-45 er,-45,eo,-3m es,-2m,f0,-46 f0,-46,fc,-41 fc,-41,fb,-3o fb,-3o,f0,-3n io,2v,sv,ck o1,8b,ug,dj o7,8v,uo,dk om,9q,v8,do pg,b0,104,e0 pn,bt,10m,e0 q7,cn,10t,du qm,df,13p,e3 tp,e4,15q,e1 150,bb,14v,ai 14v,ai,15h,a1 14v,ba,15e,bu 15e,bu,165,c0 15h,a1,166,a1 166,a1,16m,af 16m,af,16n,b7 15m,a8,15o,b4 15u,b4,163,a9 163,a9,15m,a8 15o,b4,15u,b4 15u,bh,15l,bf 15l,bf,15q,b7 15q,b7,15u,bg 165,c0,16m,b8 15q,e2,15q,c0 #ge,-mf sj,bf
I got this email:
Date: Tue, 13 Feb 2007 21:54:37 -0500
Sender: Student Association
Subject: Classes Cancelled (sic)
The Student Association would like you to know that…
CLASSES ARE CANCELED!
Then I made posters and a Facebook event advertising a “Big-ass Snowball Fight”.
Snow days are still exciting, in a non-spontaneous, adult way.
Yesterday, I introduced Stepic, a tool and Python module to hide any data within an image. Stepic will get its own documentation eventually, but for now I want to describe the method of steganography Stepic uses.
Stepic simply reads pixels from left to right, starting at the top, just like the English text you’re reading now. It reads three pixels at a time, each of which contains three values: red, green, and blue. (Sometimes pixels contain a fourth value which describe their opacity. Stepic ignores these.)
Each group of pixels has nine values. A byte of data has eight bits, so if each color can be modified just slightly, by setting the least significant bit to zero or one, these three pixels can store a byte, with one color value left over. Stepic uses the the least significant bit of this left over value to signify the end of data: 0 means keep reading; 1 means the message is over.
An example: suppose you want to hide the message “Hello”. Since the message is 5 bytes long, the image has to be at least 5 × 3 pixels = 15 pixels. The following listing is an example of a 4 × 4 image , which has 16 pixels—more than enough. Each (red, green, blue) triple represents a pixel.
[(22, 180, 163), (88, 65, 21), (123, 240, 125), (50, 214, 175),
(200, 56, 164), (158, 220, 102), (224, 63, 33), (155, 217, 110),
(167, 135, 29), (84, 62, 139), (7, 11, 123), (165, 219, 151),
(45, 165, 117), (145, 185, 5), (33, 205, 193), (165, 18, 125)]
Start at the top-left, and read in three pixels: (22, 180, 163), (88, 65, 21), (123, 240, 125). We want to encode ‘H’, which is ASCII 72, or 0100 1000 in binary. Taking the color values from left to right, the value should be made odd for 1 and even for 0. 22 stays 22, 180 becomes 181, 163 becomes 162, and so on, through 240 staying 240. Finally, 125 is changed to 124 to indicate that the data is not finished.The next three pixels are read—(50, 214, 175), (200, 56, 164), (158, 220, 102)—and modified the same way, using ASCII ‘e’, or the bitstring 0110 0101, with the last color value, 102, left alone to indicate that the data is not finished. It goes on this way until ‘o’, which encodes 0110 1111 1, the first eight bits for the data, and that last 1 to mark the end of the data. The one pixel that is left over doesn’t matter. Our new image is:
[(22, 181, 162), (88, 65, 20), (122, 240, 124), (50, 215, 175),
(200, 56, 165), (158, 221, 102), (224, 63, 33), (154, 217, 111),
(166, 134, 28), (84, 63, 139), (6, 11, 123), (164, 218, 150),
(44, 165, 117), (144, 185, 5), (33, 205, 193), (165, 18, 125)]
To decode, read three pixels at a time from left to right, top to bottom, until the last bit of the last color of the last pixel that you read is a 1. The least significant bit of each color value besides every third blue makes up the data.
Since the data is stored in the colors, not in any format specific manner, Stepic can be write to PNG, BMP, and other formats, and can read a whole slew of others. (JPEG doesn’t work, since it throws out data.) Files that Stepic writes can be modified by other programs as long as the first 3n pixels are not modified, where n is the length of the hidden data.
The encoding scheme gives no hint about whether an image contains data, so Stepic will always extract at least one byte from any image, whether or not anybody intentionally hid data there. Data that just happens to be in an image is likely to be very short, and garbage.
This was my first experience with steganography, and I got to do some fun bit bashing. I hope this was an interesting introduction to a simple steganographic technique. If you’re interested in the actual bitwise operations and implementation details, please see the source.
Via my bro, who was in England recently: there’s a Drink OR Drive campaign there.
Of course, Drink OR Drive, means you may also Drink AND Drive. In their attempt to sound hip, they must have misspelled Drink XOR Drive.
Drink XOR Drive, though, still is wrong, since it means (Drink AND do NOT Drive) OR (Drive AND do NOT Drink), which means you can’t Stay Sober AND Use Public Transportation.
What makes the most sense is do NOT (Drink AND Drive).
Here in the states we say do NOT Drink and Drive (”Don’t drink and drive”), which doesn’t give you any options, but definitely means you’re not drunk at the wheel. The American message might be a case of misplaced parentheses, or it might be a comment on our car culture.
Steganography is the hiding of data within other data. Stepic is my new Python module and command line tool for hiding arbitrary data within images by slightly modifying the colors. These modifications are generally imperceptible to humans, but are machine detectable.
Update: Stepic now has a homepage with documentation and downloads.
Stepic can be retrieved using Bazaar, and installed the standard Python way. Depending on your setup, it might look something like this:
bzr get http://domnit.org/stepic/ cd stepic sudo ./setup.py install --prefix=/usr/local
Stepic’s only dependency, besides Python, is the Python Imaging Library (PIL).
Here’s an example: given this image:
stepic --encode --image-in=stepic-demo-before.png --data-in=pyramid-fractal.html --out=stepic-demo-after.png produces this image:
The images look the same, but the second contains a cool app I made in 2005 and never shared before. You can extract that file by downloading the second image and issuing the command:
stepic --decode --image-in=stepic-demo-after.png --out=pyramid-fractal.html.
Note that obscurity is not security—there are other ways to have actual security. While there is no explicit indication in an image that it contains hidden data, an image is unlikely to contain long, non-random data that stepic can extract. If you want something like plausible deniability, your data should look random and most blues should be even.
I’m not doing anything new, except maybe providing a Python implementation. That’s OK by me, and if it counts for anything, I figured out the principle before reading the Wikipedia description.
It’s steganography, it uses pictures, it’s epic, it sounds like septic, it’s stepic—try it now! (Easier installation coming eventually.)
Update: Check out the Stepic homepage.
How is parody supposed to compete with the real thing?
If you use Firefox 2 or any OpenSearch browser (IE7 should work, but I haven’t tried) and also use del.icio.us, the Install link below will offer to install a search plugin to search your own bookmarks. (The official search plugin searches all bookmarks; this searches only your bookmarks.)