Re: Standard for Stenography?
I think it is great that Jef is working on a steganography implementation, but IMO the notion of "random offsets" is so fundamentally misguided that I hope he will reconsider.
I already did - the offsets idea was my second thought, permutation is third. I'm a big fan of the rigidly separated software tools approach. Just look at the pbmplus tookkit. But I also think it's perfectly ok to combine functions when there's a good enough reason. I think this is such a case. The problem is the length field - you've got to have it, and it's recognizable because it begins with a run of 0s. So the stego program should hide it. Mac Stego hides it by XORing with the 2nd-to-lsb of the following 32 bytes - that's a hack, and it won't slow an attacker down for a microsecond. jsteg, if I remember right, does some variable field width encoding - better, but it also remains recognizable to some extent. My solution is to store the file's bits in a specified pseudorandom permutation of the image's available bit positions. It's kind of like the frequency hopping of spread spectrum radio. This hides the length field very thoroughly. It also happens to hide anything else recognizable about the original file. Yes, you should use Stealth PGP for complete security, and my man page will tell you this. However, even with regular PGP the permutation will give you good security against casual attacks, perhaps even commercial attacks. Now, if you can think of a natural, simple interface for a standalone file permutation generator, I'll be happy to separate that part out, and make pnmstego just read bits and stick them in the image in order. The problem with separating it is the bits you want to leave alone. Either the file permutation generator has to generate *trinary* output, which seems gross, or the stego pipeline will have to include an initial DEstego step to extract the unmodified bits from the image. Either of those possibilities is more complicated than just building the permuter into pnmstego. --- Jef
Jef said:
My solution is to store the file's bits in a specified pseudorandom permutation of the image's available bit positions. It's kind of like the frequency hopping of spread spectrum radio. This hides the length field very thoroughly. It also happens to hide anything else recognizable about the original file.
What you're doing can be written as steg(permute(pkey, <length, encrypt(ekey, text)>)) Note that the permutation is really a second layer of encryption, a bit transposition cipher. The obscurity-only approach of "#define PERMUTE_KEY 0xdeadbeef" would be pretty weak. If an opponent is to be unable to detect images with embedded steganography (stegnant images?) by looking for the length field, the permutation needs to be strong: large keyspace, strong PRNG, etc. Granted, it doesn't need to be as strong as the message cipher, because the plaintext is lousy (mostly encrypted), the payoff to the opponent on breaking it is less, and the target pool is much larger. But you do have the hassles of a second cipher -- at the very least, you need to distribute keys. Probably *private* keys, with their attendant distribution explosion. I think the Right Thing to Do is to require that the length indication or eof marker be inside the strong encryption (Stealth PGP or what have you). Now, we may not want to do that. First, we may have good reasons to preserve modularity by doing the length in the stegger. If the encryption is stealthy, we can get away with *only re-encrypting the length information*. Big win speedwise. If the encryption is not stealthy, it seems to me that we need a PGP headerstripper, not a permuter. The bulk of the file, after all, *is* stealthy. Tangentially, why choose bit permutation for your second-level encryption? There are plenty of schemes that will be a lot faster than doing all that bitmangling. Eli ebrandt@jarthur.claremont.edu
participants (2)
-
Eli Brandt
-
Jef Poskanzer