Пример зашифрованного 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]
Мобильная версия