Failproof xor (en/de)cryption source code

This snippet submitted by yzb3 on 2012-01-14. It has been viewed 15916 times.
Rating of 5.3 with 196 votes

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




More C and C++ source code snippets