Created
March 26, 2011 16:36
-
-
Save zacblazic/888425 to your computer and use it in GitHub Desktop.
Hides a text file within a BMP image
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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