//This program is free software: you can redistribute it and/or modify it under the terms #of the GNU General Public License as published by the Free Software Foundation, either #version 3 of the License, or (at your option) any later version.
//This program is distributed in the hope that it will be useful, but WITHOUT ANY #WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A #PARTICULAR PURPOSE. See the GNU General Public License for more details.
//You should have received a copy of the GNU General Public License along with this #program. If not, see
/* caesar.c */
/* Shift 3 position Caesar cipher */
/* Unless otherwise noted Copyright 1995 Willis E. Howard, III */
/* Willis E. Howard, III email: WEHoward@aol.com mail: POB 1473 Elkhart, IN 46515 */
/* under MSDOS, NMAKE /F CAESAR.MAK all clean */
#include
#include
#include
#include
#include
#include "crypt.h"
#include "caesar.h"
/*
This routine uses the common interface to CRYPT.C.
Generally, the name of this module becomes the name
of the executable file.
*/
static int encrypt_or_decrypt_caesar = ENCRYPTION_SELECT;
/*
cipher_doc:
This array of strings must have two sections:
CIPHER that describes the cipher used and
KEY that describes how the key is defined and entered.
*/
static char *cipher_doc[]=
{
"CIPHER",
" The CAESAR cipher shifts letters 3 places to the right mod 26.",
" To decrypt the CAESAR cipher, use the -d option which will",
" shift letters 3 places to the left mod 26.",
"",
" For example, the CAESAR cipher converts an A to a D, a B to",
" an E, and so forth. Upon decryption, a D is converted to an A,",
" an E to a B, and so forth. Only letters are affected. Upper",
" and lower case are retained in this version.",
"",
" This cipher is mostly for historical interest. It is said",
" that Julius Caesar used it to send his secret messages.",
"",
"KEY",
" No key is used by this function.",
NULL
} ;
char ** crypt_help_caesar()
{
return cipher_doc; /* return a pointer to the help strings */
}
/*
crypt_key:
Get the key from the passed string (that may be a file name in some
implementations) or from a key file name. Return 0 on success but
exit on error.
*/
int
crypt_key_caesar ( int key_type, char *key_text )
{
if (key_type == KEY_FILE) /* a file name has been given */
{
return 0;
}
else if (key_type == KEY_IMMEDIATE) /* a key string has been given */
{
if (!strcmp( key_text, "?" )) /* prompt for key */
{
printf("No key needed\n");
}
return 0;
}
fprintf( stderr, "Error getting key\n" );
exit( 1 );
}
/*
crypt_key_erase:
If a local copy of the key has been made, erase it from memory.
This increases security that the key can not be obtained from
an examination of memory.
*/
void
crypt_key_erase_caesar()
{
return;
}
/*
crypt_select:
If encryption and decryption require different ciphers,
this routine defines the direction. Valid choices are
ENCRYPTION_SELECT and DECRYPTION_SELECT.
*/
int
crypt_select_caesar( int selection )
{
if ( selection == ENCRYPTION_SELECT )
encrypt_or_decrypt_caesar = ENCRYPTION_SELECT;
if ( selection == DECRYPTION_SELECT )
encrypt_or_decrypt_caesar = DECRYPTION_SELECT;
return encrypt_or_decrypt_caesar;
}
/*
crypt_file:
encrypt or decrypt the source to the destination file.
Do not exit from this routine. Return 0 on success
and return 1 on error. Use an fprintf(stderr, ... ) to
report the nature of the error and close any open files.
This allows the main routine to do some cleanup before
exiting.
This version can be easily changed to give a key for the
index number. By default, the number is now 3.
*/
int
crypt_file_caesar( char *source, char *dest )
{
int c;
int index;
FILE *infile;
FILE *outfile;
index = 3;
if ((infile = fopen( source, "rb" )) == NULL)
{
fprintf( stderr, "Can not open %s for read.\n", source);
return 1;
}
if ((outfile = fopen( dest, "wb" )) == NULL)
{
fprintf( stderr, "Can not open %s for write.\n", dest);
fclose( infile );
return 1;
}
if ( encrypt_or_decrypt_caesar == ENCRYPTION_SELECT )
{
while ((c = fgetc(infile)) != EOF)
{
if (isalpha(c))
{
if(toupper(c) <= 'Z' - index)
c += index;
else
c -= (26 - index);
}
if (fputc(c, outfile) == EOF)
{
fprintf(stderr, "Could not write to output file %s\n", dest);
fclose( infile );
fclose( outfile );
return 1;
}
}
}
else if ( encrypt_or_decrypt_caesar == DECRYPTION_SELECT )
{
while ((c = fgetc(infile)) != EOF)
{
if (isalpha(c))
{
if (toupper(c) >= 'A' + index)
c -= index;
else
c += (26 - index);
}
if (fputc(c, outfile) == EOF)
{
fprintf(stderr, "Could not write to output file %s\n", dest);
fclose( infile );
fclose( outfile );
return 1;
}
}
}
fclose( infile );
fclose( outfile );
return 0;
}