Я хочу распаковать архивы, защищенные паролем, с помощью Python 3. Я знаю пароль, но кажется, что в стандарте zip есть несколько алгоритмов шифрования.
Сначала я создаю zip-архив со стандартным Ubuntu Archive Manager 3.16.5, используя пароль «1». Затем я запускаю следующий код:
import zipfile
zip_file = zipfile.ZipFile('archive.zip')
zip_file.extractall(pwd=b'1')
В результате я получаю RuntimeError: ('Bad password for file', <ZipInfo filename='contents.txt' compress_type=99 filemode='-rw-rw-r--' external_attr=0x8020 file_size=40 compress_size=60>)
.
Когда я запускаю Archive Manager для распаковки, он работает нормально. Однако, как только я пытаюсь unzip
, он не в состоянии выполнить работу:
$ unzip -P 1 archive.zip
Archive: archive.zip
skipping: contents.txt need PK compat. v5.1 (can do v4.6)
Насколько я понимаю, проблема в том, что unzip
использует алгоритм PKZIP , в то время как libarchive
широко используется 7zip
, и Archive Manager обычно предпочитает AES для шифрования (и имеет хорошую причину безопасности ).
Итак, как выбрать алгоритм разархивирования в Python? Или мне не нужно заботиться о самом формате zip, найти дешифратор AES и каким-то образом подключить его к unzip
позже?
Я рассматривал возможность использования 7zip
в вызове bash, но это создает дополнительные проблемы при взаимодействии с ОС (что если у исполняющей машины его нет?). Я также искал порт libarchive
для Python 3 (а именно, пакет python3-libarchive-c
) - он разработан отдельно от реализации C и не поддерживает шифрование / дешифрование на сегодняшний день.