Steganography : Encoded audio and video file not being played, getting corrupted. What is the issue

Posted by Shantanu Gupta on Stack Overflow See other posts from Stack Overflow or by Shantanu Gupta
Published on 2010-04-25T13:33:35Z Indexed on 2010/04/25 17:03 UTC
Read the original article Hit count: 414

Filed under:
|
|
|
|

I have made a steganography program to encrypt/Decrypt some text under image audio and video.

I used image as bmp(54 byte header) file, audio as wav(44 byte header) file and video as avi(56 byte header) file formats.

When I tries to encrypt text under all these file then it gets encrypted successfully and are also getting decrypted correctly.

But it is creating a problem with audio and video i.e these files are not being played after encrypted result.

What can be the problem. I am working on Turbo C++ compiler. I know it is super outdated compiler but I have to do it in this only.

Here is my code to encrypt.

int Binary_encode(char *txtSourceFileName, char *binarySourceFileName, char *binaryTargetFileName,const short headerSize)
{
long BinarySourceSize=0,TextSourceSize=0;
char *Buffer;
long BlockSize=10240, i=0;

ifstream ReadTxt, ReadBinary; //reads

ReadTxt.open(txtSourceFileName,ios::binary|ios::in);//file name, mode of open, here input mode i.e. read only
    if(!ReadTxt)
    {
        cprintf("\nFile can not be opened.");
        return 0;
    }

ReadBinary.open(binarySourceFileName,ios::binary|ios::in);//file name, mode of open, here input mode i.e. read only
    if(!ReadBinary)
    {
        ReadTxt.close();//closing opened file
        cprintf("\nFile can not be opened.");
        return 0;
    }

ReadBinary.seekg(0,ios::end);//setting pointer to a file at the end of file.
ReadTxt.seekg(0,ios::end);

BinarySourceSize=(long )ReadBinary.tellg(); //returns the position of pointer
TextSourceSize=(long )ReadTxt.tellg(); //returns the position of pointer

ReadBinary.seekg(0,ios::beg); //sets the pointer to the begining of file
ReadTxt.seekg(0,ios::beg); //sets the pointer to the begining of file

if(BinarySourceSize<TextSourceSize*50) //Minimum size of an image should be 50 times the size of file to be encrypted
    {
    cout<<"\n\n";
    cprintf("Binary File size should be bigger than text file size.");
    ReadBinary.close();
    ReadTxt.close();
    return 0;
    }
cout<<"\n";
cprintf("\n\nSize of Source Image/Audio File is : ");
cout<<(float)BinarySourceSize/1024;
cprintf("KB");
cout<<"\n";
cprintf("Size of Text File is ");
cout<<TextSourceSize;
cprintf(" Bytes");
cout<<"\n";
getch();

//write header to file without changing else file will not open
//bmp image's header size is 53 bytes
Buffer=new char[headerSize];

ofstream WriteBinary; // writes to file
WriteBinary.open(binaryTargetFileName,ios::binary|ios::out|ios::trunc);//file will be created or truncated if already exists


ReadBinary.read(Buffer,headerSize);//reads no of bytes and stores them into mem, size contains no of bytes in a file
WriteBinary.write(Buffer,headerSize);//writes header to 2nd image
delete[] Buffer;//deallocate memory
                    /*
Buffer = new char[sizeof(long)];
Buffer = (char *)(&TextSourceSize);

cout<<Buffer;
                      */

WriteBinary.write((char *)(&TextSourceSize),sizeof(long));
//writes no of byte to be written in image immediate after header ends
//to decrypt file


if(!(Buffer=new char[TextSourceSize]))
    {
    cprintf("Enough Memory could not be assigned.");
    return 0;
    }


ReadTxt.read(Buffer,TextSourceSize);//read all data from text file
ReadTxt.close();//file no more needed
WriteBinary.write(Buffer,TextSourceSize);//writes all text file data into image
delete[] Buffer;//deallocate memory

//replace Tsize+1 below with Tsize and run the program to see the change
//this is due to the reason that 50-54 byte no are of colors which we will be changing
ReadBinary.seekg(TextSourceSize+1,ios::cur);//move pointer to the location-current loc i.e. 53+content of text file

//write remaining image content to image file
while(i<BinarySourceSize-headerSize-TextSourceSize+1)
    {
        i=i+BlockSize;
        Buffer=new char[BlockSize];
        ReadBinary.read(Buffer,BlockSize);//reads no of bytes and stores them into mem, size contains no of bytes in a file
        WriteBinary.write(Buffer,BlockSize);
        delete[] Buffer;     //clear memory, else program can fail giving correct output
    }
ReadBinary.close();
WriteBinary.close();
//Encoding Completed
return 0;
}

Code to decrypt

int Binary_decode(char *binarySourceFileName, char *txtTargetFileName, const short headerSize)
{
long TextDestinationSize=0;
char *Buffer;
long BlockSize=10240;

ifstream ReadBinary;
ofstream WriteText;

ReadBinary.open(binarySourceFileName,ios::binary|ios::in);//file will be appended
    if(!ReadBinary)
        {
        cprintf("File can not be opened");
        return 0;
        }

ReadBinary.seekg(headerSize,ios::beg);
Buffer=new char[4];
ReadBinary.read(Buffer,4);

TextDestinationSize=*((long *)Buffer);


delete[] Buffer;
cout<<"\n\n";
cprintf("Size of the File that will be created is : ");
cout<<TextDestinationSize;
cprintf(" Bytes");
cout<<"\n\n";
sleep(1);

WriteText.open(txtTargetFileName,ios::binary|ios::out|ios::trunc);//file will be created if not exists else truncate its data


while(TextDestinationSize>0)
    {
    if(TextDestinationSize<BlockSize)
        BlockSize=TextDestinationSize;
    Buffer= new char[BlockSize];
    ReadBinary.read(Buffer,BlockSize);
    WriteText.write(Buffer,BlockSize);
    delete[] Buffer;

    TextDestinationSize=TextDestinationSize-BlockSize;
    }
ReadBinary.close();
WriteText.close();
return 0;
}



int text_encode(char *SourcefileName, char *DestinationfileName)
{
ifstream fr; //reads
ofstream fw; // writes to file
char c;
int random;
clrscr();

fr.open(SourcefileName,ios::binary);//file name, mode of open, here input mode i.e. read only
if(!fr)
    {
    cprintf("File can not be opened.");
    getch();
    return 0;
    }


fw.open(DestinationfileName,ios::binary|ios::out|ios::trunc);//file will be created or truncated if already exists

while(fr)
    {
    int i;
    while(fr!=0)
        {
            fr.get(c); //reads a character from file and increments its pointer
            char ch;
            ch=c;
            ch=ch+1;
            fw<<ch; //appends character in c to a file
        }
    }
fr.close();
fw.close();
return 0;
}

int text_decode(char *SourcefileName, char *DestinationName)
{
ifstream fr; //reads
ofstream fw; // wrrites to file
char c;
int random;
clrscr();

fr.open(SourcefileName,ios::binary);//file name, mode of open, here input mode i.e. read only
if(!fr)
    {
    cprintf("File can not be opened.");
    return 0;
    }


fw.open(DestinationName,ios::binary|ios::out|ios::trunc);//file will be created or truncated if already exists

while(fr)
    {
    int i;
    while(fr!=0)
        {
            fr.get(c); //reads a character from file and increments its pointer
            char ch;
            ch=c;
            ch=ch-1;
            fw<<ch; //appends character in c to a file
        }
    }

fr.close();
fw.close();
return 0;
}

© Stack Overflow or respective owner

Related posts about turboc++

Related posts about c++