Monday, April 26, 2010

A GCC/C++ Project I was working on..

/*

Tested on Ubuntu 9.10

To Make File: gcc filename.c -o filename

RUN File: ./filename

The Epic Junk code Project.

Program Outline:

0. default Options/Help menu.

1. Basic XOR Encrypt / Decrypt Files.

2. Hex Dumper.

3. Overwriting files data & removes file.

*/

#include <stdio.h>

#include <stdlib.h>

#define KEY_LENGTH 66

#define LINELEN 16

#define overWrite 4.E5

void printFileAsHex(FILE* file);

char toVisibleCharacter(int byteVal);

void writeLine(char* lineBuffer, int buflen);

char upperToHex(int byteVal);

char lowerToHex(int byteVal);

char nibbleToHex(int nibble);

#ifdef WIN32

#define CRLF "\r\n"

#else

#define CRLF "\n"

#endif

void printFileAsHex(FILE* file)

{

int count = 0;

char buffer[LINELEN];

while(1)

{

int byteVal = fgetc(file);

if(EOF == byteVal)

{

break;

}

buffer[count] = byteVal;

count++;

if(count >= LINELEN)

{

writeLine(buffer, LINELEN);

count = 0;

}

}

if(count > 0)

{

writeLine(buffer, count);

}

}

char toVisibleCharacter(int byteVal)

{

if(byteVal >= 32 && byteVal <= 126)

{

return (char) byteVal;

}

return '_';

}

void writeLine(char* lineBuffer, int buflen)

{

int i;

for(i=0; i<buflen; i++)

{

char chu = upperToHex(lineBuffer[i]);

char chl = lowerToHex(lineBuffer[i]);

printf("%c%c ", chu, chl);

}

if(buflen < LINELEN)

{

for(i = LINELEN - buflen; i>0; i--)

{

printf(".");

}

}

printf("\t");

for(i=0; i<buflen; i++)

{

char ch = toVisibleCharacter(lineBuffer[i]);

printf("%c", ch);

}

printf(CRLF);

}

char upperToHex(int byteVal)

{

int i = (byteVal & 0xF0) >> 4;

return nibbleToHex(i);

}

char lowerToHex(int byteVal)

{

int i = (byteVal & 0x0F);

return nibbleToHex(i);

}

char nibbleToHex(int nibble)

{

const int ascii_zero = 48;

const int ascii_a = 65;

if((nibble >= 0) && (nibble <= 9))

{

return (char) (nibble + ascii_zero);

}

if((nibble >= 10) && (nibble <= 15))

{

return (char) (nibble - 10 + ascii_a);

}

return '?';

}

unsigned char Random_Byte(void)

{

double result;

result = (double) rand() / (double) RAND_MAX;

result = result * 255.0;

return (unsigned char) result;

}

void Crypt(FILE *input, FILE *output)

{

unsigned char key[KEY_LENGTH];

int key_index, in_value;

unsigned char out_value, random_value;

int done;

for (key_index = 0; key_index < KEY_LENGTH; key_index++)

key[key_index] = Random_Byte();

fwrite(key, sizeof(unsigned char), KEY_LENGTH, output);

done = 0;

while (!done)

{

in_value = fgetc(input);

if (in_value >= 0)

{

out_value = (unsigned char) in_value;

random_value = Random_Byte();

for (key_index = 0; key_index < KEY_LENGTH; key_index++)

out_value = out_value ^ key[key_index];

out_value = out_value ^ random_value;

fputc(random_value, output);

fputc(out_value, output);

}

else

done = 1;

}

}

void Decrypt(FILE *input, FILE *output)

{

unsigned char key[KEY_LENGTH];

int key_index, in_value;

unsigned char random_value, out_value;

int done;

fread(key, sizeof(unsigned char), KEY_LENGTH, input);

done = 0;

while (!done)

{

in_value = fgetc(input);

if (in_value >= 0)

{

random_value = (unsigned char) in_value;

in_value = fgetc(input);

if (in_value >= 0)

{

out_value = (unsigned char) in_value;

out_value = out_value ^ random_value;

for (key_index = (KEY_LENGTH - 1); key_index >= 0; key_index--)

out_value = out_value ^ key[key_index];

fputc(out_value, output);

}

else

done = 1;

}

else

done = 1;

}

}

int main(int argc, char *argv[])

{

int x, i, choice = 0;

FILE *originalData, *input, *output, *file;

if (argc < 4)

{

printf("Menu~\n\n1.)Dump Hex of file.\n2.Help\n3.Safe-Remove file.\n>");

scanf("%d",&choice);

switch (choice)

{

case 1:

{

file = fopen(argv[1], "rb");

if(NULL == file)

{

printf("ERROR: Cannot open %s", argv[1]);

printf(CRLF);

return 2;

}

printFileAsHex(file);

fclose(file);

exit(0);

}

case 2:

{

printf("\nChipper7 Encryption \n");

printf("usage: chipper7 e|d <in_file> <out_file>\n");

printf("Use the `e' option to encrypt in_file, producing out_file.\n");

printf("Use the `d' option to decrypt out_file giving in_file.\n\n");

exit(0);

}

case 3:

{

printf("Overwriteing file data.\n");

for(x=0;x<15;x++)

{

printf(".");

originalData = fopen(argv[1], "wb");

if(NULL == originalData)

{

printf("ERROR: Cannot open %s", argv[1]);

printf(CRLF);

exit(0);

}

for(i=0;i<overWrite;i++)

{

if(x < 3)

fprintf(originalData,"102600100260001002600100");

if(x == 3)

fprintf(originalData, "26002600010001026002600");

if(x > 3)

fprintf(originalData, "26001000010000100000010");

}

fclose(originalData);

}

printf("\n\nSafe Remove of %s ...\nNow Killing file..", argv[1]);

remove(argv[1]);

printf("..Done.\n");

exit(0);

}

default:

{ printf("\33[0;28m illegal selection \n\n");

exit(0);

}

}

return 0;

}

if ( (argv[1][0] != 'e') && (argv[1][0] != 'd') )

{

printf("First agument must be `e' or `d'.\n");

return 1;

}

input = fopen(argv[2], "r");

if (!input)

{

printf("Cannot open %s for reading.\n", argv[2]);

return 1;

}

output = fopen(argv[3], "w");

if (!output)

{

printf("Cannot open %s for writting.\n", argv[3]);

fclose(input);

return 1;

}

file = fopen(argv[2], "rb");

if(NULL == file)

{

printf("ERROR: Cannot open %s", argv[2]);

printf(CRLF);

return 2;

}

printFileAsHex(file);

fclose(file);

printf("Working......");

srand( time(NULL) );

if (argv[1][0] == 'e')

Crypt(input, output);

else

Decrypt(input, output);

printf("....Done.\n");

fclose(input);

fclose(output);

return 0;

}

No comments: