Failproof xor (en/de)cryption

Submitted by:David Villa

Date added:14 August, 2016

Category:C

All of the XOR encryption algorithms

Tags: algorithm , encryption

Code Snippet:

/* All of the XOR encryption algorithms I encountered on the web were faulty on
* some keys/inputs using binary read & write both for files and chars is
* crucial */

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

#define MAX 512 // max key length

void xorenc(char *inname, char *outname, char *key);

int main(int argc, char **argv)
{
char input[MAX], *key;

if(argc != 3) // check the arguments
{
printf("ERROR: invalid arguments\n\n");
printf("Usage:\n");
printf("%s [input] [output]\n", argv[0]);
return EXIT_FAILURE;
}

/* get the key */
printf("Key plz: ");
fgets(input, MAX, stdin);
key = malloc(strlen(input) + 1);
strcpy(key, input);

xorenc(argv[1], argv[2], key);

free(key);
return 0;
}

void xorenc(char *inname, char *outname, char *key)
{
FILE *input, *output;
char c[1];
int i, k;

input = fopen(inname, "rb");
output = fopen(outname, "wb");

k = strlen(key);
i = 0;
while((fread(c, 1, 1, input)) != 0)
{
c[0] ^= key[i++]; // xor the input file's char with key's char
fwrite(c, 1, 1, output); // write the (en/de)crypted char to output
if(i == k) i = 0; // rewind the key if input is longer than it
}

fclose(input);
fclose(output);
 
 

Comments