/* 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);
}