Распаковка zip-архивов с помощью Python и встроенной библиотеки zipfile довольно простое занятие. И, может быть я и не столкнулся с некоторыми трудностями, если бы не стал распаковывать с помощью этой библиотеки запароленный архив. Вот тут-то архиватор и не захотел с ним работать. Хотя, распаковка архивов с паролем в нем предусмотрена уже по умолчанию. Тогда я решил немного разобраться, почему же так происходит и как с этим быть. Таким образом, получилась небольшая заметка по поводу того, как распаковать запароленные архивы разными типами архиваторов с помощью Python.
На оригинальность вовсе не претендую. Я просто хочу поделиться с другими тем, на что было потрачено пару часов моего времени. Чтобы человек, который решил распаковать архив питоном, не столкнулся с теми же трудностями, что и я. Если, конечно же, он прочтет эту заметку.
Пара слов про архивы с паролем
Для начала нужно понять, что же такое архив с паролем. Это не что иное, как зашифрованный с помощью алгоритмов шифрования файл. А пароль, это ключ для дешифровки. Таким образом, архиватор, при упаковке и распаковке файлов в архив с паролем, шифрует или дешифрует их встроенными средствами.
Библиотека zipfile для шифрования и расшифровки файлов использует алгоритм ZIP-шифрования. Однако, файлы с паролем, созданные с помощью стандартного архиватора Linux используют уже другой алгоритм шифрования AES. И соответственно, распаковать архив созданный таким способом с помощью библиотеки zipfile не получается. Это же касается и формата архивов 7zip.
Про формат RAR вообще отдельный разговор. Так как он является проприетарным, а значит закрытым форматом, то инструменты для распаковки доступны для данного формата только те, что поставляются разработчиками данного архиватора. И хоть они и предоставляются бесплатно, все равно, без помощи данных инструментов распаковка зашифрованных архивов будет недоступной. Да и вообще распаковка, как таковая. Для python, в данный момент, доступны лишь оболочки, которые являются лишь интерфейсами для инструментов rar.
А теперь хочу поделиться с вами теми способами, что я нашел для распаковки зашифрованных архивов, то есть архивов с паролем.
Что потребуется?
Для распаковки зашифрованного zip-архива нужно установить библиотеку pyzipper. В терминале выполняем команду:
После чего импортируем загруженную библиотеку в скрипт:
Ну и можно распаковывать архивы. Я не стал писать какие-то специальные скрипты для распаковки. Вместо этого будут просто обозначены функции, с помощью которых можно это сделать.
Расшифровка и распаковка zip-архива
Ну и раз мы начали с zip-архивов, то ниже приведен код для расшифровки и распаковки:
pyzipper является контекстным, потому открываем его с помощью with. Используем класс AESZipFile, в который передаем необходимые аргументы. Здесь file_path – путь к запароленному архиву. compression – метод сжатия. encryption – алгоритм шифрования, который будет использован для расшифровки. А далее в extracted_zip.extractall(pwd=word) вызывается функция extractall для распаковки всего содержимого архива. Здесь также можно указать путь для распаковки в параметре path, а в параметре pwd указывается пароль или ключ к зашифрованному архиву. Если путь для распаковки не указан, архив распаковывается в ту же папку, где он и располагается. Ключ должен быть в байтовом формате. Поэтому, нужно его перед тем, как передавать его в функцию, в него перевести. Либо как в примере, либо, использовав функцию encode().
Распаковка и расшифровка 7zip-архива
У данного типа архива при шифровании может использоваться алгоритм на выбор. А потому библиотека, которая распаковывает такие архивы, в теории, должна уметь автоматически подбирать нужный алгоритм для распаковки.
Для распаковки 7zip я использовал библиотеку py7zr, которая устанавливается в терминале с помощью команды:
Далее она импортируется в скрипт. Вот небольшой код для расшифровки и распаковки:
Параметры для распаковки, это путь к файлу архива, метод, который используется для открытия зашифрованного файла. Так как файл расшифровывается и распаковывается, то здесь нужно использовать read. И пароль к зашифрованному файлу. Я пробовал указать для распаковки с помощью данной библиотеки zip-архив. И если оригинальный архиватор 7zip справляется с этим на ура, то в данном случае возникает исключение, текст которого так и гласит, что файл не является 7zip.
Расшифровка и распаковка RAR
С данным типом архивов возникли довольно большие трудности. Не в том плане, что его невозможно распаковать без установленного архиватора, а в том плане, что он является проприетарным, следовательно, компоненты для его работы нужно качать с
А теперь о том, что понадобиться. А понадобиться установить библиотеку patoolib с помощью команды в терминале:
Используется в коде она очень просто. Для начала импортируется в скрипт, а затем указывается в качестве опций путь для распаковки. И на этом все. Библиотека сама ищет Rar или Unrar.exe по заданным в ней путям и использует их в работе.
Здесь пароль для распаковки в коде не указывается, а вводиться в терминале. А значит, в автоматическом режиме данную конструкцию использовать не получиться. Есть еще библиотеки, которые выполняют похожие функции. Но, все они, в той или иной степени, используют инструменты Rar.
Если вы решите распаковать данный вид архива с помощью python в Linux, то вам нужно будет установить библиотеку unrar. Ну и rar, в придачу, чтобы была возможность эти архивы создавать. Мало ли, вдруг для чего-то может, потребуется.
Вот такая вот небольшая заметка. Надеюсь, что она кому-то поможет при работе с запароленными архивами. Хотя это и не секретная информация, но искать ее в куче статей о работе с архивами с помощью zipfile довольно нудно ))
Ну и небольшой код, который пытается работать с запароленными zip-архивами. А началось все с того, что у меня в архиве лежала нужная информация, а вот пароль на него я подзабыл. Потому и попробовал написать код для работы с запароленными архивами с помощью стандартной библиотеки и столкнулся с трудностями по расшифровке. Ну и соответственно, начал искать информацию:
Работа с архивом идет по словарю. А потому, его надо где-то скачать. Впрочем, в интернете словарей великое множество. Но я использовал rockyou.txt. Это, наверно, один из самых больших словарей с паролями, которые я видел. Попадались мне и на 10 миллионов. Но тут, больше 14-ти. К слову, пароль я так и не нашел. Пришлось вспоминать самостоятельно ))
Спасибо за внимание. Надеюсь, что данная информация будет вам полезна
Дисклеймер: данная статья служит для ознакомления и не призывает к действию.
На оригинальность вовсе не претендую. Я просто хочу поделиться с другими тем, на что было потрачено пару часов моего времени. Чтобы человек, который решил распаковать архив питоном, не столкнулся с теми же трудностями, что и я. Если, конечно же, он прочтет эту заметку.
Пара слов про архивы с паролем
Для начала нужно понять, что же такое архив с паролем. Это не что иное, как зашифрованный с помощью алгоритмов шифрования файл. А пароль, это ключ для дешифровки. Таким образом, архиватор, при упаковке и распаковке файлов в архив с паролем, шифрует или дешифрует их встроенными средствами.
Библиотека zipfile для шифрования и расшифровки файлов использует алгоритм ZIP-шифрования. Однако, файлы с паролем, созданные с помощью стандартного архиватора Linux используют уже другой алгоритм шифрования AES. И соответственно, распаковать архив созданный таким способом с помощью библиотеки zipfile не получается. Это же касается и формата архивов 7zip.
Про формат RAR вообще отдельный разговор. Так как он является проприетарным, а значит закрытым форматом, то инструменты для распаковки доступны для данного формата только те, что поставляются разработчиками данного архиватора. И хоть они и предоставляются бесплатно, все равно, без помощи данных инструментов распаковка зашифрованных архивов будет недоступной. Да и вообще распаковка, как таковая. Для python, в данный момент, доступны лишь оболочки, которые являются лишь интерфейсами для инструментов rar.
А теперь хочу поделиться с вами теми способами, что я нашел для распаковки зашифрованных архивов, то есть архивов с паролем.
Что потребуется?
Для распаковки зашифрованного zip-архива нужно установить библиотеку pyzipper. В терминале выполняем команду:
pip install pyzipper
После чего импортируем загруженную библиотеку в скрипт:
import pyzipper
Ну и можно распаковывать архивы. Я не стал писать какие-то специальные скрипты для распаковки. Вместо этого будут просто обозначены функции, с помощью которых можно это сделать.
Расшифровка и распаковка zip-архива
Ну и раз мы начали с zip-архивов, то ниже приведен код для расшифровки и распаковки:
Python:
# pip install pyzipper
import pyzipper
def decrypt(file_path, word):
with pyzipper.AESZipFile(file_path, 'r', compression=pyzipper.ZIP_LZMA, encryption=pyzipper.WZ_AES) \
as extracted_zip:
try:
extracted_zip.extractall(pwd=word)
except RuntimeError as ex:
print(ex)
decrypt('test.txt.zip', b'123')
pyzipper является контекстным, потому открываем его с помощью with. Используем класс AESZipFile, в который передаем необходимые аргументы. Здесь file_path – путь к запароленному архиву. compression – метод сжатия. encryption – алгоритм шифрования, который будет использован для расшифровки. А далее в extracted_zip.extractall(pwd=word) вызывается функция extractall для распаковки всего содержимого архива. Здесь также можно указать путь для распаковки в параметре path, а в параметре pwd указывается пароль или ключ к зашифрованному архиву. Если путь для распаковки не указан, архив распаковывается в ту же папку, где он и располагается. Ключ должен быть в байтовом формате. Поэтому, нужно его перед тем, как передавать его в функцию, в него перевести. Либо как в примере, либо, использовав функцию encode().
Распаковка и расшифровка 7zip-архива
У данного типа архива при шифровании может использоваться алгоритм на выбор. А потому библиотека, которая распаковывает такие архивы, в теории, должна уметь автоматически подбирать нужный алгоритм для распаковки.
Для распаковки 7zip я использовал библиотеку py7zr, которая устанавливается в терминале с помощью команды:
pip install py7zr
Далее она импортируется в скрипт. Вот небольшой код для расшифровки и распаковки:
Python:
# pip install py7zr
import py7zr
try:
with py7zr.SevenZipFile('test.txt.7z', mode='r', password='123') as z:
z.extractall()
except py7zr.exceptions.Bad7zFile as ex:
if str(ex) == 'not a 7z file':
print('Файл не является 7zip')
Параметры для распаковки, это путь к файлу архива, метод, который используется для открытия зашифрованного файла. Так как файл расшифровывается и распаковывается, то здесь нужно использовать read. И пароль к зашифрованному файлу. Я пробовал указать для распаковки с помощью данной библиотеки zip-архив. И если оригинальный архиватор 7zip справляется с этим на ура, то в данном случае возникает исключение, текст которого так и гласит, что файл не является 7zip.
Расшифровка и распаковка RAR
С данным типом архивов возникли довольно большие трудности. Не в том плане, что его невозможно распаковать без установленного архиватора, а в том плане, что он является проприетарным, следовательно, компоненты для его работы нужно качать с
Ссылка скрыта от гостей
. В данном случае скачивается исполняемый файл unrar.exe, который нужно положить либо в папку с расшифровываемым архивом, либо в папку WinRAR, которую нужно создать в Program Files. Для того чтобы библиотека, то есть интерфейс к данному экзешнику, корректно находил к ней путь. Ну и так как exe используется в ОС Windows, то, как вы поняли, речь пока идет о ней. Или, если у вас уже установлен архиватор WinRAR, качать ничего не надо. Библиотека использует для распаковки Rar.exe находящийся в папке с программой. Его, при отсутствии архиватора и большом желании можно найти в интернете и положить в папку с архивом для распаковки. Данная конструкция тоже будет работать.А теперь о том, что понадобиться. А понадобиться установить библиотеку patoolib с помощью команды в терминале:
pip install patoolib.
Используется в коде она очень просто. Для начала импортируется в скрипт, а затем указывается в качестве опций путь для распаковки. И на этом все. Библиотека сама ищет Rar или Unrar.exe по заданным в ней путям и использует их в работе.
Python:
# pip install patoolib
import patoolib
patoolib.extract_archive("test.rar")
Здесь пароль для распаковки в коде не указывается, а вводиться в терминале. А значит, в автоматическом режиме данную конструкцию использовать не получиться. Есть еще библиотеки, которые выполняют похожие функции. Но, все они, в той или иной степени, используют инструменты Rar.
Если вы решите распаковать данный вид архива с помощью python в Linux, то вам нужно будет установить библиотеку unrar. Ну и rar, в придачу, чтобы была возможность эти архивы создавать. Мало ли, вдруг для чего-то может, потребуется.
sudo apt-get install -y rar unrar
Вот такая вот небольшая заметка. Надеюсь, что она кому-то поможет при работе с запароленными архивами. Хотя это и не секретная информация, но искать ее в куче статей о работе с архивами с помощью zipfile довольно нудно ))
Ну и небольшой код, который пытается работать с запароленными zip-архивами. А началось все с того, что у меня в архиве лежала нужная информация, а вот пароль на него я подзабыл. Потому и попробовал написать код для работы с запароленными архивами с помощью стандартной библиотеки и столкнулся с трудностями по расшифровке. Ну и соответственно, начал искать информацию:
Python:
# pip install pyzipper
# pip install tqdm
import pyzipper
from tqdm import tqdm
def decrypt(extracted_zip, word):
try:
extracted_zip.extractall(pwd=word)
except RuntimeError:
pass
except pyzipper.zipfile.BadZipFile:
pass
else:
print(f'\n[+] Пароль найден: {word.decode()}')
exit(0)
def open_pass_list(wordlist, file_path):
len_zip = len(list(open(wordlist, 'rb')))
with open(wordlist, 'r', errors='ignore') as wordlist:
with pyzipper.AESZipFile(file_path, 'r', compression=pyzipper.ZIP_LZMA,
encryption=pyzipper.WZ_AES) as extracted_zip:
for word in tqdm(wordlist, total=len_zip, unit=' word'):
decrypt(extracted_zip, word.strip().encode())
def main():
wordlist = input('[+] Введите путь к словарю: ')
file_path = input('[+] Введите путь к архиву: ')
print(" ")
open_pass_list(wordlist, file_path)
if __name__ == "__main__":
main()
Работа с архивом идет по словарю. А потому, его надо где-то скачать. Впрочем, в интернете словарей великое множество. Но я использовал rockyou.txt. Это, наверно, один из самых больших словарей с паролями, которые я видел. Попадались мне и на 10 миллионов. Но тут, больше 14-ти. К слову, пароль я так и не нашел. Пришлось вспоминать самостоятельно ))
Спасибо за внимание. Надеюсь, что данная информация будет вам полезна
Последнее редактирование: