+ Reply to Thread
Results 1 to 9 of 9

Thread: C Tutorial - XOR Encryption

  1. #1
    ShadenSmith's Avatar
    ShadenSmith is offline Newbie
    Join Date
    May 2009
    Location
    Kentucky - USA
    Posts
    19
    Rep Power
    10

    C Tutorial - XOR Encryption

    First of all, XOR encryption alone is very easy to create and can be easily broken (especially if a weak key is used). This tutorial assumes no responsibility for the quality of encryption.

    Now, the first thing to now about XOR encryption is what exactly an XOR operation is. XOR stands for exclusive-or, it is a logical operand. XOR returns true if one and only one of the two arguments is true. A few examples:

    1 xor 0 = 1
    0 xor 1 = 1
    1 xor 1 = 0
    0 xor 0 = 0

    Notice that if you were to xor the result against the key you will end up with the original value. This is how decrypting XOR encryption works. XOR is a symmetrical operation, so if you encrypt a file and then encrypt it again with the same key you will receive the original plaintext.

    Now the XOR encryption uses this operand to cycle through each bit of plaintext and XOR's it against a key. The longer and more random a key is, the stronger the encryption.

    The algorithm itself is the focus of this tutorial. The remainder of the program (I/O, etc) will be posted at the bottom but not explained outside of comments.

    Code:
    void encrypt_data(FILE* input_file, FILE* output_file, char* key)
    {
    	int key_count = 0; //Used to restart key if strlen(key) < strlen(encrypt)
    	int encrypt_byte;
    
    	//Loop through each byte of file until EOF
    	while( (encrypt_byte = fgetc(input_file)) != EOF) 
    	{
    		//XOR the data and write it to a file
    		fputc(encrypt_byte ^ key[key_count], output_file);
    
    		//Increment key_count and start over if necessary
    		key_count++;
    		if(key_count == strlen(key))
    			key_count = 0;
    	}
    }
    In C (and many other languages) the ^ is the character that represents XOR.

    encrypt_data() takes an input and output file and a key to encrypt with. fgetc() returns the next character from the input stream (our file). We XOR the current character of the file against the corresponding index of key. We then use fputc (it places the given character into an output stream) to place the XOR'ed data into out output file. Finally, we loop key to the index of 0 if we have reached the end of key.

    Again, your encryption is only as strong as your key. I would not recommend this for any serious encryption (there are MANY MANY better methods of encryption). I have written this purely as a learning resource and an introduction to cryptography. Below is the source code in whole:

    Code:
    //XOR Encryption
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_SIZE 256
    
    void strip_newline(char* to_strip);
    void encrypt_data(FILE* input_file, FILE* output_file, char *key);
    
    int main(int argc, char* argv[])
    {
    	//Check for valid number of arguments
    	if (argc != 3)
    	{
    		printf("Invalid number of arguments. %d arguments were supplied.\n", argc);
    		printf("Usage: %s inputfile outputfile\n", argv[0]); //Usage: ./xortest inputfile outputfile
    		exit(0);
    	}
    	
    	FILE* input;
    	FILE* output;
    
    	//Open input and output files
    	input = fopen(argv[1], "r");
    	output = fopen(argv[2], "w");
    		
    
    	//Check input file
    	if (input == NULL)
    	{
    		printf("Input file cannot be read.\n");
    		exit(0);
    	}
    		
    	//Check output file
    	if (output == NULL)
    	{
    		printf("Output file cannot be written to.\n");
    		exit(0);
    	}
    
    	//Key strings
    	char *key = malloc(MAX_SIZE);
    
    	//Prompt for key
    	printf("Passphrase: ");
    
    	//Read in key
    	fgets(key, MAX_SIZE, stdin);
    
    	printf("Encrypting %s\n", argv[1]);
    
    	//strip newlines
    	strip_newline(key);
    
    	//XOR data and write it to file
    	encrypt_data(input, output, key);
    	
    	printf("Encrypted data written to %s\n", argv[2]);
    
    	//Release memory
    	free(key);
    
    	//Close files
    	fclose(input);
    	fclose(output);
    
    	return 0;
    
    }
    
    
    void encrypt_data(FILE* input_file, FILE* output_file, char* key)
    {
    	int key_count = 0; //Used to restart key if strlen(key) < strlen(encrypt)
    	int encrypt_byte;
    	
    	while( (encrypt_byte = fgetc(input_file)) != EOF) //Loop through each byte of file until EOF
    	{
    		//XOR the data and write it to a file
    		fputc(encrypt_byte ^ key[key_count], output_file);
    
    		//Increment key_count and start over if necessary
    		key_count++;
    		if(key_count == strlen(key))
    			key_count = 0;
    	}
    }
    
    void strip_newline(char* to_strip)
    {
    	//remove newlines
    	if (to_strip[strlen(to_strip) - 1] == '\n')
    	{
    		to_strip[strlen(to_strip) - 1] = '\0';
    	}
    }
    I hope you found this tutorial useful!
    Last edited by ShadenSmith; 06-29-2009 at 09:54 AM.

  2. CODECALL Circuit advertisement
    Join Date
    Always
    Location
    Advertising world
    Posts
    Many

     
  3. #2
    Join Date
    Jul 2006
    Posts
    16,466
    Blog Entries
    74
    Rep Power
    143

    Re: C Tutorial - XOR Encryption

    Very nice. I think it's worth pointing out that to decrypt your data, you simply "encrypt" the encrypted file with the same key.
    Programming is a branch of mathematics.
    My CodeCall Blog | My Personal Blog

  4. #3
    ShadenSmith's Avatar
    ShadenSmith is offline Newbie
    Join Date
    May 2009
    Location
    Kentucky - USA
    Posts
    19
    Rep Power
    10

    Re: C Tutorial - XOR Encryption

    Yes, that's a very important point that I forgot to mention. I'll fix that now. Thanks.

  5. #4
    Jordan Guest

    Re: C Tutorial - XOR Encryption

    Very nice! +rep

  6. #5
    ShadenSmith's Avatar
    ShadenSmith is offline Newbie
    Join Date
    May 2009
    Location
    Kentucky - USA
    Posts
    19
    Rep Power
    10

    Re: C Tutorial - XOR Encryption

    Thanks Jordan! Codecall is really a great community. I'd like to contribute as much as I can to it.

  7. #6
    WIREDTECH is offline Newbie
    Join Date
    Jan 2010
    Posts
    1
    Rep Power
    0

    Re: C Tutorial - XOR Encryption

    Can someone help me understand how to XOR this..what is the process? I have the results but I need to know how to get there:

    L1: 941FEA4F2B9E7D41 # Mkey Left part 1
    L2: C5A2AD40F2A8B733 # Mkey Left part 2

    X1: 51BD470FD936CA72 # XOR L1 & L2

    Thank you!

  8. #7
    Join Date
    Jul 2006
    Posts
    16,466
    Blog Entries
    74
    Rep Power
    143

    Re: C Tutorial - XOR Encryption

    Convert them to binary, XOR the binary representation, convert back to hexadecimal.
    Programming is a branch of mathematics.
    My CodeCall Blog | My Personal Blog

  9. #8
    dcs
    dcs is offline Guru
    Join Date
    Mar 2008
    Posts
    775
    Rep Power
    23

    Re: C Tutorial - XOR Encryption

    Code:
    	input = fopen(argv[1], "r");
    	output = fopen(argv[2], "w");
    Wouldn't you want to open the files in binary mode to avoid the possibility of text mode translation of bytes?

  10. #9
    lthreed's Avatar
    lthreed is offline Newbie
    Join Date
    Mar 2010
    Posts
    18
    Rep Power
    0

    Re: C Tutorial - XOR Encryption

    What you've described is essentially a one-time pad. And with this the only weak key is one of all 0's

+ Reply to Thread

Thread Information

Users Browsing this Thread

There are currently 5 users browsing this thread. (0 members and 5 guests)

Similar Threads

  1. Encryption
    By Vaielab in forum PHP Development
    Replies: 5
    Last Post: 10-12-2011, 06:44 AM
  2. XoR Encryption
    By DanSpd in forum C# Programming
    Replies: 0
    Last Post: 02-13-2010, 10:29 AM
  3. Encryption
    By BlaineSch in forum ASP, ASP.NET and Coldfusion
    Replies: 5
    Last Post: 06-01-2009, 10:27 PM
  4. Encryption
    By TALucas in forum Java Tutorials
    Replies: 7
    Last Post: 04-06-2009, 04:19 AM
  5. Wi-Fi Encryption
    By TcM in forum Technology Ramble
    Replies: 6
    Last Post: 02-26-2008, 03:32 PM

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts