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); }