Периодическая проблема с разархивированием расшифрованного файла, ранее заархивированного и зашифрованного с помощью libC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Периодическая проблема с разархивированием расшифрованного файла, ранее заархивированного и зашифрованного с помощью lib

Сообщение Anonymous »

При архивировании и шифровании с помощью libarchive периодически создается zip-файл, который невозможно разархивировать и дешифровать с помощью самого libarchive. Однако «плохой» почтовый индекс отлично распаковывается на терминале. Его приходится выполнять несколько раз, и в большинстве случаев проблем не возникает. Я изолировал, насколько это возможно, соответствующий код библиотеки, который все еще мог воспроизвести проблему.
Пример зашифрованного zip-файла, который я использовал, содержит только 1 текстовый файл с надписью «это тест». текст. Его пароль — «пароль».
В двух словах, пример кода ниже:
  • распаковывает sample.zip
    архивирует и шифрует его обратно, используя исходный пароль (здесь я подозреваю, что ошибка может иногда возникать время от времени)
  • разархивирует снова (это не кажется это место, где произошла ошибка, но это способ определить, произошло ли что-то не так на предыдущем этапе архивирования + шифрования)
Наблюдения:При неудачном запуске функция обратного вызова (при втором распаковывании, расшифровке «плохого» файла), похоже, не перебирает все пароли, необходимые для достижения фактического пароля файла (пароль — «пароль ", четвертый в списке).
Заархивированный файл, который нарушает работу libarchive, похоже, работает нормально при использовании на терминале. (Программа сохраняет этот файл на диск под именем zip_that_breaks_decrypting.zip)
Если вы используете zip-файл из неудачного запуска в качестве файла примера (например, cp zip_that_breaks_decrypting.zip sample.zip и запускаете compile_and_loop.sh ), libarchive всегда разрывает этот файл.
Мне сказали: «Вы закрываете archive_entry при первоначальном расшифровании и повторно используете его при последующем шифровании. AFAICT, как только вы закроете файл архив, любые данные записи больше не действительны», но я клонирую la_archive_entry в запись перед закрытием la_archive_entry. Я неправильно понимаю это объяснение? Странная вещь: это +500 раз запускается, и все работает, а потом один случайный раз нет.

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 
#include 

struct CallbackData {
uint64_t idx{0};
std::vector passphrases;
std::string last_passphrase_used{};
};

static const char* passphrase_callback(struct archive* /* archive */, void* client_data)
{
std::cout passphrases.size()) {
std::cout idx] passphrases[cd->idx].c_str();
cd->last_passphrase_used = cd->passphrases[cd->idx];
cd->idx++;
return ret;
}
return nullptr;
}

int decrypt_wrapper(uint8_t* in_zip, const size_t& in_size, uint8_t*& unzip_buffer, size_t& read_file_size, std::string& guessed_pswd,
struct archive_entry*& entry, std::vector& filters) {
struct archive* la_archive{archive_read_new()};
archive_read_support_format_zip(la_archive);

struct archive_entry* la_archive_entry{nullptr};

// Passphrase callback
std::vector pswds{"not it", "still not it", "infected", "password", "passphrase", "P@ssw0rd", "1234"};
CallbackData cd{0, pswds, ""};
archive_read_set_passphrase_callback(la_archive, static_cast(&cd), passphrase_callback);

// Open archive file
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79193168/intermittent-issue-unzipping-a-decrypted-file-previously-zippedencrypted-with-l[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»