Я реализовал довольно простой способ для шифрования и дешифрования строки в файл, а затем обратно. Методы им с помощью внешнего вида следующим образом:XOR encryption with C++
string encrypt(string msg, string key) {
string tmp(key);
while (key.size() < msg.size()) key += tmp;
for (std::string::size_type i = 0; i < msg.size(); ++i) msg[i] ^= key[i];
return msg;
}
string decrypt(string msg, string key) {
return encrypt(msg, key);
}
Однако некоторые из ключей я использую не очень полезны. Строка правильно зашифровывается и записывается в файл. Но когда я пытаюсь расшифровать все (загрузка файла в строку, дешифрование, запись вернется к другому файлу), новый файл значительно меньше и не содержит всю информацию, хранящуюся в нем.
Ключи я пытался до сих пор являются:
string crypt = "abc"; //works kinda well
string crypt = "_H84M!-juJHFXGT01X1*G6a$gEv"; //doesnt work
string crypt = "H84MjuJHFXGT01X1G6agEv"; //doesnt work either
Я надеюсь, что вы можете помочь мне и дать мне советы о том, как выбрать полезный ключ.
Код для обработки файла:
ofstream temp;
temp.open("temp", ios::in | ios::trunc);
temp << encrypt(buffer, crypt);
temp.close();
ifstream in(file);
string content((std::istreambuf_iterator<char>(in)) (std::istreambuf_iterator<char>()));
ofstream plain;
plain.open(newfile, ios::in | ios::trunc);
plain << decrypt(content, crypt);
plain.close();
Я ожидаю, что вы получите двоичный код 0 в вашей зашифрованной строке, а затем используйте строковую функцию 'C', которая ожидает, что строка завершена двоичным 0 char. Это приведет к усечению ваших зашифрованных данных. –
Показать код для чтения и записи в файл. – Nelfeal
Просто используйте 'msg [i]^= key [i% key.size()];' вместо бессмыслицы с увеличением ключа. – Slava