/* OTP.C ** Simple OTP ** Last revised 08/12/98 */ #include #include #include #include #include #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 \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 ); }