• XSS.stack #1 – первый литературный журнал от юзеров форума

Ошибка в работе демона на c++

Luck1Tommy

HDD-drive
Пользователь
Регистрация
21.07.2023
Сообщения
20
Решения
1
Реакции
5
Имеется программа, которая мониторит папку и шифрует все файлы в ней, однако при больших размерах файлов или при переносе туда таковых во время работы, программа работает некорректно
Как это можно исправить?
Код функции, которая открывает файл и записывает в другой:
C++:
void encryptor(filesystem::path source, filesystem::path out, string k) {
  ifstream file_target;
  ofstream file_out;

  file_target.open(source);
  file_out.open(out);

  if (!file_target.is_open()) {
    cout << "ERROR" << endl;
  } else {
    string str;
    ByteArray byte_k(k.begin(), k.end());
    string big_str;

    while (getline(file_target, str)) {
      big_str += str;
      big_str += "\n";
    }

    ByteArray buffer;
    ByteArray big_byte_str(big_str.begin(), --big_str.end());
    Aes256::encrypt(byte_k, big_byte_str, buffer);
    for (auto x: buffer) {
      file_out << x;
    }

  }
  file_target.close();
  file_out.close();
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Полностью переписать этот код. Ты читаешь файл в буфер полностью, что в корне неправильно, к тому же ты работаешь с файлом как со строкой
 
Полностью переписать этот код. Ты читаешь файл в буфер полностью, что в корне неправильно, к тому же ты работаешь с файлом как со строкой
Я пробовал делать построчное шифрование, однако там возникал конфликт при дешифровке
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Я пробовал делать построчное шифрование, однако там возникал конфликт при дешифровке
Может, прежде чем писать программы для шифрования файлов, стоит научиться работать с бинарными данными?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Код:
while (getline(file_target, str)) {
  /* ... */
}
Вместо этого читай чанки по N байтов, их и шифруй. Как только зашифровал чанк - сразу скинул его в file_out. Не нужно накапливать эти данные в памяти.
 
Имеется программа, которая мониторит папку и шифрует все файлы в ней, однако при больших размерах файлов или при переносе туда таковых во время работы, программа работает некорректно
Как это можно исправить?
Код функции, которая открывает файл и записывает в другой:
C++:
void encryptor(filesystem::path source, filesystem::path out, string k) {
  ifstream file_target;
  ofstream file_out;

  file_target.open(source);
  file_out.open(out);

  if (!file_target.is_open()) {
    cout << "ERROR" << endl;
  } else {
    string str;
    ByteArray byte_k(k.begin(), k.end());
    string big_str;

    while (getline(file_target, str)) {
      big_str += str;
      big_str += "\n";
    }

    ByteArray buffer;
    ByteArray big_byte_str(big_str.begin(), --big_str.end());
    Aes256::encrypt(byte_k, big_byte_str, buffer);
    for (auto x: buffer) {
      file_out << x;
    }

  }
  file_target.close();
  file_out.close();
}
спасибо за поднятие настроения!
 
Aes256::encrypt(byte_k, big_byte_str, buffer);
Почитай подробно про ECB, CBC, CFB, OFB, CTR и пр. режимы шифрования подробно, вникая в детали.
1. В твоем случае нужно работать в режиме по-байтовой обработки данных, исключая ECB, CBC и пр. требующие выравнивания.
2. getline опирается на '\n и '\0', ты можешь прочитай некий текст из файла, а как ты при дешифровании делаешь обратное? шифрованные данные однозначно будут содержать нулевой символ и getline обламается
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх