Używając prostego funktor nazwie Encryptor
Deszyfrowanie XOR-zaszyfrowany plik przerywa przedwcześnie
struct Encryptor {
char m_bKey;
Encryptor(char bKey) : m_bKey(bKey) {}
char operator()(char bInput) {
return bInput^m_bKey++;
}
};
mogę zaszyfrować dany plik łatwo
std::ifstream input("in.plain.txt", std::ios::binary);
std::ofstream output("out.encrypted.txt", std::ios::binary);
std::transform(
std::istreambuf_iterator<char>(input),
std::istreambuf_iterator<char>(),
std::ostreambuf_iterator<char>(output),
Encryptor(0x2a));
jednak starając się przywrócić to poprzez wywołanie
std::ifstream input2("out.encrypted.txt", std::ios::binary);
std::ofstream output2("out.decrypted.txt", std::ios::binary);
std::transform(
std::istreambuf_iterator<char>(input2),
std::istreambuf_iterator<char>(),
std::ostreambuf_iterator<char>(output2),
Encryptor(0x2a));
działa tylko częściowo. Oto rozmiary plików:
in.plain.txt: 7,700 bytes
out.encrypted.txt: 7,700 bytes
out.decrypted.txt: 4,096 bytes
W tym przypadku wydaje się, że metoda działa tylko dla pierwszych 2**12
bajtów i chyba tylko dla wielokrotności go (to może być mój rozmiar bloku systemu plików?). Dlaczego mam to zachowanie i jakie jest tego obejście?
wygląda na to, że tak się nie dzieje, gdy próbuję to odtworzyć. – moooeeeep
@moooeeeep: Kto wie, jak kompilator C++ Microsoftu "optymalizuje się" w porównaniu do gcc lub clang? Zakładam, że ten błąd nie wystąpiłby, gdyby przenieść dwa bloki en/deszyfrowanie pomiędzy '{/*...*/}' do własnego zakresu tak, że strumienie zostaną automatycznie zamknięte. –