I think Eli is right, too, that lossy compression is pretty much out of the question for this application. It would be too easy to lose the message that is encoded in the low-order bits.
Uh, unless the JPEG FAQ sheet has seriously mislead me, lossy compression would be excellent for this sort of steganography. In the standard JPEG encoding procedure, an image is broken into square blocks of pixels, eight per side. These blocks are run through a 2-D discrete cosine transform, producing a set of cosine waves that are equivalent to the original blocks (within small errors). If the original image was smooth (a natural image, for example), the low- frequency waves will contain all the information necessary for reproducing the block; the high-frequency waves will contain nothing but faint noise. So the JPEG encoder _dumps_ the high-frequency cosine waves. That's how the format gets a lot of its compression. This is where steganography comes in. Take these empty wave slots and stick your data in them. For example, if the wave magnitudes are stored as four-byte integers, store one byte of data in the lowest- order byte in the slot (or go down to four, two, or even one bit per integer, if necessary; floating-point would be wonderful, here). As long as the hidden data representation looks like very tiny values to the JPEG decoder, the data should be completely unnoticeable on display---but the steganographic decoder will know where to look for it and what to do with it. Anyone have honest-to-god practical experience with JPEG/JFIF to assess the feasibility of this technique? Derek Derek Lynn Upham University of British Columbia upham@cs.ubc.ca Computer Science Department ============================================================================= "Ha! Your Leaping Tiger Kung Fu is no match for my Frightened Piglet Style!"