C Board  

Go Back   C Board > General Programming Boards > C++ Programming

Reply
 
LinkBack Thread Tools Display Modes
Old 10-03-2004, 04:04 PM   #1
i dont know
 
Vicious's Avatar
 
Join Date: May 2002
Posts: 1,200
Simple message encryption

I thought this would be a good read for any people new to C++. I have made a simple xor encryption program to encrypt simple oneline messages.

I kept it as simple as possible so people new to C++ might could learn something from it. Then again as my programming skills arent exectly "good" I might learn something myself after a few of you see it .

You simply give a file name a secret key and the message.

Code:
/******************************************************/
/* This program will encrypt and decrypt messages. The*/
/* user will simply have to remeber a secret key.     */
/******************************************************/
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

// Function Prototypes ---------------------------------
int GetUserChoice ();

void Encryption ();
void Decryption ();

string XorString ( string source, int key );
// -----------------------------------------------------

// Main Function ---------------------------------------
int main ()
{
	
	// Variable to hold our choice
	int choice;
	
	// Create an infinite loop -------------------------
	while ( 1 ) {
		
		// GetUserChoice will return what the user wants to do
		// We can assign the returned value to our variable
		choice = GetUserChoice ();
		
		// Now we can check what the user wants
		if ( choice == 1 ) Encryption ();
		else if ( choice == 2 ) Decryption ();
		
		// If the choice was 3 that means we can break from our loop
		else if ( choice == 3 ) break;
		
	}
	// -------------------------------------------------
		
	return 0;
	
}

// GetUserChoice Function ------------------------------
int GetUserChoice ()
{
	
	// Variable for the choice
	int choice;
	
	// Here we will print our menu and prompt for a number
	// This number will represent what the user wants to do
	// Once we have the number this function will return it
	cout << "Message Encryption" << endl;
	cout << "----------------------" << endl;
	cout << "1) Encrypt Message" << endl;
	cout << "2) Decrypt Message" << endl;
	cout << "3) Exit" << endl << endl;
	cout << "Make a selection: ";
	cin  >> choice;
	
	// Now we will check to make sure the choice was valid
	if ( choice != 1 && choice != 2 && choice != 3 ) {
		
		cout << endl;
		cout << "Please enter 1, 2, or 3" << endl;
		cout << "Press enter to exit...";
		
		// Since the user entered an invalid selection we
		// will just exit the program by returning our programs
		// exit code.. 3
		
		cin.get ();
		return 3;
		
	}
	
	// If it makes it to this point that means the input was valid so we can return it
	return choice;
	
}
// -----------------------------------------------------

// Here is where we will encrypt the string ------------
string XorString ( string source, int key )
{
	
	// Here we loop through each character, using binary xor on it.
	for ( unsigned int loop = 0; loop < source.size (); loop ++ ) {
		
		source [loop] ^= key;
		
	}
	
	return source;
	
}

// Here we will get the file name, key, and message from the user ----
void Encryption ()
{
	
	// Variables for the file name, key and message ----
	char file_name [255];
	
	string message;
	string encrypted_message;
	
	int key;
	// -------------------------------------------------
	
	cout << endl;
	cout << "Enter file name: ";
	cin  >> file_name;
	
	cout << "Enter secret key: ";
	cin  >> key;
	
	cout << "Enter your secret message." << endl;
	cout << "Message: ";
	
	// We need this to ignore anything that might be left over
	// and ruin our message
	cin.ignore ( 255, '\n' );
	
	getline ( cin, message );
	
	// Now we have all of the info we can encrypt and write --
	// the string to the file --------------------------------
	encrypted_message = XorString ( message, key );
	
	ofstream file ( file_name );
	
	file << encrypted_message;
	
	file.close ();
	// -------------------------------------------------------
	
	cout << "Done..." << endl << endl;
	
}
// -------------------------------------------------------------------

// Decryption will work the same way. Instead of asking the user for the message, --- 
// we print it out. -----------------------------------------------------------------
void Decryption ()
{
	
	// Variables for the file name, key and message ----
	char file_name [255];
	
	string message;
	
	int key;
	// -------------------------------------------------
	
	cout << endl;
	cout << "Enter file name: ";
	cin  >> file_name;
	
	cout << "Enter secret key: ";
	cin  >> key;
	
	// Now we will check to see if the file exists -----
	ifstream file ( file_name );
	
	if ( !file.is_open () ) {
		
		cout << "Failed to load " << file_name << "!" << endl;
		cout << "Press enter to exit...";
		
		cin.get ();
		
		exit ( EXIT_FAILURE );
		
	}
	// -----------------------------------------------
	
	getline ( file, message );
	
	file.close ();
	
	cout << "Message: " << XorString ( message, key ) << endl;
	
	cout << "Done..." << endl << endl;
	
}
I am sure more experienced programmers will find several problems with my code . But if you see any really big nono's be sure to point them out! This was a quick little boredom project I did to kill a good 30 mins. ENJOY!

EDIT:
Sorry for the indention errors. Seems the boards code tags doesnt like MinGW Studios formatted code

And I know its not extremely useful but hey you moght want to store a phone number or something
__________________
What is C++?

Last edited by Vicious; 10-04-2004 at 12:34 AM.
Vicious is offline   Reply With Quote
Old 10-03-2004, 04:09 PM   #2
Code Goddess
 
Prelude's Avatar
 
Join Date: Sep 2001
Posts: 9,661
>But if you see any really big nono's be sure to point them out!
Check the return value of all stream input. You risk undefined behavior otherwise.

>Seems the boards code tags doesnt like MinGW Studios formatted code
Tabs are evil, replace them with the requisite number of spaces.
__________________
My best code is written with the delete key.
Prelude is offline   Reply With Quote
Old 10-03-2004, 04:27 PM   #3
i dont know
 
Vicious's Avatar
 
Join Date: May 2002
Posts: 1,200
>Check the return value of all stream input. You risk undefined behavior otherwise.

Yes I just realized as I was testing it.

I need to go back and fix some of this!
__________________
What is C++?
Vicious is offline   Reply With Quote
Old 10-03-2004, 07:40 PM   #4
Registered User
 
Elhaz's Avatar
 
Join Date: Sep 2004
Posts: 32
Hi Vicious,

This is perfect timing. I just finished a chapter on binary operators. Thanks for posting this. I still haven't got to file input/output yet but I think I can follow what you've written.

Much obliged.
Elhaz is offline   Reply With Quote
Old 10-03-2004, 11:24 PM   #5
Registered User
 
major_small's Avatar
 
Join Date: May 2003
Posts: 2,787
there's already something on XOR encryption on cprogramming.com ... I don't know if they're still accepting resources or not, but they should be... that would be cool to get the main cprog site back to a good place to learn stuff...
__________________
Join is in our Unofficial Cprog IRC channel
Server: irc.phoenixradio.org
Channel: #Tech


Team Cprog Folding@Home: Team #43476
Download it Here
Detailed Stats Here
More Detailed Stats
52 Members so far, are YOU a member?
Current team score: 1223226 (ranked 374 of 45152)

The CBoard team is doing better than 99.16% of the other teams
Top 5 Members: Xterria(518175), pianorain(118517), Bennet(64957), JaWiB(55610), alphaoide(44374)

Last Updated on: Wed, 30 Aug, 2006 @ 2:30 PM EDT
major_small is offline   Reply With Quote
Old 10-03-2004, 11:48 PM   #6
i dont know
 
Vicious's Avatar
 
Join Date: May 2002
Posts: 1,200
Thats what gets my goat.. im not any good at thinking up of amazing new ways to do things. I can only do things that have already been done and then I dont do them that well!

Anywho.. I think that the stuff that is on cprog is amazing. If they would keep adding to it it would be the best place around.
__________________
What is C++?
Vicious is offline   Reply With Quote
Old 10-04-2004, 03:35 AM   #7
the hat of redundancy hat
 
nvoigt's Avatar
 
Join Date: Aug 2001
Location: Hannover, Germany
Posts: 2,754
We had a cprog challenge once, but I couldn't find the link...

PHP Code:
// 
// **********************************************************************
// *                           Code Challenge                           *
// **********************************************************************
//
// Challenge:
//
//    Write an exclusive-OR encryption program.
//    The program should take as input a filename that
//    is then encrypted by the program.  The program
//    should ask the user to input an encryption key,
//    which should be used to encrypt the file.
//    The output of the program should go into a file
//    with the same filename but a .ENC extension
//    (for simplicity sake).
//    All programs should run under DOS. 
//
// Comments and voluntary changes:
// 
//    Added a second argument for output filename,
//    as you cannot encrypt/decrypt a file that already
//    is encrypted and has the .enc extension following
//    the given guidelines. This change to the specifications
//    is optional, so it works as per the specifications as
//    well.
//    The program encrypts the file, not the filename like 
//    stated above, I think it's obvious that this passage 
//    should not be taken by the word.
//    This application uses ANSI commands and standard headers,
//    it should be able to run as a .c file as well. However,
//    I was too lazy to test it on anything but VC as a windows
//    console application.
//    My other programs would probably be commented differently,
//    but as all of us are working at the same problem, much of
//    it will be quite clear from own experience.
//
//    Edit: Tested ok as pure C.
// 
// Time:
//
//    I received the mail Tuesday, 08.01.2002 15:27.
//  Started coding at roughly 18:00
//  Finished coding at about 18:45, starting to write comment.
//  Sent the reply mail: 19:30
//
// Facts:
//
//    Author:        Niels Voigt
//    EMail:        [email]nvoigt@saz.net[/email] 
//    Username:    nvoigt from cprogramming
//    Compiler:    VC 6 SP 5
//    Project:    Console Application, should be 100% DOS compatible
//    Libraries:    ANSI C
//
// Testing:
//  
//  Encrypting a file twice and checking with the FC utility 
//    gives a 100% match. So if there are still mistakes, at 
//    least they are consistent ;-)
//

// standard includes for io and strings
#include <stdio.h>
#include <string.h>

// constants
#define MAX_PATH        1000
#define MAX_ENCRYPT_KEY        100
#define XOR_FILE_EXT        ".enc"
#define ERROR_NOERROR        0
#define ERROR_READERROR        1
#define ERROR_WRITEERROR    2

// prototypes, description see below
int CreateFileName( const charszOldFilecharszNewFile );
int RemoveUnwantedCharacterscharszBuffer );

//
// main
//
//    the encryption program itself
//
int mainint argccharargv[] ) 
{
    
// variable declaration
    
FILE*    fpInput;
    
FILE*    fpOutput;
    
char    szFileName[MAX_PATH+1];
    
char    szEncryptionKey[MAX_ENCRYPT_KEY+1];
    
int        nEncryptKeyLength;
    
int        nByte;
    
int     nCount;
    
int     nError;

    
// check for arguments
    
if( argc == )
    {
        
// create filename if only source was given
        
CreateFileNameargv[1], szFileName );
    }
    else if( 
argc == )
    {
        
// copy given destination 
        
strcpyszFileNameargv[2] );
    }
    else
    {
        
// print help if number of arguments are illegal
        
printf"\nWrong number of arguments\n" );
        
printf"USAGE: %s Source [Destination]\n\n"argv[0] );
        return 
1;
    }

    
// ask for encryption key
    
do
    {
        
printf"Please enter encryption key ( 1 - %d characters ):",MAX_ENCRYPT_KEY );
        
memsetszEncryptionKeyMAX_ENCRYPT_KEY+1);
        
fgetsszEncryptionKeyMAX_ENCRYPT_KEYstdin );
        
RemoveUnwantedCharactersszEncryptionKey );
        
nEncryptKeyLength strlenszEncryptionKey );
    }    
    while( 
nEncryptKeyLength == );

    
// print status and data
    
printf"\n" );
    
printf"Encrypting [%s]\n",argv[1] );
    
printf"        to [%s]\n",szFileName );
    
printf"     using [%s]\n",szEncryptionKey );
    
printf"\n" );
    
    
// open input file
    
fpInput fopenargv[1], "rb" );
    if( 
fpInput == NULL )
    {
        
printf"Error: Unable to open %s for reading.\n\n"argv[1] );
        return 
2;
    }

    
// open output
    
fpOutput fopenszFileName"wb" );
    if( 
fpOutput == NULL )
    {
        
printf"Error: Unable to open %s for writing.\n\n"szFileName );
        return 
3;
    }

    
nCount 0;
    
nError ERROR_NOERROR;

    
// encryption loop:
    // read a byte, encrypt, write, next until no more bytes
    // each byte is encrypted with one letter from the key,
    // when the end of the key is reached, the next byte is
    // encrypted with the first one again.
    
while( ( nByte fgetcfpInput ) ) != EOF )
    {
        if( 
fputcnByte szEncryptionKey[nCount], fpOutput ) == EOF )
        {
            
nError ERROR_WRITEERROR;
            break;
        }

        
nCount++;

        if( 
nCount >= nEncryptKeyLength nCount 0;
    }

    
// check if the loop terminated with an end-of-file.
    // after all, somebody may have pulled the
    // plug or the network cable, which will also result 
    // in an EOF condition for fgetc.
    
if( ! feoffpInput ) ) nError ERROR_READERROR;

    
// print end message
    
switch( nError )
    {
        case 
ERROR_NOERROR:
            
printf"Encryption complete.\n\n" );
            break;
        case 
ERROR_READERROR:
            
printf"Error: unable to perform READ operation on file [%s]\n\n"argv[1] );
            break;
        case 
ERROR_WRITEERROR:
            
printf"Error: unable to perform WRITE operation on file [%s]\n\n"szFileName );
            break;
        default:
            
printf"Error: Unknown Error, please contact your support.\n\n" );
            break;
    }

    
// close files
    
fclosefpInput );
    
fclosefpOutput );

    
// done ;-)
    
return 0
}

//
// CreateFileName
//
//    creates the destination filename from the source
//    by replacing the file extension or adding it if
//    no other extension is found.
//
int CreateFileName( const charszOldFilecharszNewFile )
{
    
charszReplace;

    
strcpyszNewFileszOldFile );

    
szReplace szNewFile strlenszNewFile );

    while( 
szReplace szNewFile && *szReplace != '\\' && *szReplace != '/' )
    {
        if( *
szReplace == '.' )
        {
            
strcpyszReplaceXOR_FILE_EXT );
            return 
0;
        }

        
szReplace--;
    }

    
strcatszNewFileXOR_FILE_EXT );

    return 
1;
}

//
// RemoveUnwantedCharacters
//
//    removes the 0D characters that are left in the buffer 
//    when reading... I wish there was ONE out-of-the-box
//    simple-to-use input function.
//
int RemoveUnwantedCharacterscharszBuffer )
{
    while( *
szBuffer != )
    {
        if( *
szBuffer == 0x0a || *szBuffer == 0x0d ) *szBuffer 0;
        
szBuffer++;
    }

    return 
0;
}

//
// END OF FILE
// 
__________________
hth
-nv

She was so Blonde, she spent 20 minutes looking at the orange juice can because it said "Concentrate."

When in doubt, read the FAQ.
Then ask a smart question.
nvoigt is offline   Reply With Quote
Old 10-04-2004, 05:00 PM   #8
Registered User
 
Join Date: Oct 2004
Posts: 13
very cool program. i am new to c++ and i will be sure to look at this and learn from it.
cpp!n is offline   Reply With Quote
Old 11-05-2004, 05:32 AM   #9
Registered User
 
Join Date: Jul 2004
Posts: 98
@ Vicious :

May I ask you a little question?
When I input "1.1" not "1" in your selection menu,
".1" be received by next cin,
this is my problem:
How to clear (or flush) no used input value (or number ,string..)?
toysoldier is offline   Reply With Quote
Old 11-05-2004, 06:02 AM   #10
Registered User
 
Elhaz's Avatar
 
Join Date: Sep 2004
Posts: 32
Hi toysoldier,

I found this link quite useful. It really helped clear up a lot of my input woes.

http://www.augustcouncil.com/~tgibso...al/iotips.html

Hope it helps you.
Elhaz is offline   Reply With Quote
Old 11-07-2004, 11:48 PM   #11
Registered User
 
Join Date: Jul 2004
Posts: 98
@ Elhaz :
Thanks for your weblink, now I understand how to use cin.clear() and cin.ignore(),
add this web to my bookmark.
toysoldier is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Strange string behavior jcafaro10 C Programming 2 04-07-2009 07:38 PM
Encryption program zeiffelz C Programming 1 06-15-2005 03:39 AM
Architecture Question Orborde C++ Programming 1 06-01-2005 08:05 AM
Dialog Box Problems Morgul Windows Programming 21 05-31-2005 05:48 PM
RSA Encryption minesweeper Tech Board 6 08-30-2003 01:48 PM


All times are GMT -6. The time now is 12:00 AM.


Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.0 RC2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22