/* enc.c Convert a string, each character into binary. Take "key"
 * and convert to binary. xor character binary with key binary to make
 * the new encrypted character. Key will be obtained through input.
 * (c) 2006 Shaun Marquardt.
 */

#include <stdio.h>
#include <stdlib.h> //exit //strtol
#include <conio.h> //clrscr //getche
#include <string.h> //strlen for htoa
#include <ctype.h> //toupper for htoa

#define TRUE 1
#define FALSE !TRUE

void htoa( char *input );
long strtol(const char *s, char **endp, int base); //strtol is in stdlib.h

int main(int argc, char *argv[])
{
	char input_str[100];
	char key_str[100];
	char enc_str[100];
	char input_bits;
	char key_bits;
	char enc_bits[8];
	char *bp;
	int p = 0;

	clrscr();
	printf("Enter the string to be encrypted: ");
	gets(input_str);

   printf("\nDebug: input_str = %s",input_str);
   
	printf("\nEnter Encryption Key: ");
	for(p=0; input_str[p] != NULL; p++)
		key_str[p] = getche();

   printf("\nDebug: key_str = %s",key_str);
   
	printf("\n\n========Encrypt.========\n\n");
	sprintf(input_bits, "%ld", strtol(input_str, &bp, 2)); //ascii ->bin
	sprintf(key_bits, "%ld", strtol(key_str, &bp, 2));

   printf("\nDebug: input_bits = %s\n", input_bits);
   printf("Debug: key_bits = %s\n", key_bits);
	/* bitwise math-o-rama */
	
	for(p=0; input_bits[p] != NULL; p++)
	{
		if (input_bits[p] == key_bits[p])
			enc_bits[p] = 1;

		enc_bits[p] = 0;
	}

	sprintf(enc_str, "%ld", strtol(enc_bits, &bp, 16)); //bin ->hex

	htoa(enc_str);
	printf("\nDone. Press the enter key to exit the program.");
	getch();
	exit(0);
}

/* my stolen htoa (c) me */
void htoa( char *input )
{
 unsigned char a;
 char hex[5];
 char buf[5];
 int x = 0, col = 0;
 int done;

 hex[0] = '\0';

 if( (strlen(input) % 2) != 0 )
 {
   printf("Hex characters must be entered in pairs.\n");
   getch();
   exit(1);
 }
 
 printf("Hex - \"%s\"\n",input);
 printf("--== Output ==--\n\n");
 printf("\"");

 done = FALSE;
 while(!done)
 {
   if(input[x] == '\0') //End of input, done.
   {
    printf("\"\n");
    done = TRUE;
    break;
   }

   if(input[x] == ' ') //Space character? Print out a space.
   {
    printf("%c", ' ');
    x++;
   }
   
   sprintf(hex, "%c%c", toupper(input[x]), toupper(input[x+1])); //Get Hex Char
   x+=2;
   
   for(a=32;a<128;a++)
   {                      //Go through list of characters
    sprintf(buf, "%X",a);

    if(!strcmp(buf, hex)) //Matching, print character
     printf("%c",a);
    else            //Not Matching, continue
     continue;
     
    col++;
    if(col >= 79)
    {
     col = 0;
     printf("\n\r");
    }
    break;
   } //end "a" for loop
   
 } //end while
return;
} //end htoa