What is a stealth message?
==========================

A stealth message *must* be a PGP-encrypted message, and it can be hidden in
a container sprite only if that sprite already contains a first hidden PGP
message.

A stealth message is hidden in the part of the sprite that is not already
used to hide the first PGP message. The container sprite has the same
general appearance, whether or not an additional stealth message is hidden
in it.

What makes the stealth message undetectable? It is additionally encrypted
with a passphrase known only to the user. No one can extract the stealth
message without entering the correct passphrase. Any attempt to do so will
fail, and the program will report the same error message as in the case when
no stealth message is hidden.

If the secret police demand to see the hidden data, even if they know that
!Stego can hide two PGP messages in a container sprite, they will have no
way to detect that there is actually a second hidden message if you say that
there is just one. Indeed, the 'normal' use of !Stego is to hide only one
message.

If you need to hide extremely sensitive information, you can hide something
moderately private in the first message, such as your list of presents to
buy for your mother's next birthday, which you would be willing to reveal
under pressure. That first message can be PGP-encrypted with a throwaway
passphrase (not one that you ever use for high security!), and you can
decrypt that first PGP message for the secret police. Your really important
information will remain safe, since the snoopers will have no way to
determine whether or not such a stealth message exists in the sprite.


How to hide a stealth message
=============================

You can hide a stealth message by using the application !Hide in exactly the
same way as when hiding a PGP message in the ordinary way, except that you
must hold down one of the CTRL keys while double-clicking on !Hide.

When you run !Hide in this way, the directory windows for both DataDir and
SpriteDir will open. If either or both of those directories are empty, !Hide
will report this fact, and nothing else will happen.

Put the PGP message in the directory DataDir, and put a suitable container
sprite in the directory SpriteDir. Then double-click on !Hide again, while
holding down one of the CTRL keys as before. The additional stealth message
will then be hidden in the sprite file.

Note that the input file in DataDir is always securely wiped. If you want to
keep a copy of the message, make sure that a copy still exists in some other
directory.

It must be stressed that a stealth message can be hidden only if (1) the
text file in DataDir is a PGP message, and (2) the sprite file in SpriteDir
is a container sprite which already hides a first PGP message. If these
conditions are not satisfied, the program will tell you what is wrong. If
the input files are of the correct type, you will be prompted for a
passphrase.

If the input container sprite already hides a stealth message, the original
stealth message will be overwitten by the new one.

There must be sufficient room in the sprite to hide a stealth message. Only
the extra space not already occupied by the first hidden message can be
used. Thus, if you want to hide a very long stealth message, the first
hidden message must be reasonably short. The total length of the two hidden
messages must be less than about 8K. If there is insufficient room in a
particular case, !Hide will report this fact.

To summarise what was explained above, you must first hide a PGP message in
a container sprite in the ordinary way, as described in the !Help file,
before you can hide an additional stealth message.


How to recover a stealth message
================================

You can extract a stealth message from a container sprite by using the
application !Reveal in exactly the same way as when extracting the first
hidden message, except that you must hold down one of the CTRL keys while
double-clicking on !Reveal.

When you run !Reveal in this way, the directory window for SpriteDir will
open, and nothing else will happen if that directory is empty. Put the
container sprite in that directory, and double-click on !Reveal again, while
holding down one of the CTRL keys.

You will be prompted for a passphrase. If you enter the wrong passphrase, an
error message will be reported. Exactly the same error message will be
reported if the container sprite does not hide any stealth message.

If a stealth message is present in the container sprite, and if the correct
passphrase is entered, the extracted message will appear in the directory
DataDir, and the container sprite will be deleted. If you want to keep a
copy of the container sprite, make sure that a copy still exists in some
other directory.

When a container sprite hides two messages, either of them can be extracted,
depending on whether or not you hold down a CTRL key when running !Reveal.
If you want to extract both messages, you can do this in either order, but
you must remember to keep a separate copy of the container sprite, because
the copy of it in the directory SpriteDir is deleted after each operation.