Bypassing the EOF marker

P

philmasterplus

I am trying to create a simple file encoder (obfuscator) class using
the XOR(^) operator.

I am using objects of the class ifstream and ofstream to input/output
to the file. Right now, I am experimenting with xor-encoding a file
with a given C-string.

The problem is, the obfuscated file contains the EOF character for my
system, and my program cannot proceed to reencode (decode) the rest of
the obfuscated file.

The code can be simplified as follows:

<code>
//Assuming all necessary includes are in place

int main()
{
ifstream ifs("test.txt");
char cbuf;
string sbuf;

//Other code blah blah blah...

cbuf = ifs.get();
while (!ifs.eof()) //Recognizes the EOF-marker-in-the-middle-of-the-
file
{
sbuf.push_back(cbuf);
cbuf = ifs.get();
}

//Other code blah blah blah...
}

</code>


Yeah, I know, loading the whole file into a std::string variable is a
BAD idea, but it's a temporary hack. Which brings me to another
question: How do you xor-encode a file without opening an ifstream and
an ofstream? I know about the std::fstream class, but I don't know how
to use it.

Any form of example code (preferably with indents) would be
appreciated!

P. S. please also comment on my programming style. On a request, I
will upload the whole project.
 
B

Bo Persson

philmasterplus said:
I am trying to create a simple file encoder (obfuscator) class using
the XOR(^) operator.

I am using objects of the class ifstream and ofstream to
input/output to the file. Right now, I am experimenting with
xor-encoding a file with a given C-string.

The problem is, the obfuscated file contains the EOF character for
my system, and my program cannot proceed to reencode (decode) the
rest of the obfuscated file.

The code can be simplified as follows:

<code>
//Assuming all necessary includes are in place

int main()
{
ifstream ifs("test.txt");
char cbuf;
string sbuf;

//Other code blah blah blah...

cbuf = ifs.get();
while (!ifs.eof()) //Recognizes the EOF-marker-in-the-middle-of-the-
file
{
sbuf.push_back(cbuf);
cbuf = ifs.get();
}

//Other code blah blah blah...
}

</code>


Yeah, I know, loading the whole file into a std::string variable is
a BAD idea, but it's a temporary hack. Which brings me to another
question: How do you xor-encode a file without opening an ifstream
and an ofstream? I know about the std::fstream class, but I don't
know how to use it.

Any form of example code (preferably with indents) would be
appreciated!

P. S. please also comment on my programming style. On a request, I
will upload the whole project.

The way you handle it, it isn't really a text file, is it? Recognizing
EOF markers inside the file, or not, is totally system dependent.
There is no general rule for this.

Your best shot will probably be to open the files in binary mode,
like:

ifstream ifs("test.txt", std::ios::binary);


Bo Persson
 
J

James Kanze

I am trying to create a simple file encoder (obfuscator) class
using the XOR(^) operator.
I am using objects of the class ifstream and ofstream to
input/output to the file. Right now, I am experimenting with
xor-encoding a file with a given C-string.
The problem is, the obfuscated file contains the EOF character
for my system, and my program cannot proceed to reencode
(decode) the rest of the obfuscated file.

More to the point, the "obfuscated" file isn't text, so cannot
be written (nor read) if the file is opened in text mode. You
have two choices: open in binary, or use something like rot-13
for obfuscation, which ensures that the obfuscated data is text.
(Rot-13 is very minimal obfuscation, but throw in a little
shuffling, and it should be as good or better than xor'ing.)
The code can be simplified as follows:

<code>
//Assuming all necessary includes are in place
int main()
{
ifstream ifs("test.txt");

If this is to read your obfuscated text:

std::ifstream ifs( "test.txt", std::ios::binary ) ;

And of course, in real code, you'll want to check that the open
succeeded.
char cbuf;
string sbuf;
//Other code blah blah blah...
cbuf = ifs.get();
while (!ifs.eof()) //Recognizes the EOF-marker-in-the-middle-of-the-
file

In theory, this test may cause you to miss the last character.
There are two "classical" solutions:

while ( ifs.get( cbuf ) ) { ...

or declare cbuf as an int, and:

while ( cbuf != EOF ) { ...
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,774
Messages
2,569,596
Members
45,135
Latest member
VeronaShap
Top