//Does all the algorithmy stuff described in the header
int next_keystream_value (Card *deck) {
	joker_shift(deck);
	triple_cut(deck);
	bottom_value_cut(deck);
	int return_index = deck[0];
	if (return_index >= DECK_SIZE) {
		return_index = DECK_SIZE - 1;
	}
	return deck[return_index];
}
示例#2
0
文件: main.c 项目: anichno/SchoolCode
/*
 * Description: The main driver function for this program.
 * Input:       Command line arguments
 * Result:      EXIT_SUCCESS or EXIT_FAILURE
 * PRE:         None.
 * POST:        The appropriate encryption/decryption function will be called.
 */
int main( int argc, char** argv )
{
  if( argc == 1 ) // Program was executed with no arguments, so show usage.
  {
    show_usage( argv[ 0 ] );
  }
  else if( strcasecmp( argv[ 1 ], "-e" ) == 0 ) // Encrypt
  {
    if( argv[ 2 ] == NULL )
    {
      show_usage( argv[ 0 ] );
      return EXIT_FAILURE;
    }

    //pontifex -e deck.txt plaintext.txt ciphertext.txt
    printf( "Reading in deck...\n" );
    card_ptr deck = read_deck_from_file( argv[ 2 ] );
    printf( "Reading in plaintext...\n" );
    char* plaintext = read_filetext( argv[ 3 ] );
    printf( "Encrypting...\n" );
    char* ciphertext = encode_message( plaintext, deck );
    write_filetext( ciphertext, argv[ 4 ] );
  }
  else if( strcasecmp( argv[ 1 ], "-d" ) == 0 ) // Decrypt
  {
    if( argv[ 2 ] == NULL )
    {
      show_usage( argv[ 0 ] );
      return EXIT_FAILURE;
    }

    //pontifex -d deck.txt ciphertext.txt decrypted.txt
    printf( "Reading in deck...\n" );
    card_ptr deck = read_deck_from_file( argv[ 2 ] );
    printf( "Reading in ciphertext...\n" );
    char* ciphertext = read_filetext( argv[ 3 ] );
    printf( "Decrypting...\n" );
    char* plaintext = decode_message( ciphertext, deck );
    write_filetext( plaintext, argv[ 4 ] );
  }
  else if( strcasecmp( argv[ 1 ], "-a" ) == 0 ) // Create a new deck with all cards in ascending order
  {
    if( argv[ 2 ] == NULL )
    {
      show_usage( argv[ 0 ] );
      return EXIT_FAILURE;
    }
    printf( "Creating a new deck with cards in ascending order...\n" );
    fflush( stdout );

    //pontifex -a deck.txt
    card_ptr deck = new_deck();
    write_deck_to_file( deck, argv[ 2 ] );
  }
  else if( strcasecmp( argv[ 1 ], "-r" ) == 0 ) // Create a new, randomly shuffled deck
  {
    if( argv[ 2 ] == NULL )
    {
      show_usage( argv[ 0 ] );
      return EXIT_FAILURE;
    }
    printf( "Creating a new, randomly shuffled deck...\n" );

    //pontifex -r deck.txt
    card_ptr deck = new_deck();
    deck = shuffle_deck( deck );
    write_deck_to_file( deck, argv[ 2 ] );
  }
  else if( strcasecmp( argv[ 1 ], "-k" ) == 0 ) // Show key sequence
  {
    if( argv[ 2 ] == NULL )
    {
      show_usage( argv[ 0 ] );
      return EXIT_FAILURE;
    }
    printf( "Showing key sequence generated by deck in given file...\n" );

    //pontifex -k deck.txt
    printf( "Reading in deck...\n" );
    card_ptr deck = read_deck_from_file( argv[ 2 ] );
    char* keystream = generate_keystream( deck, 8 );
    int i;
    for( i = 0; i < 8; i++ )
    {
      int key = keystream[ i ] - 64;
      printf( "%d ", key );
    }
    printf( "\n" );
  }
  else if( strcasecmp( argv[ 1 ], "-f" ) == 0 ) // Test reading a deck from a file
  {
    if( argv[ 2 ] == NULL )
    {
      show_usage( argv[ 0 ] );
      return EXIT_FAILURE;
    }
    printf( "Testing reading deck from a file...\n" );

    //pontifex -f deck.txt
    printf( "Reading in deck...\n" );
    card_ptr deck = read_deck_from_file( argv[ 2 ] );
    show_deck( deck );
  }
  else if( strcasecmp( argv[ 1 ], "-m" ) == 0 ) // Test move joker steps
  {
    if( argv[ 2 ] == NULL )
    {
      show_usage( argv[ 0 ] );
      return EXIT_FAILURE;
    }
    printf( "Testing move joker steps with deck in given file...\n" );

    //pontifex -m deck.txt
    printf( "Reading in deck...\n" );
    card_ptr deck = read_deck_from_file( argv[ 2 ] );

    card_ptr currentCard = deck;
    while( currentCard->number != JOKER_A )
    {
      currentCard = currentCard->next;
    }
    deck = swap_joker1( deck, currentCard );

    currentCard = deck;
    while( currentCard->number != JOKER_B )
    {
      currentCard = currentCard->next;
    }
    deck = swap_joker2( deck, currentCard );

    show_deck( deck );
  }
  else if( strcasecmp( argv[ 1 ], "-t" ) == 0 ) // Test triple cut step
  {
    if( argv[ 2 ] == NULL )
    {
      show_usage( argv[ 0 ] );
      return EXIT_FAILURE;
    }
    printf( "Testing triple cut step with deck in given file...\n" );

    //pontifex -t deck.txt
    printf( "Reading in deck...\n" );
    card_ptr deck = read_deck_from_file( argv[ 2 ] );
    deck = triple_cut( deck );
    show_deck( deck );
  }
  else if( strcasecmp( argv[ 1 ], "-c" ) == 0 ) // Test count cut step
  {
    if( argv[ 2 ] == NULL )
    {
      show_usage( argv[ 0 ] );
      return EXIT_FAILURE;
    }
    printf( "Testing count cut step with deck in given file...\n" );

    //pontifex -c deck.txt
    printf( "Reading in deck...\n" );
    card_ptr deck = read_deck_from_file( argv[ 2 ] );
    deck = count_cut( deck );
    show_deck( deck );
  }
  else if( strcasecmp( argv[ 1 ], "-p" ) == 0 ) // Test entire pontifex algorithm
  {
    if( argv[ 2 ] == NULL )
    {
      show_usage( argv[ 0 ] );
      return EXIT_FAILURE;
    }
    printf( "Testing all pontifex steps with deck in given file...\n" );

    //pontifex -p deck.txt
    printf( "Reading in deck...\n" );
    card_ptr deck = read_deck_from_file( argv[ 2 ] );
    //	Step 1, find joker A
    card_ptr currentCard = deck;
    while( currentCard->number != JOKER_A )
    {
      currentCard = currentCard->next;
    }
    deck = swap_joker1( deck, currentCard );

    printf( "Step 1:\n" );
    show_deck( deck );

    //	Step 2, find joker B
    currentCard = deck;
    while( currentCard->number != JOKER_B )
    {
      currentCard = currentCard->next;
    }
    deck = swap_joker2( deck, currentCard );

    printf( "Step 2:\n" );
    show_deck( deck );

    //	Step 3, do triple cut
    deck = triple_cut( deck );

    printf( "Step 3:\n" );
    show_deck( deck );

    //	Step 4, do count cut
    deck = count_cut( deck );

    printf( "Step 4:\n" );
    show_deck( deck );

    //	Step 5, find output card
    int streamval = get_output_card( deck );

    printf( "Step 5:\n" );
    printf( "%i\n", streamval );
  }
  else if( strcasecmp( argv[ 1 ], "-o" ) == 0 ) // Test output card step
  {
    if( argv[ 2 ] == NULL )
    {
      show_usage( argv[ 0 ] );
      return EXIT_FAILURE;
    }
    printf( "Testing find output card step with deck in given file...\n" );

    //pontifex -o deck.txt
    printf( "Reading in deck...\n" );
    card_ptr deck = read_deck_from_file( argv[ 2 ] );
    printf( "Output card: %i\n", get_output_card( deck ) );
  }
  else
  {
    printf( "Invalid flag: %s\n", argv[ 1 ] );
    show_usage( argv[ 0 ] );
    return EXIT_FAILURE;
  }

  printf( "Done\n" );
  return EXIT_SUCCESS;
}