Как открыть архив WinZip, защищенный паролем?

Я знаю, что дешифрование - это обширный мир, в котором я новичок, но у меня есть файл WinZip, который я могу легко открыть в WinZip с известным паролем через пользовательский интерфейс WinZip.

Однако, указав тот же пароль, я не могу открыть его в Python. Я подозреваю, что кодировка, возможно, в AES, но я не хочу задействовать неродную библиотеку для открытия файла. Есть ли какой-либо стандарт для открытия защищенных паролем файлов WinZip в Python? Я пробовал разные кодеки кодирования в ZipFile.

from zipfile import ZipFile

with ZipFile(r'C:\Users\user\Desktop\Data.zip') as zf:
    pas = 'myPass'
    res = pas.encode('utf-32-le')
    zf.extractall(pwd=res)
zf
RuntimeError: Bad password for file ...

person Mark McGown    schedule 13.03.2020    source источник
comment
кодирование и шифрование - разные вещи. AES - это шифрование.   -  person Błotosmętek    schedule 13.03.2020


Ответы (2)


Сначала вам нужно определить, какой тип шифрования используется в zip-файле. В самом WinZip может быть инструмент отчетности, который сообщит вам об этом. У меня его нет, поэтому не знаю.

Если у вас есть доступ к любой из утилит командной строки zip, вы можете легко это выяснить.

Во-первых, если у вас есть реализация Infozip для unzip, запустите ее с параметром -lv. Если у вас есть очень новая версия unzip и в столбце Метод отображается AES_WG, ваш файл зашифрован AES.

$ unzip -lv my.zip
Archive:  /home/paul/perl/ext/Gzip/IO-Zippo/scratch/sample-zip/7z/7z-win32-aes128.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
    1933  AES_WG      884  54% 04-15-2010 22:26 00000000  0001-perl-74088.patch
--------          -------  ---                            -------
    1933              884  54%                            1 file

Если ваш unzip старше, наличие строки Unk:099 в столбце Метод означает, что ваш файл зашифрован AES.

$ unzip -lv my.zip
Archive:  IO-Zippo/scratch/sample-zip/7z/7z-win32-aes128.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
    1933  Unk:099     884  54% 2010-04-15 22:26 00000000  0001-perl-74088.patch
--------          -------  ---                            -------
    1933              884  54%                            1 file

Другой альтернативой является использование zipdetails (полное раскрытие, I ' м автор zipdetails). Главное, на что нужно обратить внимание, - это линия Compression Method 0063 'AES Encryption'

$ zipdetails my.zip

0000 LOCAL HEADER #1       04034B50
0004 Extract Zip Spec      33 '5.1'
0005 Extract OS            00 'MS-DOS'
0006 General Purpose Flag  0001
     [Bit  0]              1 'Encryption'
0008 Compression Method    0063 'AES Encryption'
...

Если окажется, что у вас есть шифрование AES и вам нужен способ чтения файла на языке Python, стандартный zipfile подход не сработает. В настоящее время zipfile поддерживает только слабое шифрование.

Чтобы узнать о других способах Python для чтения файлов Zip с шифрованием AES, см. Python unzip AES-128 encrypted file < / а>

person pmqs    schedule 13.03.2020
comment
pyzipper сработал, спасибо! Теперь мне нужно выяснить, как читать file_content с разделителями табуляции из памяти, поскольку я не могу использовать на нем read_csv. Я немного попробую ваши zip-детали для сравнения. - person Mark McGown; 13.03.2020

Передайте пароль как обычно, без кодирования, это может сработать.

person Community    schedule 13.03.2020