/* OTP.C
** Simple OTP
** Last revised 08/12/98
*/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>

#define FALSE	0
#define TRUE	(!FALSE)


int	main( int argc, char *argv[] )
{
	int	message[256], key[256];
	int	message_length, key_length;
	int	result[256];
	int	i, j;
	int	encrypt_mode;
	int	argument_offset;
	char	*p;

	if (( argc < 3 ) || ( argc > 4 ))
	{
		printf( "Usage: OTP <message> <key>\n" );
		exit( 1 );
	}

	for ( i = 0; i < 256; i++ )
	{
		message[i] = 0;
		key[i] = 0;
		result[i] = 0;
	}

	if ( !strcmp( argv[1], "-d" ) )
	{
		encrypt_mode = FALSE;
		argument_offset = 2;
	}
	else
	{
		encrypt_mode = TRUE;
		argument_offset = 1;
	}

	message_length = 0;
	p = argv[argument_offset];
	for ( i = 0; i < strlen( p ); i++ )
		if (( p[i] >= 'A' ) && ( p[i] <= 'Z' ))
			message[message_length++] = p[i] - 'A' + 1;

	key_length = 0;
	p = argv[argument_offset + 1];
	for ( i = 0; i < strlen( p ); i++ )
		if (( p[i] >= 'A' ) && ( p[i] <= 'Z' ))
			key[key_length++] = p[i] - 'A' + 1;

	printf( "Message: %s\n", argv[argument_offset] );
	printf( "(%02d)     ", message_length );
	for ( i = 0; i < message_length; i++ )
		printf( "%02d ", message[i] );
	printf( "\n" );

	printf( "Key:     %s\n", argv[argument_offset + 1] );
	printf( "(%02d)     ", key_length );
	for ( i = 0; i < key_length; i++ )
		printf( "%02d ", key[i] );
	printf( "\n" );

	j = 0;
	for ( i = 0; i < message_length; i++ )
	{
		if ( encrypt_mode == TRUE )
		{
			result[i] = message[i] + key[j];
			if ( result[i] > 26 )
				result[i] -= 26;
		}
		else
		{
			result[i] = message[i] - key[j];
			if ( result[i] < 1 )
				result[i] += 26;
		}

		j++;
		if ( j >= strlen( argv[2] ))
			j = 0;
	}

	printf( "Result:  " );
	for ( i = 0; i < message_length; i++ )
		printf( "%c", 'A' + result[i] - 1 );
	printf( "\n" );
	printf( "(%02d)     ", message_length );
	for ( i = 0; i < message_length; i++ )
		printf( "%02d ", result[i] );
	printf( "\n" );

	return( 0 );
}
