1: // decode -- Steganographically decode a message from a fax image. 4: #include <iostream.h> 5: #include <fstream.h> 6: #include <sys/stat.h> 7: #include <stdlib.h> 8: #include <stdio.h> 10: #include "bit_array.H" 11: #include "permuted_sample.H" 14: // Calling Sequence: 15: // 16: // stegafax decode <seed> <stega_file> <ciphertext_file> 17: // 18: int decode(int nargs, char* args[]) { 20: // Get the parameeters. 22: char* SEED = args[2]; 23: char* STEGA_FILE = args[3]; 24: char* CIPHERTEXT_FILE = args[4]; 26: // Read in the stega raster. 28: ifstream stega_file(STEGA_FILE); 29: stega_file.ignore(3); // trash the raster's magic number 30: long rows; // number of rows in raster 31: stega_file >> rows; // get number of rows from pbm file 32: long cols; // number of collums in raster 33: stega_file >> cols; // get number of cols from pbm file 34: stega_file.ignore(1); // discard terminal newline 35: long npixels = rows*cols; // number of pixels in raster 36: long nbytes = (npixels + 7)/8; // number of bytes in raster 37: bit_array raster(rows, cols); // make a bit array to hold the pbm raster 38: stega_file.read(raster.bytes, nbytes); // read the pbm raster file into it 40: // Extract the original cyphertext length from the last 32 bits of the stega raster. 42: long ciphertext_length = 0; 43: long i; 44: for (i = 32; i >= 1; i--) { 45: ciphertext_length = ciphertext_length*2 + raster(npixels - i); 46: } 47: bit_array ciphertext(ciphertext_length); // make a bit array to hold the ciphertext 49: // Instantiate a random number generator. 51: int seed = atoi(SEED); 52: prng rand(seed); 54: // Generate the spots where the ciphertext was mingled. 56: permuted_sample spot(rand, ciphertext_length, npixels - 32); // reserve last 32 bits for cyphertext length 58: // Extract the ciphertext from the stega raster. 60: for (i = 0; i < ciphertext_length; i++ ) { 61: ciphertext.set(i, raster(spot(i))); // extract one bit of the hidden message 62: } 64: // Output the stegafax raster. 66: ofstream ciphertext_file(CIPHERTEXT_FILE); 67: ciphertext_file.write(ciphertext.bytes, nbytes); // output ciphertext file 69: return 0; 70: }