Thursday, April 12, 2012

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;
}