#include <functional>
#include <ios>
#include <streambuf>
template <typename CharT, class Traits = std::char_traits<CharT>>
class encrypted_basic_streambuf : public std::basic_streambuf<CharT, Traits>
{
public:
// Irgendwie notwendig. Bug?
using char_type = typename std::basic_streambuf<CharT, Traits>::char_type;
using traits_type = typename std::basic_streambuf<CharT, Traits>::traits_type;
using int_type = typename std::basic_streambuf<CharT, Traits>::int_type;
using encryption_function = std::function<char_type(char_type)>;
encrypted_basic_streambuf(std::basic_ios<char_type, traits_type> &stream,
encryption_function function)
: stream_(stream), streambuf_(stream.rdbuf()), function_(function)
{
stream_.rdbuf(this);
}
~encrypted_basic_streambuf()
{
stream_.rdbuf(streambuf_);
}
protected:
int_type underflow() override
{
auto c = streambuf_->sgetc();
return traits_type::eq_int_type(c, traits_type::eof()) ? c : function_(c);
}
int_type uflow() override
{
auto c = streambuf_->sbumpc();
return traits_type::eq_int_type(c, traits_type::eof()) ? c : function_(c);
}
int_type overflow(int_type c) override
{
streambuf_->sputc(function_(c));
return c;
}
private:
std::basic_ios<char_type, traits_type> &stream_;
std::basic_streambuf<char_type, traits_type> *streambuf_;
encryption_function function_;
};
#include <iostream>
int main()
{
{
encrypted_basic_streambuf<char> encrypter(std::cout, [](char c){return c ^ 'a';});
std::cout << "Hallo Welt";
}
std::cout << "\n Test 2: \n";
{
class xor_encrypter
{
public:
xor_encrypter(char key)
: key_(key) {}
char operator() (char c)
{
return c ^ key_++;
}
private:
char key_;
};
encrypted_basic_streambuf<char> encrypter(std::cout, xor_encrypter('a'));
std::cout << "Hallo Welt";
}
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3M+CiNpbmNsdWRlIDxzdHJlYW1idWY+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhclQsIGNsYXNzIFRyYWl0cyA9IHN0ZDo6Y2hhcl90cmFpdHM8Q2hhclQ+PgpjbGFzcyBlbmNyeXB0ZWRfYmFzaWNfc3RyZWFtYnVmIDogcHVibGljIHN0ZDo6YmFzaWNfc3RyZWFtYnVmPENoYXJULCBUcmFpdHM+CnsKcHVibGljOgogICAgLy8gSXJnZW5kd2llIG5vdHdlbmRpZy4gQnVnPwogICAgdXNpbmcgY2hhcl90eXBlICAgPSB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmVhbWJ1ZjxDaGFyVCwgVHJhaXRzPjo6Y2hhcl90eXBlOwogICAgdXNpbmcgdHJhaXRzX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OmJhc2ljX3N0cmVhbWJ1ZjxDaGFyVCwgVHJhaXRzPjo6dHJhaXRzX3R5cGU7CiAgICB1c2luZyBpbnRfdHlwZSAgICA9IHR5cGVuYW1lIHN0ZDo6YmFzaWNfc3RyZWFtYnVmPENoYXJULCBUcmFpdHM+OjppbnRfdHlwZTsKCiAgICB1c2luZyBlbmNyeXB0aW9uX2Z1bmN0aW9uID0gc3RkOjpmdW5jdGlvbjxjaGFyX3R5cGUoY2hhcl90eXBlKT47CgogICAgZW5jcnlwdGVkX2Jhc2ljX3N0cmVhbWJ1ZihzdGQ6OmJhc2ljX2lvczxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiAmc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uX2Z1bmN0aW9uIGZ1bmN0aW9uKQogICAgOiBzdHJlYW1fKHN0cmVhbSksIHN0cmVhbWJ1Zl8oc3RyZWFtLnJkYnVmKCkpLCBmdW5jdGlvbl8oZnVuY3Rpb24pCiAgICB7CiAgICAgICAgc3RyZWFtXy5yZGJ1Zih0aGlzKTsKICAgIH0KCiAgICB+ZW5jcnlwdGVkX2Jhc2ljX3N0cmVhbWJ1ZigpCiAgICB7CiAgICAgICAgc3RyZWFtXy5yZGJ1ZihzdHJlYW1idWZfKTsKICAgIH0KCnByb3RlY3RlZDoKICAgIGludF90eXBlIHVuZGVyZmxvdygpIG92ZXJyaWRlCiAgICB7CiAgICAgICAgYXV0byBjID0gc3RyZWFtYnVmXy0+c2dldGMoKTsKICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKGMsIHRyYWl0c190eXBlOjplb2YoKSkgPyBjIDogZnVuY3Rpb25fKGMpOwogICAgfQoKICAgIGludF90eXBlIHVmbG93KCkgb3ZlcnJpZGUKICAgIHsKICAgICAgICBhdXRvIGMgPSBzdHJlYW1idWZfLT5zYnVtcGMoKTsKICAgICAgICByZXR1cm4gdHJhaXRzX3R5cGU6OmVxX2ludF90eXBlKGMsIHRyYWl0c190eXBlOjplb2YoKSkgPyBjIDogZnVuY3Rpb25fKGMpOwogICAgfQoKICAgIGludF90eXBlIG92ZXJmbG93KGludF90eXBlIGMpIG92ZXJyaWRlCiAgICB7CiAgICAgICAgc3RyZWFtYnVmXy0+c3B1dGMoZnVuY3Rpb25fKGMpKTsKICAgICAgICByZXR1cm4gYzsKICAgIH0KCnByaXZhdGU6CiAgICBzdGQ6OmJhc2ljX2lvczxjaGFyX3R5cGUsIHRyYWl0c190eXBlPiAgICAgICAmc3RyZWFtXzsKICAgIHN0ZDo6YmFzaWNfc3RyZWFtYnVmPGNoYXJfdHlwZSwgdHJhaXRzX3R5cGU+ICpzdHJlYW1idWZfOwogICAgZW5jcnlwdGlvbl9mdW5jdGlvbiBmdW5jdGlvbl87Cn07CgojaW5jbHVkZSA8aW9zdHJlYW0+CgppbnQgbWFpbigpCnsKICAgIHsKICAgICAgICBlbmNyeXB0ZWRfYmFzaWNfc3RyZWFtYnVmPGNoYXI+IGVuY3J5cHRlcihzdGQ6OmNvdXQsIFtdKGNoYXIgYyl7cmV0dXJuIGMgXiAnYSc7fSk7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJIYWxsbyBXZWx0IjsKICAgIH0KICAgIHN0ZDo6Y291dCA8PCAiXG4gVGVzdCAyOiBcbiI7CiAgICB7CiAgICAgICAgY2xhc3MgeG9yX2VuY3J5cHRlcgogICAgICAgIHsKICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgIHhvcl9lbmNyeXB0ZXIoY2hhciBrZXkpCiAgICAgICAgICAgIDoga2V5XyhrZXkpIHt9CgogICAgICAgICAgICBjaGFyIG9wZXJhdG9yKCkgKGNoYXIgYykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGMgXiBrZXlfKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgY2hhciBrZXlfOwogICAgICAgIH07CgogICAgICAgIGVuY3J5cHRlZF9iYXNpY19zdHJlYW1idWY8Y2hhcj4gZW5jcnlwdGVyKHN0ZDo6Y291dCwgeG9yX2VuY3J5cHRlcignYScpKTsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkhhbGxvIFdlbHQiOwogICAgfQp9Cg==