Skip to content

Commit e9967c7

Browse files
committed
Importing 0.2 version
1 parent 241a86a commit e9967c7

38 files changed

+1734
-576
lines changed

CVS/Entries

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/STIRMARK-README/1.1.1.1/Mon May 1 19:57:38 2000//
2+
/TODO/1.2/Mon May 1 20:09:05 2000//
3+
/arc.c/1.2/Mon May 1 21:47:58 2000//
4+
/arc.h/1.2/Mon May 1 21:47:58 2000//
5+
/config.h.bot/1.1.1.1/Mon May 1 19:57:38 2000//
6+
/fourier.c/1.2/Mon May 1 21:01:06 2000//
7+
/fourier.h/1.2/Mon May 1 21:01:06 2000//
8+
/golay.c/1.1.1.1/Mon May 1 19:57:38 2000//
9+
/golay.h/1.1.1.1/Mon May 1 19:57:38 2000//
10+
/install-sh/1.1.1.1/Mon May 1 19:57:38 2000//
11+
/jpeg-6b-steg.diff/1.1.1.1/Mon May 1 19:57:38 2000//
12+
/seek_script/1.1.1.1/Mon May 1 19:57:38 2000//
13+
D/jpeg-6b-steg////
14+
/jpg.h/1.2/Wed Jan 17 23:47:37 2001//
15+
/ChangeLog/1.3/Sat Jan 20 23:14:06 2001//
16+
/README/1.8/Tue Feb 13 00:05:25 2001//
17+
/iterator.c/1.4/Tue Feb 13 00:29:48 2001//
18+
/iterator.h/1.4/Tue Feb 13 00:30:08 2001//
19+
/jpg.c/1.9/Tue Feb 13 00:29:07 2001//
20+
/outguess.h/1.11/Tue Feb 13 00:29:19 2001//
21+
/pnm.c/1.4/Tue Feb 13 00:29:33 2001//
22+
/pnm.h/1.3/Tue Feb 13 00:29:28 2001//
23+
/outguess.1/1.7/Tue Feb 13 00:42:15 2001//
24+
D/missing////
25+
/config.h.in/1.3/Tue Feb 13 19:26:18 2001//
26+
/histogram.c/1.2/Tue Feb 13 19:57:38 2001//
27+
/outguess.c/1.16/Tue Feb 13 19:19:23 2001//
28+
/Makefile.in/1.5/Tue Feb 13 21:03:31 2001//
29+
/configure/1.4/Tue Feb 13 21:05:08 2001//
30+
/configure.in/1.4/Tue Feb 13 21:05:02 2001//

CVS/Repository

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
outguess

CVS/Root

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
provos@monkey.org:/cvs

ChangeLog

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
OutGuess 0.2
2+
--------------
3+
2000-01-20 - Niels Provos <provos@citi.umich.edu>
4+
- Use statistical corrections to defend against steganalysis.
5+
6+
2000-04-01 - Niels Provos <provos@citi.umich.edu>
7+
- A lot of cleanup.
8+
- Use all DCT coefficients for JPG now. This version is not any more
9+
compatible with the previous versions.
10+
111
OutGuess 0.13b
212
--------------
313
1999-08-06 - Niels Provos <provos@citi.umich.edu>

Makefile.in

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,22 @@ JPEGDEP = $(JPEGDIR)/libjpeg.a
2727
# CFLAGS += -DFOURIER -I/usr/local/include
2828
# LIBS += -L/usr/local/lib -lrfftw -lfftw
2929

30-
OBJ = outguess.o golay.o arc.o pnm.o jpg.o @MD5OBJ@
30+
MISSING = @LIBMISSING@
31+
OBJ = outguess.o golay.o arc.o pnm.o jpg.o iterator.o
3132

32-
all: outguess
33+
all: outguess extract histogram
3334

34-
outguess: $(JPEGDEP) $(OBJ)
35-
$(CC) $(CFLAGS) $(INCS) -o $@ $(OBJ) $(LDFLAGS) $(LIBS)
35+
$(MISSING):
36+
$(CC) $(CFLAGS) $(INCS) -c @MISSINGOBJ@
37+
38+
outguess: $(JPEGDEP) $(OBJ) $(MISSING)
39+
$(CC) $(CFLAGS) $(INCS) -o $@ $(OBJ) $(MISSING) $(LDFLAGS) $(LIBS)
40+
41+
histogram: histogram.o $(MISSING)
42+
$(CC) $(CFLAGS) $(INCS) -o $@ histogram.o $(MISSING)
43+
44+
extract: outguess
45+
ln -sf outguess $@
3646

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

4454
clean:
45-
rm -f outguess *~ $(OBJ)
55+
rm -f outguess extract histogram histogram.o *~ $(OBJ) $(MISSING)
4656

4757
distclean: clean
4858
cd $(JPEGDIR); $(MAKE) $@

README

Lines changed: 54 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
OutGuess 0.13b
1+
OutGuess 0.2
22
--------------
3-
1999-08-06 - Niels Provos <provos@citi.umich.edu>
3+
2001-02-12 - Niels Provos <provos@citi.umich.edu>
44

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

14-
OutGuess is available under the BSD software license. Please see each
15-
source file for its respective license. OutGuess was written in
16-
Germany, and CONTAINS CRYPTOGRAPHIC FUNCTIONS.
17-
18-
Steganography is the art of hiding the fact that communication is
19-
happening. Classical steganography systems depend on keeping the
20-
encoding system secret, but modern steganography should only be
21-
detectable if a secret information, e.g. a secret key is known. But
22-
because of their invasive nature they leave detectable traces within
23-
an image's characteristics, e.g. its Fourier signature, and hence
24-
allow an eavesdropper to detect images which have been modified, and
25-
thus giving away the fact that secret communication is happening. The
26-
secret of the information is not degraded, its hidden nature is
27-
revealed, defeating the whole purpose of Steganography.
28-
29-
A more processor- and space-intensive alternative is to match existing
30-
images against the source data in order to minimize the number of
31-
modifications required to express the original message.
14+
OutGuess is available under the BSD software license. It is
15+
completely free for any use including commercial.
16+
17+
Please see each source file for its respective license. OutGuess was
18+
developed in Germany.
19+
20+
Steganography is the art and sience of hiding that communication is
21+
happening. Classical steganography systems depend on keeping the
22+
encoding system secret, but modern steganography are detectable only
23+
if secret information is known, e.g. a secret key. Because of their
24+
invasive nature steganography systems leave detectable traces within a
25+
medium's characteristics. This allows an eavesdropper to detect media
26+
that has been modified, revealing that secret communication is taking
27+
place. Although the secrecy of the information is not degraded, its
28+
hidden nature is revealed, defeating the main purpose of
29+
Steganography.
30+
31+
For JPEG images, OutGuess preserves statistics based on frequency
32+
counts. As a result, no known statistical test is able to detect
33+
the presence of steganographic content. Before embedding data
34+
into an image, the OutGuess system can determine the maximum
35+
message size that can be hidden while still being able to maintain
36+
statistics based on frequency counts.
3237

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

40-
A bias is introduced that favors the modification of bits that were
41-
extracted from a high value, and tries to avoid the modification of
42-
bits that were extracted from a low value.
43-
4445
A sample output from OutGuess is as follows:
4546

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

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

67-
Additionally, OutGuess allows to hide an arbitrary number of messages
68-
in the data. Thus it also provides plausible deniablity. It keeps
69-
track of the bits that have been modified previously and locks them.
70-
A (23,12,7) Golay code is used for error correction to tolerate
71-
collisions on locked bits. Artifical errors are introduced to avoid
72-
modifying bits that have a hight bias.
73-
74-
IN THIS VERSION, OUTGUESS ONLY INSERTS TWO DIFFERENT MESSAGES. THE
75-
RELEASE VERSION WILL HANDLE AN ARBITRARY NUMBER.
76-
77-
The available command line options are, capital letters specify options
78-
for the second message,
79-
80-
-k <key> The secret key used to encrypt and hide the message in
81-
the provided data.
82-
83-
-d <filename> The filename specifying the message to be hidden in the
84-
data.
85-
86-
-i <n> The upper limit in finding an optimal iterator seed. The
87-
maximum value for the limit is 65536.
88-
89-
-s <n> The initial seed the iterator object uses for
90-
selecting bits in the redundant data. If no upper limit
91-
is specified, the iterator will use this seed without
92-
searching for a more optimal embedding.
93-
94-
-e Use error correction for data encoding and decoding.
95-
96-
Other options that apply to the general executions of OutGuess are
97-
98-
-r Retrieve a message from a data object. If this option
99-
is not specified, OutGuess will embed messages.
100-
101-
-x <n> If the second key does not create an iterator object
102-
that is successful in embedding the data, the program
103-
will derive up to <n> new keys.
104-
105-
-p "param" Passes a string as parameter to the destination data
106-
handler. For the JPEG image format, this is the
107-
compression quality, it can take values between 75 and
108-
100. The higher the quality the more bits to hide
109-
a message in the data are available.
110-
111-
-t Collect statistics about redundant bit usage. Repeated
112-
't's increase output level. Probably meaningless to
113-
most.
114-
115-
For embedding messages, you need to specify a source and a destination
116-
filename. OutGuess determines the data format by the filename extension.
117-
If no filenames are specified OutGuess operates as filter and assumes
118-
the PPM data format.
119-
120-
For example
121-
122-
outguess -k "my secret pass phrase" -d hidden.txt monkey.jpg out.jpg
123-
124-
embeds the message 'hidden.txt' into the 'monkey.jpg' image. In the
125-
other direction
126-
127-
outguess -k "my secret pass phrase" -r out.jpg message.txt
128-
129-
will retrieve the hidden message from the image.
130-
131-
If you want to embed a second message, use
132-
133-
outguess -k "secret1" -d hide1.txt -E -K "secret2" -D hide2.txt \
134-
monkey.jpg out.jpg
135-
136-
OutGuess will first embed "hide1.txt" and then "hide2.txt" on top of
137-
it, using error correcting codes. The second message "hide2.txt" can
138-
be retrieved with
139-
140-
outguess -k "secret2" -e -r out.jpg message.txt
69+
Additionally, OutGuess allows to hide multiple messages in the data.
70+
Thus, it also provides plausible deniablity. It keeps track of the
71+
bits that have been modified previously and locks them. A (23,12,7)
72+
Golay code is used for error correction to tolerate collisions on
73+
locked bits. Artifical errors are introduced to avoid modifying bits
74+
that have a hight bias.
14175

76+
This version of OutGuess can insert only two different messages.
14277
As this is a BETA version, I would like you to give me feedback on
143-
the usefulness of OutGuess.
78+
the usefulness of OutGuess. And if you like it, you can support
79+
me via the links on
80+
81+
http://www.outguess.org/
14482

14583
Installation
14684
------------
@@ -149,6 +87,9 @@ should require only
14987

15088
1. ./configure && make
15189

90+
There is an optimization bug in gcc, you might have to compile
91+
with -O0.
92+
15293
If your system is not supported, trying building by hand as follows
15394

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

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

173108
Acknowledgments:
174109
----------------

README-FIRST

Lines changed: 0 additions & 8 deletions
This file was deleted.

TODO

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +0,0 @@
1-
save detecability of bits for bitmaps, as weight

arc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,14 @@ arc4_addrandom(struct arc4_stream *as, u_char *dat, int datlen)
104104
}
105105

106106
void
107-
arc4_initkey(struct arc4_stream *as, u_char *key, int keylen)
107+
arc4_initkey(struct arc4_stream *as, char *type, u_char *key, int keylen)
108108
{
109109
MD5_CTX ctx;
110110
u_char digest[16];
111111

112112
/* Bah, we want bcrypt */
113113
MD5Init(&ctx);
114+
MD5Update(&ctx, type, strlen(type));
114115
MD5Update(&ctx, key, keylen);
115116
MD5Final(digest, &ctx);
116117

arc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,6 @@ void arc4_init(struct arc4_stream *as);
5353
u_int8_t arc4_getbyte(struct arc4_stream *as);
5454
u_int32_t arc4_getword(struct arc4_stream *as);
5555
void arc4_addrandom(struct arc4_stream *as, u_char *dat, int datlen);
56-
void arc4_initkey(struct arc4_stream *as, u_char *key, int keylen);
56+
void arc4_initkey(struct arc4_stream *as, char *type, u_char *key, int keylen);
5757

5858
#endif /* _ARC_H */

0 commit comments

Comments
 (0)