Skip to content

Commit

Permalink
Importing 0.2 version
Browse files Browse the repository at this point in the history
  • Loading branch information
eribertomota committed Nov 10, 2018
1 parent 241a86a commit e9967c7
Show file tree
Hide file tree
Showing 38 changed files with 1,734 additions and 576 deletions.
30 changes: 30 additions & 0 deletions CVS/Entries
@@ -0,0 +1,30 @@
/STIRMARK-README/1.1.1.1/Mon May 1 19:57:38 2000//
/TODO/1.2/Mon May 1 20:09:05 2000//
/arc.c/1.2/Mon May 1 21:47:58 2000//
/arc.h/1.2/Mon May 1 21:47:58 2000//
/config.h.bot/1.1.1.1/Mon May 1 19:57:38 2000//
/fourier.c/1.2/Mon May 1 21:01:06 2000//
/fourier.h/1.2/Mon May 1 21:01:06 2000//
/golay.c/1.1.1.1/Mon May 1 19:57:38 2000//
/golay.h/1.1.1.1/Mon May 1 19:57:38 2000//
/install-sh/1.1.1.1/Mon May 1 19:57:38 2000//
/jpeg-6b-steg.diff/1.1.1.1/Mon May 1 19:57:38 2000//
/seek_script/1.1.1.1/Mon May 1 19:57:38 2000//
D/jpeg-6b-steg////
/jpg.h/1.2/Wed Jan 17 23:47:37 2001//
/ChangeLog/1.3/Sat Jan 20 23:14:06 2001//
/README/1.8/Tue Feb 13 00:05:25 2001//
/iterator.c/1.4/Tue Feb 13 00:29:48 2001//
/iterator.h/1.4/Tue Feb 13 00:30:08 2001//
/jpg.c/1.9/Tue Feb 13 00:29:07 2001//
/outguess.h/1.11/Tue Feb 13 00:29:19 2001//
/pnm.c/1.4/Tue Feb 13 00:29:33 2001//
/pnm.h/1.3/Tue Feb 13 00:29:28 2001//
/outguess.1/1.7/Tue Feb 13 00:42:15 2001//
D/missing////
/config.h.in/1.3/Tue Feb 13 19:26:18 2001//
/histogram.c/1.2/Tue Feb 13 19:57:38 2001//
/outguess.c/1.16/Tue Feb 13 19:19:23 2001//
/Makefile.in/1.5/Tue Feb 13 21:03:31 2001//
/configure/1.4/Tue Feb 13 21:05:08 2001//
/configure.in/1.4/Tue Feb 13 21:05:02 2001//
1 change: 1 addition & 0 deletions CVS/Repository
@@ -0,0 +1 @@
outguess
1 change: 1 addition & 0 deletions CVS/Root
@@ -0,0 +1 @@
provos@monkey.org:/cvs
10 changes: 10 additions & 0 deletions ChangeLog
@@ -1,3 +1,13 @@
OutGuess 0.2
--------------
2000-01-20 - Niels Provos <provos@citi.umich.edu>
- Use statistical corrections to defend against steganalysis.

2000-04-01 - Niels Provos <provos@citi.umich.edu>
- A lot of cleanup.
- Use all DCT coefficients for JPG now. This version is not any more
compatible with the previous versions.

OutGuess 0.13b
--------------
1999-08-06 - Niels Provos <provos@citi.umich.edu>
Expand Down
20 changes: 15 additions & 5 deletions Makefile.in
Expand Up @@ -27,12 +27,22 @@ JPEGDEP = $(JPEGDIR)/libjpeg.a
# CFLAGS += -DFOURIER -I/usr/local/include
# LIBS += -L/usr/local/lib -lrfftw -lfftw

OBJ = outguess.o golay.o arc.o pnm.o jpg.o @MD5OBJ@
MISSING = @LIBMISSING@
OBJ = outguess.o golay.o arc.o pnm.o jpg.o iterator.o

all: outguess
all: outguess extract histogram

outguess: $(JPEGDEP) $(OBJ)
$(CC) $(CFLAGS) $(INCS) -o $@ $(OBJ) $(LDFLAGS) $(LIBS)
$(MISSING):
$(CC) $(CFLAGS) $(INCS) -c @MISSINGOBJ@

outguess: $(JPEGDEP) $(OBJ) $(MISSING)
$(CC) $(CFLAGS) $(INCS) -o $@ $(OBJ) $(MISSING) $(LDFLAGS) $(LIBS)

histogram: histogram.o $(MISSING)
$(CC) $(CFLAGS) $(INCS) -o $@ histogram.o $(MISSING)

extract: outguess
ln -sf outguess $@

$(JPEGDEP):
cd $(JPEGDIR); $(MAKE) libjpeg.a
Expand All @@ -42,7 +52,7 @@ install: all
$(INSTALL_DATA) outguess.1 $(install_prefix)$(mandir)

clean:
rm -f outguess *~ $(OBJ)
rm -f outguess extract histogram histogram.o *~ $(OBJ) $(MISSING)

distclean: clean
cd $(JPEGDIR); $(MAKE) $@
Expand Down
173 changes: 54 additions & 119 deletions README
@@ -1,6 +1,6 @@
OutGuess 0.13b
OutGuess 0.2
--------------
1999-08-06 - Niels Provos <provos@citi.umich.edu>
2001-02-12 - Niels Provos <provos@citi.umich.edu>

OutGuess is a universal steganographic tool that allows the insertion
of hidden information into the redundant bits of data sources. The
Expand All @@ -11,24 +11,29 @@ and JPEG image formats are supported. In the next paragraphs, images
will be used as concrete example of data objects, though OutGuess can
use any kind of data, as long as a handler is provided.

OutGuess is available under the BSD software license. Please see each
source file for its respective license. OutGuess was written in
Germany, and CONTAINS CRYPTOGRAPHIC FUNCTIONS.

Steganography is the art of hiding the fact that communication is
happening. Classical steganography systems depend on keeping the
encoding system secret, but modern steganography should only be
detectable if a secret information, e.g. a secret key is known. But
because of their invasive nature they leave detectable traces within
an image's characteristics, e.g. its Fourier signature, and hence
allow an eavesdropper to detect images which have been modified, and
thus giving away the fact that secret communication is happening. The
secret of the information is not degraded, its hidden nature is
revealed, defeating the whole purpose of Steganography.

A more processor- and space-intensive alternative is to match existing
images against the source data in order to minimize the number of
modifications required to express the original message.
OutGuess is available under the BSD software license. It is
completely free for any use including commercial.

Please see each source file for its respective license. OutGuess was
developed in Germany.

Steganography is the art and sience of hiding that communication is
happening. Classical steganography systems depend on keeping the
encoding system secret, but modern steganography are detectable only
if secret information is known, e.g. a secret key. Because of their
invasive nature steganography systems leave detectable traces within a
medium's characteristics. This allows an eavesdropper to detect media
that has been modified, revealing that secret communication is taking
place. Although the secrecy of the information is not degraded, its
hidden nature is revealed, defeating the main purpose of
Steganography.

For JPEG images, OutGuess preserves statistics based on frequency
counts. As a result, no known statistical test is able to detect
the presence of steganographic content. Before embedding data
into an image, the OutGuess system can determine the maximum
message size that can be hidden while still being able to maintain
statistics based on frequency counts.

OutGuess uses a generic iterator object to select which bits in the
data should be modified. A seed can be used to modify the behavior
Expand All @@ -37,110 +42,43 @@ message. By altering the seed, OutGuess tries to find a sequence of
bits that minimizes the number of changes in the data that have to be
made.

A bias is introduced that favors the modification of bits that were
extracted from a high value, and tries to avoid the modification of
bits that were extracted from a low value.

A sample output from OutGuess is as follows:

Reading ....
Extracting usable bits ...
JPEG compression quality set to 91
Encoded data: 1178
Reading dscf0001.jpg....
JPEG compression quality set to 75
Extracting usable bits: 40059 bits
Correctable message size: 21194 bits, 52.91%
Encoded 'snark.bz2': 14712 bits, 1839 bytes
Finding best embedding...
New best: 0: 4709(49.8%), bias 4332(0.92), saved: 3
New best: 5: 4700(49.7%), bias 4290(0.91), saved: 12
New best: 7: 4663(49.3%), bias 4217(0.90), saved: 49
New best: 17: 4644(49.1%), bias 4188(0.90), saved: 68
New best: 121: 4660(49.3%), bias 4169(0.89), saved: 52
121, 8829: Embedding data: 9424 in 81406
Bits embedded: 9456, changed: 4660(49.3%), bias: 4169, tot: 81320, skip: 71864
Total bits changed: 8829 (changed 4660 + bias 4169)
0: 7467(50.6%)[50.8%], bias 8137(1.09), saved: -13, total: 18.64%
1: 7311(49.6%)[49.7%], bias 8079(1.11), saved: 5, total: 18.25%
4: 7250(49.2%)[49.3%], bias 7906(1.09), saved: 13, total: 18.10%
59: 7225(49.0%)[49.1%], bias 7889(1.09), saved: 16, total: 18.04%
59, 7225: Embedding data: 14712 in 40059
Bits embedded: 14744, changed: 7225(49.0%)[49.1%], bias: 7889, tot: 40032, skip: 25288
Foiling statistics: corrections: 2590, failed: 1, offset: 122.585494 +- 239.664983
Total bits changed: 15114 (change 7225 + bias 7889)
Storing bitmap into data...
Writing ....
Writing foil/dscf0001.jpg....

The simple example script "seek_script" uses OutGuess to select an image
that fits the data we want to hide the best, yielding the lowest number
of changed bits. Because we do not care about the actual content of
the cover data we send, this is a very viable approach.

Additionally, OutGuess allows to hide an arbitrary number of messages
in the data. Thus it also provides plausible deniablity. It keeps
track of the bits that have been modified previously and locks them.
A (23,12,7) Golay code is used for error correction to tolerate
collisions on locked bits. Artifical errors are introduced to avoid
modifying bits that have a hight bias.

IN THIS VERSION, OUTGUESS ONLY INSERTS TWO DIFFERENT MESSAGES. THE
RELEASE VERSION WILL HANDLE AN ARBITRARY NUMBER.

The available command line options are, capital letters specify options
for the second message,

-k <key> The secret key used to encrypt and hide the message in
the provided data.

-d <filename> The filename specifying the message to be hidden in the
data.

-i <n> The upper limit in finding an optimal iterator seed. The
maximum value for the limit is 65536.

-s <n> The initial seed the iterator object uses for
selecting bits in the redundant data. If no upper limit
is specified, the iterator will use this seed without
searching for a more optimal embedding.

-e Use error correction for data encoding and decoding.

Other options that apply to the general executions of OutGuess are

-r Retrieve a message from a data object. If this option
is not specified, OutGuess will embed messages.

-x <n> If the second key does not create an iterator object
that is successful in embedding the data, the program
will derive up to <n> new keys.

-p "param" Passes a string as parameter to the destination data
handler. For the JPEG image format, this is the
compression quality, it can take values between 75 and
100. The higher the quality the more bits to hide
a message in the data are available.

-t Collect statistics about redundant bit usage. Repeated
't's increase output level. Probably meaningless to
most.

For embedding messages, you need to specify a source and a destination
filename. OutGuess determines the data format by the filename extension.
If no filenames are specified OutGuess operates as filter and assumes
the PPM data format.

For example

outguess -k "my secret pass phrase" -d hidden.txt monkey.jpg out.jpg

embeds the message 'hidden.txt' into the 'monkey.jpg' image. In the
other direction

outguess -k "my secret pass phrase" -r out.jpg message.txt

will retrieve the hidden message from the image.

If you want to embed a second message, use

outguess -k "secret1" -d hide1.txt -E -K "secret2" -D hide2.txt \
monkey.jpg out.jpg

OutGuess will first embed "hide1.txt" and then "hide2.txt" on top of
it, using error correcting codes. The second message "hide2.txt" can
be retrieved with

outguess -k "secret2" -e -r out.jpg message.txt
Additionally, OutGuess allows to hide multiple messages in the data.
Thus, it also provides plausible deniablity. It keeps track of the
bits that have been modified previously and locks them. A (23,12,7)
Golay code is used for error correction to tolerate collisions on
locked bits. Artifical errors are introduced to avoid modifying bits
that have a hight bias.

This version of OutGuess can insert only two different messages.
As this is a BETA version, I would like you to give me feedback on
the usefulness of OutGuess.
the usefulness of OutGuess. And if you like it, you can support
me via the links on

http://www.outguess.org/

Installation
------------
Expand All @@ -149,6 +87,9 @@ should require only

1. ./configure && make

There is an optimization bug in gcc, you might have to compile
with -O0.

If your system is not supported, trying building by hand as follows

1. Install the JPEG-6b libjpeg.a library and patch it with
Expand All @@ -162,13 +103,7 @@ OutGuess has only been tested on OpenBSD, Linux, Solaris and AIX.

BUGS:
-----
Not all the redundant data available in the JPEG encoding is used,
this is due to a problem when reconstructing the Huffman coefficients.
I have seen cases when two MCU blocks have only the first coefficient
assigned, that the coefficents are the same and do not represent
the Huffman coefficients that were used when the image was created,
and thus getting the bit stream out of sync. So I just ignore the
first coefficent always.
None known at the moment.

Acknowledgments:
----------------
Expand Down
8 changes: 0 additions & 8 deletions README-FIRST

This file was deleted.

1 change: 0 additions & 1 deletion TODO
@@ -1 +0,0 @@
save detecability of bits for bitmaps, as weight
3 changes: 2 additions & 1 deletion arc.c
Expand Up @@ -104,13 +104,14 @@ arc4_addrandom(struct arc4_stream *as, u_char *dat, int datlen)
}

void
arc4_initkey(struct arc4_stream *as, u_char *key, int keylen)
arc4_initkey(struct arc4_stream *as, char *type, u_char *key, int keylen)
{
MD5_CTX ctx;
u_char digest[16];

/* Bah, we want bcrypt */
MD5Init(&ctx);
MD5Update(&ctx, type, strlen(type));
MD5Update(&ctx, key, keylen);
MD5Final(digest, &ctx);

Expand Down
2 changes: 1 addition & 1 deletion arc.h
Expand Up @@ -53,6 +53,6 @@ void arc4_init(struct arc4_stream *as);
u_int8_t arc4_getbyte(struct arc4_stream *as);
u_int32_t arc4_getword(struct arc4_stream *as);
void arc4_addrandom(struct arc4_stream *as, u_char *dat, int datlen);
void arc4_initkey(struct arc4_stream *as, u_char *key, int keylen);
void arc4_initkey(struct arc4_stream *as, char *type, u_char *key, int keylen);

#endif /* _ARC_H */
9 changes: 9 additions & 0 deletions config.h.in
@@ -1,5 +1,11 @@
/* config.h.in. Generated automatically from configure.in by autoheader. */

/* Define if you have strcasecmp, as a function or macro. */
#undef HAVE_STRCASECMP

/* Define if you have snprintf, as a function or macro. */
#undef HAVE_SNPRINTF

/* Define if you have a working `mmap' system call. */
#undef HAVE_MMAP

Expand Down Expand Up @@ -36,6 +42,9 @@
/* Define if you have the <md5.h> header file. */
#undef HAVE_MD5_H

/* Define if you have the <err.h> header file. */
#undef HAVE_ERR_H

/* Define if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H

Expand Down

0 comments on commit e9967c7

Please sign in to comment.