// file XOR test 3
#include <iostream>
#include <string>
#include <fstream>
#include <boost/filesystem.hpp>
void XOR(const std::string& filePath, const std::string& outputPath, const std::string& key)
{
    std::ifstream in(filePath, std::ios::binary);
    std::ofstream out(outputPath, std::ios::binary);

    const int blocksize = 10240;
    char buffer[blocksize];
    const int keyBufSize=64;
    char keyBuf[keyBufSize];

    for(int i=0; i<keyBufSize; i++)
        keyBuf[i] = key[ i % key.size() ];

    while(in.read(buffer, blocksize), in.gcount() > 0)
    {
        int j=0;
        for( ; j < blocksize - blocksize%keyBufSize; j += keyBufSize) {
            for(int k=0; k<keyBufSize; k++)
                buffer[j+k] ^= keyBuf[k];
        }

        for( ; j<blocksize; j++) // won't happen
            buffer[j] ^= key[j%key.size()];
        out.write(buffer, in.gcount());
    }
}
int main()
{
    XOR("test.bin", "test.out", std::string(32, '*'));
    std::cout << "File size: " << boost::filesystem::file_size("test.bin") << '\n';
