I am asking this question instead of extending the discussion of another question (Perfect Steganography). I did try starting a chat room (https://chat.stackexchange.com/rooms/87636/perfect-steganography) but nobody knew about it ;-(.
I think that I have achieved near perfect steganography
This is an exceptional claim and should be accompanied by exceptional proof, but I am at a loss as to how to quantify/prove this claim. I am asking for help with this validation - a refutation would be an acceptable outcome to this question.
The basic method is as follows: The bulk of the image data in the file represents coefficients to the DC algorithm. These coefficients are routinely pruned to reduce the size and resolution of the image according to the needs of the image compressor. The level of compression is typically constant across an image, and is chosen for its effect upon size/quality rather than on a rigourously defined process. Indeed many programs use a default quality setting, or allow selection of one of a number of predetermined quality settings. These settings have different levels of effect on different parts of the image.
By modulating the quality of the image as the image data is traversed I can create a signal that can be interpreted as an array of bytes. I call this the payload. (The method has a few subtleties that might best be left for offline discussion.)
The byte array payload from an unmodified jpeg is effectively 'random'. By 'random' here I mean that there is no apparent order - the data is obviously not random as it is related to the image - but the relationship is so indirect as to be ignorable. By replacing some of the bytes with an encrypted message (effectively more 'random' data) we can hide the message without increasing the apparent order (decreasing the apparent entropy).
As an example here are three versions of the same image one with no payload, one with a short message ("hello World"), and one with the first sentence of 'Lorem Ipsum'
- http://vanleersum.uk/downloads/images/Drawing1.jpg
- http://vanleersum.uk/downloads/images/Drawing2.jpg
- http://vanleersum.uk/downloads/images/Drawing3.jpg
I cannot see a difference, and I would welcome proof that a difference is detectable. Do not be fooled by the sizes. The modulation of quality is as likely to reduce the size of the image as it is to increase it.
As a further illustration here are two images:
- http://vanleersum.uk/downloads/images/eraseWithZeroes.jpg
- http://vanleersum.uk/downloads/images/eraseWithFF.jpg
Where the normally 'random' payload has been set to all ones (FF) or all zeroes. I would like to emphasise that this is not an encrypted message containing all ones or zeroes, but the underlying byte array that is inserted into the image. This is the most extreme variation I can imagine in the data, but the effect upon the image is negligeable.....
Now, showing you images is no proof at all. So I provide two apps to play with:
- http://vanleersum.uk/downloads/SmugglerMac.dmg for MacOS
- https://play.google.com/store/apps/details?id=uk.vanleersum.smugglerandroid for android phones.
Please can you suggest other ways to test my claim?
Notes as answers to comments:
None of the data involved is truly random. Every change to every bit has a theoretically determinable effect upon the image. However the variations in the data that lead to variations from the original are all within the variations that could be expected in the output from some unknown but compliant jpeg compressor (or even the same compressor with slightly different settings).
I guess that perfection would require that an examiner with the original and the modified would see no difference. I do not think that this is easily achievable in my scheme. Any change to any bit of any byte can be detected by a byte compare. So can I limit this discussion to whether the modified file in isolation can be shown to differ from the expected format in a way that would indicate that it contains a message?