Skip to content

Instantly share code, notes, and snippets.

@zacblazic
Created March 26, 2011 16:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zacblazic/888425 to your computer and use it in GitHub Desktop.
Save zacblazic/888425 to your computer and use it in GitHub Desktop.
Hides a text file within a BMP image
/*
* Author: Zac Blazic (210208880)
* Date: 24/03/2011
* File: Steganography.cpp
*/
#include "Steganography.h"
#include <fstream>
#include <string>
#include <iostream>
using namespace std;
int GetFileSize(string fileName)
{
long begin, end;
ifstream inFile(fileName, ifstream::binary);
inFile.seekg(0, ios::beg);
begin = long(inFile.tellg());
inFile.seekg(0, ios::end);
end = long(inFile.tellg());
inFile.close();
return end - begin;
}
int GetFileRemainderSize(string inputImageFileName, string inputTextFileName, const int HEADER_SIZE, const int PIXEL_SIZE)
{
long begin, end;
ifstream inputImageFile(inputImageFileName, ifstream::binary);
ifstream inputTextFile(inputTextFileName, ifstream::binary);
begin = (HEADER_SIZE + 1) + (GetFileSize(inputTextFileName) * PIXEL_SIZE);
inputImageFile.seekg(0, ios::end);
end = long(inputImageFile.tellg());
inputImageFile.close();
inputTextFile.close();
return end - begin;
}
char* ReadTextFile(string fileName)
{
char *buffer;
int fileSize;
ifstream inFile;
fileSize = GetFileSize(fileName);
buffer = new char[fileSize + 1]; //+1 is for null character
inFile.open(fileName, ifstream::binary);
inFile.seekg(0, ifstream::beg); //Safeguard
inFile.read(buffer, fileSize); //Read entire text file into memory
buffer[fileSize] = '\0'; //Append null character to the end
inFile.close();
return buffer;
}
void WriteHeader(string inputImageFileName, string outputImageFileName, const int HEADER_SIZE)
{
char *header;
header = new char[HEADER_SIZE];
ifstream inputImageFile(inputImageFileName, ifstream::binary);
ofstream outputImageFile(outputImageFileName, ofstream::binary);
//inputImageFile.seekg(0, ifstream::beg); //Safeguard
//outputImageFile.seekp(0, ofstream::beg); //Safeguard
inputImageFile.read(header, HEADER_SIZE); //Read header from input image file
outputImageFile.write(header, HEADER_SIZE); //Write header to output image file
inputImageFile.close();
outputImageFile.close();
delete [] header;
}
void WriteHiddenMessage(string inputImageFileName, string inputTextFileName, string outputImageFileName, char *textFileBuffer, const int HEADER_SIZE, const int PIXEL_SIZE)
{
char *pixelBuffer; //Pixel in memory
pixelBuffer = new char[PIXEL_SIZE];
ifstream inputImageFile(inputImageFileName, ifstream::binary);
ofstream outputImageFile(outputImageFileName, ofstream::binary | ofstream::app);
inputImageFile.seekg(HEADER_SIZE, ios::beg); //check this //Move the get pointer 54 bytes into the file
outputImageFile.seekp(HEADER_SIZE, ios::beg); //check this //Move the put pointer 54 bytes into the file
for(int index = 0; index < GetFileSize(inputTextFileName); index++) //One iteration for each byte of the text file
{
inputImageFile.read(pixelBuffer, PIXEL_SIZE); //Read in a pixel from input image
pixelBuffer[3] = pixelBuffer[3] & char(0); //Bitwise AND 4th byte of the pixel with 00000000 (ASCII 0)
pixelBuffer[3] = pixelBuffer[3] | textFileBuffer[index]; //Bitwise OR 4th byte of the pixel with text file character
outputImageFile.write(pixelBuffer, PIXEL_SIZE); //Write out a pixel to output image
}
inputImageFile.read(pixelBuffer, PIXEL_SIZE);
pixelBuffer[3] = pixelBuffer[3] & char(0);
pixelBuffer[3] = pixelBuffer[3] | char(255); //Add 11111111 to signal end of hidden text
outputImageFile.write(pixelBuffer, PIXEL_SIZE);
inputImageFile.close();
outputImageFile.close();
delete [] pixelBuffer;
}
void WriteRemainder(string inputImageFileName, string inputTextFileName, string outputImageFileName, const int HEADER_SIZE, const int PIXEL_SIZE)
{
char *remainder;
int fileSize;
ifstream inputImageFile;
ifstream inputTextFile;
ofstream outputImageFile;
fileSize = GetFileRemainderSize(inputImageFileName, inputTextFileName, HEADER_SIZE, PIXEL_SIZE);
remainder = new char[fileSize];
inputImageFile.open(inputImageFileName, ifstream::binary);
inputTextFile.open(inputTextFileName, ifstream::binary);
outputImageFile.open(outputImageFileName, ofstream::binary | ofstream::app);
inputImageFile.seekg(HEADER_SIZE + (GetFileSize(inputTextFileName) * PIXEL_SIZE)); //check head size
outputImageFile.seekp(HEADER_SIZE + (GetFileSize(inputTextFileName) * PIXEL_SIZE)); //check head size
inputImageFile.read(remainder, fileSize);
outputImageFile.write(remainder, fileSize);
inputImageFile.close();
inputTextFile.close();
outputImageFile.close();
delete [] remainder;
}
void HideTextFile(string inputImageFileName, string inputTextFileName, string outputImageFileName)
{
const int HEADER_SIZE = 60;
const int PIXEL_SIZE = 4;
char *textFileBuffer;
textFileBuffer = ReadTextFile(inputTextFileName);
WriteHeader(inputImageFileName, outputImageFileName, HEADER_SIZE);
WriteHiddenMessage(inputImageFileName, inputTextFileName, outputImageFileName, textFileBuffer, HEADER_SIZE, PIXEL_SIZE);
WriteRemainder(inputImageFileName, inputTextFileName, outputImageFileName, HEADER_SIZE, PIXEL_SIZE);
delete [] textFileBuffer;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment