Steganography is a way of sending the hidden data in such a way that nobody (apart from the sender and intended recipients) knows that the secret message was sent. There aren't any ciphers or other encryption like it is in cryptography.
The first information about steganography is from the 5th century BC. Herodotus described that for sending secret data, messages were not written in wax covering a wooden board (which was a common way to store information in that time) but letters were written directly on the board and after that it was covered with wax.
During World War II, many agents used so called microdots. The whole document A4 was reduced to the size of a dot and used as a part of other common text.
Steganography also includes all kinds of invisible inks. They have been used since ancient times around the world. Over time new technologies have been invented and better recipes of invisible inks have been developed. Mixtures have become more difficult to detect: more odorless, invisible under ultraviolet light, easily soluble in water, etc. In 1999 CIA refused to disclose the recipes of invisible inks that had been used during World War I, arguing that they were still important for national security.
With the development of technology, possibilities for data hiding have increased. For example the microdot technology is used in almost all modern printers. It allows to mark all created printouts in a way, that is invisible for users.
Currently, very popular kind of steganography is hiding information in digital pictures. There is some redundancy in storing images. All pixels in digital pictures are coded using a specified amount of bits and usually it is impossible to notice the changing of the least important bits. The least important bits can be used for storing secret information. A similar situation happens when storing digital sound.
Other clever steganography methods may include:
- delays in network packages,
- modifying printed letters - their size, spacing, position,
- using invisible and zero-width Unicode characters (for instance Zero-Width Joiner and Zero-Width Non-Joiner, that are interpreted only in Arabic language),
- changing the order of elements in sets,
- adding data in ignored sections of files, for example after the end of file character (EOF).