C#を使用して、ファイルがパスワードで保護されたZIPファイルであることを検証する方法

StackOverflow https://stackoverflow.com/questions/1640223

質問

ファイルへのパスを指定した場合、そのファイルがパスワードで保護されたzipファイルであることをどのように検証できますか?

つまり、この機能をどのように実装しますか?

bool IsPasswordProtectedZipFile(string pathToFile)

ファイルを解凍する必要はありません。ZIPであり、パスワードで保護されていることを確認する必要があります。

ありがとう

役に立ちましたか?

解決

SharpZipLib を使用すると、次のコードが機能します。そして、仕事では、 entry.IsCrypted は、zipファイルの最初のエントリにパスワードがあるかどうかに基づいてtrueまたはfalseを返します。

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;
    }
}

実際のエラー処理などはありません...

他のヒント

ZIPアーカイブでは、パスワードはファイルではなく、ファイル内の個々のエントリに配置されます。 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;
    }
}

.NET Frameworkの成熟度のこの時点で、サードパーティのツールを使用する必要があります。 Google化できる商用ライブラリは数多くあります。 MicrosoftのCodeplex Webサイト DotNetZip から1つを無料で提案しています。フロントページには、「ライブラリはzipパスワードをサポート」と記載されています。

すべてのzipエントリが暗号化されているかどうかを確認する100%正しい方法はありません。 zipファイルのすべてのエントリは独立しており、独自のパスワード/暗号化されたメソッドを持つことができます。

ほとんどの場合、zipfileはいくつかのソフトウェアによって圧縮されています。これらのソフトウェアは、zipfileのすべてのエントリに共通のパスワードと暗号化された方法が含まれていることを確認します。

したがって、最初のzipentry(ディレクトリではない)を使用して、そのzipファイルが暗号化されているかどうかを確認すると、ほとんどの場合に対応できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top