C++使用key文件进行xor加解密
/*
    The function (en/de)crypts an input data file with an input key
    file using the XOR method.
 
    The use of a key file instead of a plain text key makes it much
    more flexible and secure. If the key is longer than the encrypted data,
    truly random (btw, compressed files like mp3 or jpg provide pretty
    good "almost-like-random" characters) and used only once, even though
    the metod is so simple, it is unbreakable even in theory.
*/
 
//libraries to include
#include <stdio.h> //for file handling and other IO
#include <stdlib.h> //for the exit function
 
//macros
#define BUF 512 //input filename buffer size
#define CNK 256 //IO buffer size
#define FILCHK(x) if(!x){printf("Cannot open file %s\n", x); exit(EXIT_FAILURE);} //file pointer checker
 
//xor (en/de)coding function
void xorenc(char *inname, char *outname, char *keyname)
{
    FILE *infile, *outfile, *keyfile; //file pointers
    char datachunk[CNK], keychunk[CNK]; //input data & key buffers
    long datapos, keypos, datalen, keylen, keymax; //data lengths
     
    //open files
    infile = fopen(inname, "rb"); //binary mode (b) is crucial
    FILCHK(infile); //check the file pointer
    outfile = fopen(outname, "wb");
    FILCHK(outfile);
    keyfile = fopen(keyname, "rb");
    FILCHK(keyfile);
     
    //get key length
    fseek(keyfile, 0L, SEEK_END); //seek the end of file
    keymax = ftell(keyfile); //tell what its position is
    rewind(keyfile); //go back to the beginning of the key file
     
    //get the first key chunk
    keypos = 0; //initialize the key buffer position
    keylen = fread(keychunk, 1, CNK, keyfile); //binary read a chunk of the key
     
    //an infinite loop
    while(1)
    {
        //binary read a chunk of data
        datalen = fread(datachunk, 1, CNK, infile);
         
        //for every char in the input buffer
        for(datapos = 0; datapos < datalen; ++datapos)
        {
            datachunk[datapos] ^= keychunk[keypos++]; //xor a data char with a key char
             
            //if the whole key chunk was used
            if(keypos == CNK)
            {
                keylen += fread(keychunk, 1, CNK, keyfile); //read a new key chunk
                keypos = 0; //set the key buffer position to 0
            }
             
            //otherwise, if the whole key file was used
            else if(keypos == keymax || keypos == keylen)
            {
                rewind(keyfile); //rewind it
                keylen = fread(keychunk, 1, CNK, keyfile); //read a key chunk
                keypos = 0; //set the key buffer position to 0
            }
        }
         
        //binary write the (en/de)crypted data
        fwrite(datachunk, 1, datalen, outfile);
         
        //if the whole data file was processed
        if(datalen < CNK)
            break; //end the loop
         
        //otherwise, if the whole key file was processed
        else if(keylen == keymax)
        {
            rewind(keyfile); //rewind it
            keylen = fread(keychunk, 1, CNK, keyfile); //read a key chunk
            keypos = 0; //set the key buffer position to 0
        }
    }
     
    //close the files
    fclose(infile);
    fclose(outfile);
    fclose(keyfile);
}




