/* vigenere.c -- a very simple implementation of the Vigenere-Cipher.
 * (c) 2004, Jan Tobias Muehlberg <jtmuehlberg@gmail.com>
 * 2.0, Tue, 23 Feb 2010 15:16:43 +0000
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/* The Vigenere sqare... yes, it would be easier to do the transformation
 * with some character shifting. But this is kind'a presentation programme. */
char *square[26] =
 {
  "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
  "BCDEFGHIJKLMNOPQRSTUVWXYZA",
  "CDEFGHIJKLMNOPQRSTUVWXYZAB",
  "DEFGHIJKLMNOPQRSTUVWXYZABC",
  "EFGHIJKLMNOPQRSTUVWXYZABCD",
  "FGHIJKLMNOPQRSTUVWXYZABCDE",
  "GHIJKLMNOPQRSTUVWXYZABCDEF",
  "HIJKLMNOPQRSTUVWXYZABCDEFG",
  "IJKLMNOPQRSTUVWXYZABCDEFGH",
  "JKLMNOPQRSTUVWXYZABCDEFGHI",
  "KLMNOPQRSTUVWXYZABCDEFGHIJ",
  "LMNOPQRSTUVWXYZABCDEFGHIJK",
  "MNOPQRSTUVWXYZABCDEFGHIJKL",
  "NOPQRSTUVWXYZABCDEFGHIJKLM",
  "OPQRSTUVWXYZABCDEFGHIJKLMN",
  "PQRSTUVWXYZABCDEFGHIJKLMNO",
  "QRSTUVWXYZABCDEFGHIJKLMNOP",
  "RSTUVWXYZABCDEFGHIJKLMNOPQ",
  "STUVWXYZABCDEFGHIJKLMNOPQR",
  "TUVWXYZABCDEFGHIJKLMNOPQRS",
  "UVWXYZABCDEFGHIJKLMNOPQRST",
  "VWXYZABCDEFGHIJKLMNOPQRSTU",
  "WXYZABCDEFGHIJKLMNOPQRSTUV",
  "XYZABCDEFGHIJKLMNOPQRSTUVW",
  "YZABCDEFGHIJKLMNOPQRSTUVWX",
  "ZABCDEFGHIJKLMNOPQRSTUVWXY"
 };


/* encrypt_c() encrypts a single character by using the square.
 * We accept one character plaintext and one character keying material
 * as parameters. */
char encrypt_c (char plain, char key)
 {
  char cipher;

  /* handle spurious characters */
  if ((plain - 'a' > 25) || (key - 'A' > 25) ||
      (plain - 'a' <  0) || (key - 'A' <  0))
   return (plain);

  /* Take plaintext and key as coordinates and look up the
   * ciphertext. Done. */
  cipher = square[plain - 'a'][key - 'A'];

  return (cipher);
 }


/* decrypt_c decrypts a single charactera by using the sqare.
 * We accept one character ciphertext and one character keying material
 * as parameters. */
char decrypt_c (char cipher, char key)
 {
  char plain = 0x00;

  /* Hu! It's empty... */

  return (plain);
 }


/* main() */
int main (void)
 {
  char *key      = "SCHLUESSEL";
  char *input    = "klartext!";
  char *output   = NULL;
  unsigned int i = 0;


  /* allocate an output buffer of appropriate size */
  output = malloc (strlen(input) + 1);
  if (!output) exit (1); /* return on error (allocation) */

  /* encrypt *input character by character */
  while (input[i] != 0x00)
   {
    output[i] = encrypt_c (input[i], key[i]);
    i++;
   }

  /* nicely print the results */
  printf ("  %s\n  %s  \n  %s\n", key, input, output);

  /* release the output buffer */
  free (output);

  return (0);
 }