Learn Encryption Techniques with BASIC and C++
(Publisher: Wordware Publishing, Inc.)
Author(s): Gil Held
ISBN: 1556225989
Publication Date: 10/01/98

Previous Table of Contents Next


Listing 6.6 The RANDOM2.CPP program listing and its repeated execution using different random seed numbers.

/*
random2.cpp
C++ code written by Jonathan Held on April 28, 1998,
using Microsoft Visual C++ version 5.0
*/

#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

//function prototypes
bool checkInput(char *&);
char* encipher(char *&);
void formatData(char []);
void getMessage(char *&);
unsigned int getSeed(void);
void gotit(const char [], char *&, const int, int);

const int BUFFER_SIZE = 256;

//----------------------------------------------------------------
//Function: main()
//Parameters: None
//Return Type: int - 0 if program terminated normally
//Purpose: driver that makes calls to various procedures defined
//in random1.cpp
//----------------------------------------------------------------
int main(){
   unsigned int seed;
   char *message, *result;

  while (seed = getSeed()) {
   srand(seed);
   getMessage(message);
   cout << "\nYou entered: " << message << endl;
   result = encipher(message);
   cout << "Enciphered message is " << result << endl << endl;
   delete message;
 }

 return 0;
}//end main()

//----------------------------------------------------------------
//Function: checkInput()
//Parameters: input - the message the user entered
//Return Type: bool - true if the input string contains an error,
//       false otherwise
//Purpose: Checks the user's keyword for invalid characters.
//----------------------------------------------------------------
bool checkInput(char * &input)
{
 bool error = false;
 int count = strlen(input);

 for (int ix=0; ix<count; ix++){

  int char_value = static_cast<int>(*(input+ix));
  //determine if the user did not enter an uppercase character
  if ((char_value < 65) || (char_value > 90)){
      error = true;
      cerr << "\aYou entered an invalid message!" << endl << endl;
       break;
   }
}

if (count == 0){
  cerr << "\aYou entered an invalid message!" << endl << endl;
  error = true;
}
 return error;
}//end checkInput()


//----------------------------------------------------------------
//Function: encipher()
//Parameters: inp - the user's input that will be enciphered
//Return Type: char * - a pointer to the encrypted string
//Purpose: returns a pointer to the encrypted text
//----------------------------------------------------------------
char* encipher(char *&inp){

 //yet another, and easier way to represent the plaintext
 //array
 const char plaintext[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 int index = 0;

 char *encrypted = new char[strlen(inp)+1];
 assert(encrypted);

 for (int ix=0; ix < strlen(inp); ix++){
   for (int jx=0; jx <26; jx++){
    if (plaintext[jx] == inp[ix]){
          gotit(plaintext, encrypted, jx, index++);
          break;
      }
   }
}

//don't forget to insert the null terminator
encrypted[strlen(inp)] = '\0';

 return encrypted;
}//end encipher();


//----------------------------------------------------------------
//Function: formatData()
//Parameters: data - the array we want to format
//Return Type: None
//Purpose: Get rid of all spaces in the array.
//----------------------------------------------------------------
void formatData(char data[]){
  for (int mx=0, nx=0; (*(data+nx) != '\0'); nx++){
   if (*(data+nx) == ' '){
      //do nothing - skip over the space in the data
   }
   else {
     *(data+mx++) = *(data+nx);
   }
 }

 //don't forget to add the null terminator
 *(data+mx) = '\0';

 return;
}//end formatData()


//----------------------------------------------------------------
//Function: getMessage()
//Parameters: input - user's one-line message
//Return Type: None
//Purpose: Gets a one-line message from the user.
//----------------------------------------------------------------
void getMessage(char *&input){

  char buffer[BUFFER_SIZE] = {'\0'};
  bool error = false;

  do{
   cout << "Enter a one-line message (no spaces) in UPPERCASE: ";
   cin.getline(buffer, BUFFER_SIZE, '\n');
   assert(input = new char[strlen(buffer) + 1]);
   strcpy(input, buffer);
   formatData(input);
   error = checkInput(input);

   if (error)
      delete input;

 } while (error);

 return;
}//getMessage()
//----------------------------------------------------------------
//Function: getSeed()
//Parameters: none
//Return Type: unsigned int - the seed the client entered
//Purpose: gets the seed for the random number generator.  If the
//user enters a negative number, it causes the seed to underflow to
//a very high non-negative number.  If the user enters an
//alphanumeric sequence, e.g., "A123", then seed_Number is set to
//zero.
//----------------------------------------------------------------
unsigned getSeed(){

 unsigned int seed_Number;

 cout << "Enter seed, 0 (or non-digit) to terminate: ";
 cin >> seed_Number;
 cin.ignore();

 return seed_Number;
}//end getSeed()


//----------------------------------------------------------------
//Function: gotit()
//Parameters: p_text - the plaintext array, i.e., characters "A-Z"
//      enc_msg - a pointer to the message that will be encoded
//      loc - the location of each encoded character in the
//      plaintext array
//Return Type: None
//Purpose: encodes the user's input using random numbers
//----------------------------------------------------------------
void gotit(const char p_text[], char *&enc_msg, int loc, int index){

 int random_num, z;

 do {
  random_num = rand() % 100;
 } while (random_num > 25);

 z = (loc + random_num) % 26;
 enc_msg[index] = p_text[z];

 return;
}//end gotit()
//end file random2.cpp
A:\c>RANDOM2
Enter seed, 0 (or non-digit) to terminate: 5
Enter a one-line message (no spaces) in UPPERCASE: FIREFREDNOW

You entered: FIREFREDNOW
Enciphered message is TDYLWCANCKC

Enter seed, 0 (or non-digit) to terminate: 8
Enter a one-line message (no spaces) in UPPERCASE: FIREFREDNOW

You entered: FIREFREDNOW
Enciphered message is QLEGOKYPGRV

Enter seed, 0 (or non-digit) to terminate: 51
Enter a one-line message (no spaces) in UPPERCASE: FIREFREDNOW

You entered: FIREFREDNOW
Enciphered message is KIYOSXAWQTW

Enter seed, 0 (or non-digit) to terminate:


Previous Table of Contents Next