Advertisement
xerpi

xorer.c | gcc -O2 -o xorer xorer.c

May 18th, 2013
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.06 KB | None | 0 0
  1. /*  by xerpi (c) 2013 */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. typedef unsigned char byte;
  7.  
  8. void print_usage();
  9. int xorer(char* filename_input, char *key_file, char* filename_output);
  10. int xordata(byte *input, byte* key, byte* output, unsigned int size);
  11.  
  12. int main(int argc, char *argv[])
  13. {
  14.     if(argc < 3) {
  15.         print_usage();
  16.     } else if(argc == 3) {
  17.         if(!xorer(argv[1], argv[2], "xored.bin")) printf("error\n");
  18.     } else {
  19.         if(!xorer(argv[1], argv[2], argv[3])) printf("error\n");
  20.     }
  21.    
  22.     return 0;
  23. }
  24.  
  25. void print_usage()
  26. {
  27.     printf("usage: xorer file keyfile [output]\n");
  28. }
  29.  
  30.  
  31. int xorer(char* filename_input, char *key_file, char* filename_output)
  32. {
  33.     byte *input_buf, *output_buf, *key_buf;
  34.     FILE *finput, *fkey, *foutput;
  35.     int input_readed, key_readed, steps, key_len, input_len, i;
  36.    
  37.     if(!(finput  = fopen(filename_input, "rb")))  return 0;
  38.     if(!(fkey    = fopen(key_file, "rb")))        return 0;
  39.     if(!(foutput = fopen(filename_output, "wb"))) return 0;
  40.    
  41.     //Get key length
  42.         fseek(fkey, 0, SEEK_END);
  43.         key_len = ftell(fkey);
  44.         fseek(fkey, 0, SEEK_SET);
  45.        
  46.     //Get input file length
  47.         fseek(finput, 0, SEEK_END);
  48.         input_len = ftell(finput);
  49.         fseek(finput, 0, SEEK_SET);
  50.    
  51.     //Calculate number of for cycles to do
  52.         steps = (int)(input_len/key_len);
  53.         if(input_len%key_len) steps++;
  54.    
  55.     //Allocate buffers
  56.         key_buf    = (byte *)malloc(key_len * sizeof(byte));
  57.         input_buf  = (byte *)malloc(key_len * sizeof(byte));
  58.         output_buf = (byte *)malloc(key_len * sizeof(byte));
  59.     //Read key
  60.         key_readed = fread(key_buf, 1, key_len, fkey);
  61.    
  62.     //XOR data
  63.         for(i = 0; i < steps; i++) {
  64.             input_readed = fread(input_buf, 1, key_len, finput);
  65.             xordata(input_buf, key_buf, output_buf, input_readed);
  66.             fwrite(output_buf, 1, input_readed, foutput);
  67.         }
  68.    
  69.     fclose(finput);
  70.     fclose(fkey);
  71.     fflush(foutput);
  72.     fclose(foutput);
  73.     free(key_buf);
  74.     free(input_buf);
  75.     free(output_buf);
  76.     return 1;
  77. }
  78.  
  79. int xordata(byte *input, byte* key, byte* output, unsigned int size)
  80. {
  81.     int i;
  82.     for(i = 0; i < size; i++) {
  83.         output[i] = input[i] ^ key[i];
  84.     }  
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement