You are on page 1of 11

************************************************************************

Hide In Picture (HIP)


version 2.1 - October, 2002
Copyright (C) 2002 Davi Tassinari de Figueiredo
************************************************************************

---------------------
Table of contents
---------------------
- Introduction
- License and disclaimer
- Legal warning
- Available packages
- Files in HIP binaries package
- Version history
- Basic concepts
- Features
- Using HIP for DOS/Linux
- Using HIP for Windows
- Error messages
- Security recommendations
- How HIP works
- Translating HIP
- Credits

----------------
Introduction
----------------
Hide In Picture (HIP) is a steganography program. It is a program that
allows you to "hide" any kind of file inside standard bitmap pictures.
The pictures look like normal images, so people will not suspect they
contain hidden data.
You can use a password to hide your files, and only those who know the
password use are able to retrieve them - without it, people cannot even
be sure there is something hidden in the image.
I hope you enjoy HIP. If you have any doubts, comments, bug reports or
suggestions for future versions, please e-mail me at davitf at eml.cc
(the address is not written directly to avoid spammers; simply replace
at with @). The latest version of this program is available at
http://hide-in-picture.sf.net/. If you cannot understand any part of
this documentation, I'm sorry; please tell me so that I can improve it.

--------------------------
License and disclaimer
--------------------------
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
The full GNU General Public License is in the file COPYING.
----------------------
NOTE: The Win32Lib library (used by the Windows version) has the
following license terms:
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software.
2. If you use this software in a product, acknowledgement in the
product's documentation and binary are required.
3. Altered source versions, and works substantially derived from the
it, must...
a) be plainly be marked as such,
b) not be misrepresented as the original software,
c) include this notice, unaltered.

-----------------
Legal warning
-----------------
Many countries have laws restricting the export or use of cryptography.
The algorithms implemented in this program are rather strong, so it
might be illegal for you to use it, or you might need to get special
permission in order to use it. Before using this program, you should be
sure that what you are going to do is legal in your country. If you do
not know about the regulations for your country, visit Crypto Law Survey
at http://cwis.kub.nl/frw/people/koops/lawsurvy.htm. The author takes no
responsibility for illegal use of the program.
This program is able to read and write GIF files. However, Unisys has
patents for the compression algorithm used by these files (LZW) in the
United States, United Kingdom, France, Italy, Germany, Canada and Japan;
if you are in any of these countries, you are not allowed to use the GIF
reading/writing capabilities without obtaining a license from Unisys (I
am not a lawyer, so this information may be inaccurate).

----------------------
Available packages
----------------------
There are several packages available for HIP, all of which can be
downloaded from the HIP page. Here is a list, with a brief description
of each one.
Because of patent concerns in some countries regarding GIF files (see
Legal warning), the source code for handling these files is not included
in the main source package, but in a separate package. Also, there are
two binary packages for each supported language: one of them contains
binaries with GIF support and the other one contains binaries without
this support. If you are in one of the countries where Unisys has
patents on LZW, you should use the _nogif binaries and not use the GIF
handling source code; otherwise, you may use any of the packages (it is
probably better to use the full-featured program).
Source code:
- hip21src - source code for HIP 2.1
- hip21gif - source code GIF file reading/writing with HIP 2.1
- hip21msg - message files in several languages for use with HIP 2.1
Binaries:
There are binaries (executable files) for all the currently available
languages. Each language is represented by a two-letter code in the
package name; the package names below have the letters en, for English,
and you should replace them by the code for the appropriate language.
- hip21_en - binaries for HIP 2.1, with GIF support
- hip21_en_nogif - binaries for HIP 2.1, without GIF support
All the packages are available from the HIP page, at
http://hide-in-picture.sf.net/.

---------------------------------
Files in HIP binaries package
---------------------------------
DOS/Windows binaries
- winhip_XX.exe / winhip_XX_nogif.exe - Windows program file
- hip_XX.exe / hip_XX_nogif.exe - DOS program file
- hip.htm; hip.txt - Documentation (this file)
- COPYING - The GNU General Public License
(you may rename the program files before using them, if you wish)

-------------------
Version history
-------------------
- Version 1.0 : first release.
- Version 1.1 : hiding/retrieving is faster, but not compatible with
v1.0 hidden files; first Windows version.
- Version 2.0 beta : completely rewritten code. Faster, safer, bug
fix, support for other encryption algorithms, support for
transparent colors, no longer limited to hiding one bit per picture
byte, better user interface... not compatible with v1.x hidden
files.
- Version 2.0 : cleaner code, GUI improvements in Windows version,
paletted pictures not compatible with beta version (due to a fix to
avoid possible problems when dealing with other graphic formats),
added erase option, improved documentation.
- Version 2.1 : support for reading and writing GIF files, support for
special characters in the program messages, -iX (image format)
option in command-line version, new image displaying method in
Windows version (less flickering), minor bug fixes, minor code and
documentation improvements, smaller binaries (due to new Euphoria
version used in compilation).

------------------
Basic concepts
------------------
HIP hides data inside a picture by modifying its colors in a way that is
almost unnoticeable by the human eye. When a file is hidden, it conceals
each part in an area of the picture; the areas used to store each part
of the file are chosen by doing several calculations with the password
given. When retrieving a file, the same calculations are done to the
password and, knowing which area contains each part of the file, it can
be reconstructed. If the wrong password is used when retrieving a file,
HIP will try to read the file from the wrong areas and will not find
anything there.
When a file is hidden in a picture that already has something in it, the
new file may be written in areas where the previous data was stored (as
HIP has no way of knowing that it was already there), so the old file
will be erased or corrupted. Also notice that a large file will need
more areas to be fully hidden than a small one, so it may be easier to
see the modifications in the picture. If you hide a file that is too
large, there will be a lot of "noise" in the picture and it will be easy
to notice there is something hidden in the picture, even if other people
cannot see what is actually hidden in it. For a somewhat more technical
explanation about how hiding works, please read How HIP works. Before
using HIP to hide important data, please read Security recommendations.

------------
Features
------------
Here are some HIP features you may want to know about:
- Encryption - All data is encrypted before being written to a
picture, to increase security. HIP offers several (well, currently
only two) encryption algorithms you can choose from; all of them are
considered very secure, so you don't have to worry about it unless
you have a specific reason for wanting to use a specific algorithm.
When retrieving a file, HIP tries using all the available algorithms
to find the correct one.
- Transparent color support - One color of the picture may be set as
'transparent'; nothing will be stored in areas of this color. This
can be useful, for example, when hiding a file in an image from a
Web page, as its transparent areas will remain as they were before.
To retrieve a file hidden using this option, you must set the
transparent color to the same used when hiding it. Transparent
colors for GIF files are automatically loaded/saved.
- Erase file option - If you want to remove a file hidden in a
picture, use this option. It will overwrite the file with random
data, so the file will be unrecoverable. If you know the password
with which the file was hidden, you can provide it and only the
necessary areas will be overwritten, resulting in a very small
quality loss; however, if you provide the wrong password, the file
will not be erased properly. If you do not provide a password, HIP
will overwrite more of the picture to account for all the possible
passwords, causing a larger quality loss.

---------------------------
Using HIP for DOS/Linux
---------------------------
HIP for Dos/Linux is a command-line utility.
To hide a file inside a picture, use:
hip h source_image input_file [destination_image] [options]
If the destination image name is not specified, the destination image is
written on top of the source image.
To retrieve a file from a picture, use:
hip r source_image [output_file] [options]
If the output file name is not specified, the name saved in the picture
is used.
To erase a file previously hidden in a picture, use:
hip e source_image [destination_image] [options]
If the destination image name is not specified, the destination image is
written on top of the source image.
Options:
-fxxxxxx - file name to write in image
By default, the name of the input file is written in the image. Use
this option to specify a different name to write. If you use it
without specifying a file name, no name is written.
-pxxxxxx - password to use
When used with the hide or retrieve operations, this option specifies
the password to use for hiding/retrieving the file. If you do not use
this option, you will be asked to enter a password (recommended). When
used with the erase operation, HIP assumes there is a file hidden with
the specified password and overwrites only the first bits of the
hidden data; if the image contains a file hidden with a different
password, it will not be erased correctly.
-thh or -thhhhhh - transparent color index or RGB value
Use this option to set the transparent color for the image. To specify
the palette index for the transparent color of an 8-bit image, use two
hexadecimal digits (00-FF). To specify the RGB value for the
transparent color, use six hexadecimal digits (the first two represent
the red component, the next two represent the green one and the last
two, the blue one). If you specify the RGB value for the transparent
color of an 8-bit image and there is more than one palette entry with
that color, the one with the lowest index will be used.
-ex - encryption algorithm
Use this option to choose the encryption algorithm: a for Blowfish
(default) or b for Rijndael.
-ix - image format
Use this option to choose the image format for the output file. If the
format is not specified, HIP will choose the format based on the file
extension; if the extension is not recognized, the file will be saved
as a Windows Bitmap (BMP) picture.
-c - write the CRC-32 of the data
Use this option to append a checksum to the data to identify data
corruption. This is enabled by default.
-C - do not write the CRC-32 of the data
Use this option if you do not wish to append a checksum to the data;
see above.
-h - hide the password characters
If the p option is not used, the program asks the user for the
password. Use this option to show *'s (asterisks) instead of the
password characters. This is enabled by default.
-H - do not hide the password characters
Use this option to show the password characters while you are typing
them.
-v - view file information only
Use this option if you only want to see whether the file fits inside
the picture when hiding, or the name and size of the hidden file when
retrieving. The destination image or output file is not written.
-q -quiet mode
Use this option if you do not want to see unnecessary messages (such
as the file information and status bars). The only things that will be
shown are password prompts, confirmation messages and error messages.
-y -answer 'yes' to all confirmation questions
By default, the program asks for confirmation before overwriting a
file that already exists. If this option is specified, you will not be
asked for confirmation.

-------------------------
Using HIP for Windows
-------------------------
HIP for Windows is a GUI (graphical user interface) application, which
is intended to be easy to use and understand. You can open a picture by
selecting the 'Open picture...' item on the File menu of the main window
or by clicking the Open button on the window, and then choosing the file
you wish to open. You can also drag and drop a picture into the main
window. When you open a picture, it is displayed in a new window.
Hiding a file
To hide a file inside a picture, select the 'Hide file...' item in the
Image menu or click the Hide button, and choose the file you want to
hide. You can also drag and drop the file into the picture.
An Options window will then appear. In it, you can type the password
to use, change the file name which will be written along with the
file, choose the encryption algorithm for the file, and say whether
you want a checksum to be written along with the file (recommended).
Press the Ok button when you are done.
The file will then be hidden in the picture. A progress window will be
shown during this process; if you wish to abort it, click the Stop
button or close this window. When the process is complete, the window
containing the picture will show the modified picture.
Click the Save button or select the 'Save picture' item in the Image
menu to save the modified image on top of the original one. If you do
not want to overwrite the original picture, click the Save As button
or select the 'Save picture as...' item in the menu. Please note that
the file format selected in the Save file dialog box does not really
have an effect on the format used to save the picture; the file format
is selected from the file extension (this is a bug, not a feature; I
hope to be able to fix it soon).
Retrieving a file
To retrieve a file hidden inside a picture, click the Retrieve button
or select the 'Retrieve file...' item in the Image menu, and wait
while HIP converts the pixels in the picture into the data which it
will try to read. You can cancel the operation by closing the progress
window or clicking the Stop button.
Next, an Options window will appear. Type the same password used to
hide the picture (remember that passwords are case-sensitive). If it
is correct, you will see a Save file dialog where you can change the
directory and/or the name of the retrieved file if you wish. When you
press the Ok button, the file will be retrieved. During this process,
you will see the progress window. If you have read this far, you
probably already know how to cancel this operation.
When the progress window disappears, the retrieving process is
finished. If the checksum was written with the data and the hidden
file has been corrupted, you will see a warning message.
Setting the transparent color
To select a transparent color for the picture, select the 'Transparent
color...' item in the Image menu. If the picture contains a palette,
you will be asked for the palette index of the transparent color;
otherwise, you will be asked for its red-green-blue value.
Getting information about the picture
You can see some information about the picture by selecting the
'Picture information...' item in the Image menu. You will see its file
name, its dimensions and number of bits used per pixel, the currently
set transparent color and the maximum number of bytes the picture can
store. Please note that you cannot hide a file as large as this; some
of these bytes will be used to store information about the file
(typically, 32 bytes will be used, plus the length of the file name).
Remember that, if the file hidden uses too much of the available
space, the quality of the picture will be severely reduced.

------------------
Error messages
------------------
xxxxxx is corrupted
The bitmap file could not be read because there are errors in it.
xxxxxx contains unsupported features
The bitmap file is of a type not currently supported by HIP. It may be
compressed, or not a 8-bit or 24-bit image.
A file name must be specified for retrieving this file
The file name was not saved in the picture, so a file name to save the
retrieved file must be specified.
Aborted by user
The user has aborted the execution of the program.
Cannot save a x-bit picture as a xxx file
The chosen image format cannot store pictures with the bit depth of
the current image. If this happens, try choosing another format.
Color not found in palette
A RGB value for the transparent color of an 8-bit image was specified,
but the color was not found in the palette.
File is too big to be hidden in picture
No need to explain it. Try using a larger picture.
File was hidden with a newer version of HIP
Newer versions of HIP may contain features (such as compression) which
are not known by this version. If this happens, get a newer version of
the program.
Filesystem error while reading xxxxxx
There was a filesystem problem while the program was reading the file.
Hidden data is corrupted
The program found the data in the image, but there is something wrong
with it. Possible causes: a graphics program has corrupted the hidden
data, or there has been a transmission or storage error. Anyway, the
file is saved, but some or all of it may be unreadable.
No hidden file found
The program could not find the hidden file in the image. Possible
causes: there is no hidden file in it (or it has been erased), the
password is wrong, the transparent color in the picture is not set
correctly, or the hidden data in the picture has been corrupted.
Not enough memory
There is not enough memory to load the bitmap image into memory.
Transparent color must be a RGB triplet for 24-bit pictures
A palette entry was specified for the transparent color of a 24-bit
image.
Unable to open xxxxxx
The program could not open the file for reading or writing. Possible
causes: the file does not exist (reading), it is read-only (writing),
or it is in use by other program.
Unknown error in xxxxxx: xx
If this ever happens, there is a bug in HIP. A routine has returned an
error code the main program does not know about. Please report this to
me.

----------------------------
Security recommendations
----------------------------
Security was a primary concern in HIP's design. However, if you want to
be sure nobody will find out that one of your pictures contains hidden
data or, even worse, retrieve the hidden file, you should follow these
guidelines:
- Do not use short passwords or passwords that can be easily guessed
(such as your name, phone number, or a single word), as an attacker
could automatically try all of these passwords. Use different
capitalizations, combinations of words, numbers and punctuation
marks, and anything else you can think of.
- Do not use pictures available from the Internet or other
publicly-available sources. The best source for pictures is scanning
photographs - preferably your own. This is because if someone finds
the original picture, they will be able to see yours is somewhat
different, and may suspect there is hidden data in it - even if they
cannot read it.
- Erase the original picture after you have hidden the file. The
reason is the same as the one above - if someone finds the original
picture, they might suspect something. If possible, use a program
that wipes (overwrites) the data when deleting it; PGP
(http://www.pgpi.org/) is able to do this.
- Do not use computer-generated images. They might have large areas
filled with a single color or containing linear fades, and small
changes in those areas can be easily noticed. It is also possible to
identify changes in other computer-generated images such as
fractals.
- Do not write files that are too big, or the noise in the picture
will be easily noticed and someone may suspect there is hidden data
in it. For 24-bit images, you should not write files larger than
about 40% of the picture size. For 8-bit images, the files should be
even smaller. These values are only estimates, and are not valid in
all cases. After the hiding proccess, take a close look at the
resulting picture - if you think its quality is worse than that of
the original, you should use a larger picture.
Even if you follow all of these, remember that no program or algorithm
is completely safe. The author does not take responsibility for any
problems that may arise from security flaws or errors in the program.You
should not trust this program for hiding critical data; if that is the
case, get professional advice.

-----------------
How HIP works
-----------------
A bitmap picture is simply a series of numbers representing color
intensities, one color for each pixel (point) of the picture. HIP hides
a file inside a picture by placing its bits in the least-significant
bits of each color in the picture. Suppose you have a picture containing
the following bytes:
200 53 2 195 54 69 191 56
The binary values of these numbers are:
11001000 00110101 00000010 11000011 00110110 01000101 10111111 00111000
To hide the character 109 (in binary 01101101), the least-significant
bit of each byte would be replaced by a bit of the character. The result
would be:
11001000 00110101 00000011 11000010 00110111 01000101 10111110 00111001
Which corresponds to:
200 53 3 194 55 69 190 57
The difference between the new values and the old ones is very small, so
it is difficult, if not impossible, for the human eye to identify any
difference from the original picture. If the file is large, it may be
necessary to modify more than a single bit from each byte of the
picture, which can make this difference more visible.
With 8-bit pictures, the process is a little more complicated, because
the bytes in the picture do not represent color intensities, but entries
in the palette (a table of at most 256 different colors). HIP chooses
the nearest color in the palette whose index contains the appropriate
least-significant bits.
The HIP header (containing information for the hidden file, such as its
size and filename) and the file to be hidden are encrypted with an
encryption algorithm, using the password given, before being written in
the picture. Their bits are not written in a linear fashion; HIP uses a
pseudo-random number generator to choose the place to write each bit.
The values given by the pseudo-random number generator depend on your
password, so it is not possible for someone trying to read your secret
data to get the hidden file (not even the encrypted version) without
knowing the password.
A document describing the HIP file format may be written if anyone wants
it. If you need it (to analyze it, write a compliant program or for any
other reason), please tell me.

-------------------
Translating HIP
-------------------
If you want to translate HIP into other languages, please get the
hip21src or hip21msg package (see Available packages) and translate the
messages in m_en.e (please read the information there). I would really
like if you could send me the translated file, so that I can include it
with future versions and distribute binaries for the translated program.
There are already several translations available, and others may become
available at any time. The HIP page contains binaries for all the
languages.
-----------
Credits
-----------
HIP has been written in Euphoria by Rapid Deployment Software
(http://www.rapideuphoria.com/). The binaries were compiled with version
2.3.
It uses many libraries by myself (http://www16.brinkster.com/davitf/).
The assembly routines were converted into machine code by Pete
Eberlein's ASM to Euphoria converter
(http://www.harborside.com/home/x/xseal/euphoria/).
The Windows version also uses the Win32Lib library by David Cuny, Derek
Parnell and others (http://www.sourceforge.net/projects/win32libex/).

You might also like