Как проверить, что файл является ZIP-файлом, защищенным паролем, с помощью С#

Учитывая путь к файлу, как я могу проверить, что файл является защищенным паролем zip-файлом?

то есть, как бы я реализовал эту функцию?

bool IsPasswordProtectedZipFile(string pathToFile)

Мне не нужно распаковывать файл — мне просто нужно убедиться, что это ZIP-файл и он защищен каким-то паролем.

Спасибо


person frankadelic    schedule 28.10.2009    source источник
comment


Ответы (4)


При использовании SharpZipLib работает следующий код. И под работами я подразумеваю, что entry.IsCrypted возвращает true или false в зависимости от того, есть ли пароль для первой записи в zip-файле.

var file = @"c:\testfile.zip";
FileStream fileStreamIn = new FileStream(file, FileMode.Open, FileAccess.Read);
ZipInputStream zipInStream = new ZipInputStream(fileStreamIn);
ZipEntry entry = zipInStream.GetNextEntry();
Console.WriteLine("IsCrypted: " + entry.IsCrypted);

В CodeProject есть простое руководство по использованию SharpZipLib.

Таким образом, простая реализация выглядит примерно так:

public static bool IsPasswordProtectedZipFile(string path)
{
    using (FileStream fileStreamIn = new FileStream(path, FileMode.Open, FileAccess.Read))
    using (ZipInputStream zipInStream = new ZipInputStream(fileStreamIn))
    {
        ZipEntry entry = zipInStream.GetNextEntry();
        return entry.IsCrypted;
    }
}

Обратите внимание, что нет реальной обработки ошибок или чего-то еще...

person Nader Shirazie    schedule 29.10.2009
comment
Спасибо - ключевой момент, который я сейчас понимаю, заключается в том, что мне нужно смотреть на отдельные записи внутри ZIP, поскольку они могут быть зашифрованы по отдельности. Пароль не применяется ко всему ZIP-файлу. DotNetZip в codeplex также имеет аналогичные возможности. - person frankadelic; 29.10.2009
comment
Да, точно. И из-за этого вы можете, например, захотеть просканировать весь архив в поисках любых записей с паролем, а не только первой... - person Nader Shirazie; 29.10.2009

В ZIP-архивах пароль размещается не на файле, а на отдельных записях внутри файла. Почтовый индекс может содержать некоторые записи в зашифрованном виде, а некоторые нет. Вот пример кода для проверки шифрования записей в DotNetZip:

int encryptedEntries = 0;
using (var zip = ZipFile.Read(nameOfZipFile)) 
{
    // check a specific, named entry: 
    if (zip["nameOfEntry.doc"].UsesEncryption)
       Console.WriteLine("Entry 'nameOfEntry.doc' uses encryption"); 

    // check all entries: 
    foreach (var e in zip)
    {
       if (e.UsesEncryption)
       {
           Console.WriteLine("Entry {0} uses encryption", e.FileName); 
           encryptedEntries++; 
       }
    }
}

if (encryptedEntries > 0) 
    Console.WriteLine("That zip file uses encryption on {0} entrie(s)", encryptedEntries); 

Если вы предпочитаете, вы можете использовать LINQ:

private bool ZipUsesEncryption(string archiveToRead)
{
    using (var zip = ZipFile.Read(archiveToRead))
    {
        var selection = from e in zip.Entries
            where e.UsesEncryption
            select e;

        return selection.Count > 0;
    }
}
person Cheeso    schedule 29.10.2009
comment
Спасибо. Я также нашел это решение DotNetZip - см. мои комментарии в принятом ответе выше. - person frankadelic; 29.10.2009

На этом этапе зрелости .NET Framework вам потребуется использовать сторонний инструмент. Есть много коммерческих библиотек, которые можно найти в Google. Я предлагаю один бесплатный файл с веб-сайта Microsoft Codeplex DotNetZip. На главной странице указано: «библиотека поддерживает zip-пароли».

person John K    schedule 28.10.2009

Не существует 100% правильного способа проверить, зашифрованы ли все записи zip. каждая запись в zip-файле независима и может иметь свой собственный пароль/метод шифрования.

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

Таким образом, использование первого zipentry (не каталога) для проверки того, зашифрован ли этот zip-файл, может охватывать большинство случаев.

person Mr rain    schedule 04.11.2015