// 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';
Ly8gZmlsZSBYT1IgdGVzdCAzCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4Kdm9pZCBYT1IoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0UGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkKewogICAgc3RkOjppZnN0cmVhbSBpbihmaWxlUGF0aCwgc3RkOjppb3M6OmJpbmFyeSk7CiAgICBzdGQ6Om9mc3RyZWFtIG91dChvdXRwdXRQYXRoLCBzdGQ6Omlvczo6YmluYXJ5KTsKCiAgICBjb25zdCBpbnQgYmxvY2tzaXplID0gMTAyNDA7CiAgICBjaGFyIGJ1ZmZlcltibG9ja3NpemVdOwogICAgY29uc3QgaW50IGtleUJ1ZlNpemU9NjQ7CiAgICBjaGFyIGtleUJ1ZltrZXlCdWZTaXplXTsKCiAgICBmb3IoaW50IGk9MDsgaTxrZXlCdWZTaXplOyBpKyspCiAgICAgICAga2V5QnVmW2ldID0ga2V5WyBpICUga2V5LnNpemUoKSBdOwoKICAgIHdoaWxlKGluLnJlYWQoYnVmZmVyLCBibG9ja3NpemUpLCBpbi5nY291bnQoKSA+IDApCiAgICB7CiAgICAgICAgaW50IGo9MDsKICAgICAgICBmb3IoIDsgaiA8IGJsb2Nrc2l6ZSAtIGJsb2Nrc2l6ZSVrZXlCdWZTaXplOyBqICs9IGtleUJ1ZlNpemUpIHsKICAgICAgICAgICAgZm9yKGludCBrPTA7IGs8a2V5QnVmU2l6ZTsgaysrKQogICAgICAgICAgICAgICAgYnVmZmVyW2ora10gXj0ga2V5QnVmW2tdOwogICAgICAgIH0KCiAgICAgICAgZm9yKCA7IGo8YmxvY2tzaXplOyBqKyspIC8vIHdvbid0IGhhcHBlbgogICAgICAgICAgICBidWZmZXJbal0gXj0ga2V5W2ola2V5LnNpemUoKV07CiAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgaW4uZ2NvdW50KCkpOwogICAgfQp9CmludCBtYWluKCkKewogICAgWE9SKCJ0ZXN0LmJpbiIsICJ0ZXN0Lm91dCIsIHN0ZDo6c3RyaW5nKDMyLCAnKicpKTsKICAgIHN0ZDo6Y291dCA8PCAiRmlsZSBzaXplOiAiIDw8IGJvb3N0OjpmaWxlc3lzdGVtOjpmaWxlX3NpemUoInRlc3QuYmluIikgPDwgJ1xuJzsK