Overwiew

Data security is paramount in today's digital landscape, and one effective way to safeguard sensitive information is through encryption. This overview will guide you on how to encrypt or decrypt an entire archive or specific entries within it, ensuring the confidentiality and integrity of your data. Aspose.ZIP facilitates a range of operations pertaining to the encryption and decryption of archives.

How to Encrypt or Decrypt whole ZIP Archive

Encrypt Zip archive with traditional method

There are two encryption methods available for ZIP archive: traditional, considered as weak now, and modern AES. ZIP standard allows any entry to be encrypted with either of these methods even within the same archive. AES encryption offers stronger security and is available in different key lengths (128-bit, 192-bit, and 256-bit). It provides better protection for sensitive data within ZIP archives.

Files compressed with Deflate

    using (var zipFile = File.Open("archive.zip", FileMode.Create))
    {
        using (var source = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
        {
            var archive = new Archive(new ArchiveEntrySettings(CompressionSettings.Deflate, new TraditionalEncryptionSettings("p@s$")));
            archive.CreateEntry("alice29.txt", source);
            archive.Save(zipFile);
        }
    }

Encrypting whole archive with AES method

    using (var zipFile = File.Open("archive.zip", FileMode.Create))
    {
        using (var source = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
        {
            using (var archive = new Archive(new ArchiveEntrySettings(CompressionSettings.Deflate, new AesEcryptionSettings("p@s$", EncryptionMethod.AES256))))
            {
                archive.CreateEntry("alice29.txt", source);
                archive.Save(zipFile);
            }
        }
    }

These samples show how to embed EncryptionSetting instances in the corresponding Archive constructor . This enables selective encryption of individual entries, keeping others unencrypted.

Encrypt the second entry of the three in Zip Archive

    using (FileStream zipFile = File.Open(this.resultFile, FileMode.Create))
    {
        FileInfo source1 = new FileInfo("alice29.txt");
        FileInfo source2 = new FileInfo("asyoulik.txt");
        FileInfo source3 = new FileInfo("fields.c");

        using (var archive = new Archive())
        {
            archive.CreateEntry("alice29.txt", source1);
            archive.CreateEntry("asyoulik.txt", source2, false, new ArchiveEntrySettings(null, new AesEcryptionSettings("p@s$", EncryptionMethod.AES256)));
            archive.CreateEntry("fields.c", source3);
            archive.Save(zipFile);
        }
    }

While it may seem unconventional, it is indeed feasible to encrypt specific entries within a ZIP archive using different encryption methods and passwords. This approach allows for a more granular and customized security strategy, where individual files or groups of files can have distinct levels of protection. However, it’s important to note that this practice may complicate the management and decryption process, and compatibility with various ZIP archive tools could vary.

Encrypt Zip with different methods and passwords

    using (FileStream zipFile = File.Open(this.resultFile, FileMode.Create))
    {
        FileInfo source1 = new FileInfo("alice29.txt");
        FileInfo source2 = new FileInfo("asyoulik.txt");
        FileInfo source3 = new FileInfo("fields.c");

        using (var archive = new Archive())
        {
            archive.CreateEntry("alice29.txt", source1, false, new ArchiveEntrySettings(null, new AesEcryptionSettings("p@s$1", EncryptionMethod.AES256)));
            archive.CreateEntry("asyoulik.txt", source2, false, new ArchiveEntrySettings(null, new TraditionalEncryptionSettings("p@s$2")));
            archive.CreateEntry("fields.c", source3, false, new ArchiveEntrySettings(null, new AesEcryptionSettings("p@s$3", EncryptionMethod.AES256)));
            archive.Save(zipFile);
        }
    }

Aspose.ZIP allows you to add encryption to an existing archive without fully repacking the contents. However, it’s important to note that all entries of the archive must be unprotected; otherwise, an exception will be raised.

Encrypt existing ZIP archive

    using (var archive = new Archive("plain.zip"))
    {
        archive.Save("encrypted.zip", new ArchiveSaveOptions() 
        { 
            EncryptionOptions = new AesEcryptionSettings("p@s$", EncryptionMethod.AES256)
        });
    }

Decrypting a Zip archive

The user has the option to decrypt either a specific entry within the encrypted ZIP archive or the entire archive as a whole.

Decrypt particular entry

    using (var zipFile = File.Open("archive.zip", FileMode.Create))
    {
        using (var source = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
        {
            var archive = new Archive(new ArchiveEntrySettings(CompressionSettings.Deflate, new TraditionalEncryptionSettings("p@s$")));
            archive.CreateEntry("alice29.txt", source);
            archive.Save(zipFile);
        }
    }

Decrypt whole Zip archive

In this case we need to provide password within a constructor.

    using (var zipFile = File.Open("archive.zip", FileMode.Create))
    {
        using (var source = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
        {
            using (var archive = new Archive(new ArchiveEntrySettings(CompressionSettings.Deflate, new AesEcryptionSettings("p@s$", EncryptionMethod.AES256))))
            {
                archive.CreateEntry("alice29.txt", source);
                archive.Save(zipFile);
            }
        }
    }

How to Encrypt or Decrypt RAR Archive

Decrypting a RAR archive

Aspose.ZIP does not support RAR archive composition, it only supports extraction. RAR archive can be encrypted with or without protecting file names.
In the former case user need to provide decryption password within RarArchiveLoadOptions in the very beginning of RAR archive instantiation. In the latter case, it is possible to pass password later on entry extraction.

Decrypt whole RAR archive with encrypted file names

    using (RarArchive archive = new RarArchive("source.rar", 
    new RarArchiveLoadOptions() { DecryptionPassword = "p@s$" }))
    {
        archive.ExtractToDirectory("destination");
    }

Decrypt particular entry from RAR archive

This sample would work if only content of entries is encrypted but file names are not.

    using (RarArchive archive = new RarArchive("source.rar"))
    {
        archive.Entries[0].Extract("first_entry.bin", "p@s$");
    }

Decrypt particular entry from RAR archive as a stream

However, in this sample , the assumption is that only the content of entries is encrypted, not the file names. This necessitates copying entry bytes to a memory stream.

    MemoryStream destination = new MemoryStream();
    using (RarArchive archive = new RarArchive("source.rar"))
    {
        using (var source = archive.Entries[1].Open("p@s$"))
        {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0)
            {
                destination.Write(buffer, 0, bytesRead);
            }
        }
    }

How to Encrypt or Decrypt whole 7ZIP Archive

Methods to Encrypt 7z Archive Files

The only option of 7z archive encryption is AES .

Encrypt and compress with LZMA2 whole 7z archive

7Z archives supports an ability to encrypt each entry with own password or leave unprotected.

    using (FileStream szFile = File.Open("archive.7z", FileMode.Create))
    {
        FileInfo source1 = new FileInfo("alice29.txt");
        FileInfo source2 = new FileInfo("asyoulik.txt");	
        FileInfo source3 = new FileInfo("fields.c");

        using (var archive = new SevenZipArchive(new SevenZipEntrySettings(new SevenZipLZMA2CompressionSettings(), new SevenZipAESEncryptionSettings("p@s$"))))
        {
            archive.CreateEntry("alice29.txt", source1);
            archive.CreateEntry("asyoulik.txt", source2);
            archive.CreateEntry("fields.c", source3);
            archive.Save(szFile);
        }
    }

Encrypt entries of 7z archive with own passwords and leave one entry unencrypted

Similar as ZIP, user can decrypt either whole archive or particular entry from it.
7Z archive can be encrypted with or without protecting file names. If file names are encrypted, you need to provide password on archive instantiation .

    using (FileStream szFile = File.Open("archive.7z", FileMode.Create))
    {
        FileInfo source1 = new FileInfo("alice29.txt");
        FileInfo source2 = new FileInfo("asyoulik.txt");
        FileInfo source3 = new FileInfo("fields.c");

        using (var archive = new SevenZipArchive())
        {
            archive.CreateEntry("alice29.txt", source1);
            archive.CreateEntry("asyoulik.txt", source2, false, new SevenZipEntrySettings(new SevenZipLZMA2CompressionSettings(), new SevenZipAESEncryptionSettings("p@s$")));
            archive.CreateEntry("fields.c", source3, false, new SevenZipEntrySettings(new SevenZipLZMA2CompressionSettings(), new SevenZipAESEncryptionSettings("$ecret")));
            archive.Save(szFile);
        }
    }

Decrypt whole archive with encrypted file names to directory

Whether file names are encrypted or not, it is safe to provide password within extracting constructor.
The below sample will only work when only content is protected.

    using (SevenZipArchive archive = new SevenZipArchive("archive.7z", "p@s$")) 
    { 
        archive.ExtractToDirectory("C:\\extracted");
    }

Decrypt particular entry

    using (SevenZipArchive archive = new SevenZipArchive("archive.7z"))
    {
        archive.Entries[0].Extract("data.bin", "p@s$");
    }
  

Support and Learning Resources

  
  

Aspose.Zip offers individual archive processing APIs for other popular development environments, listed below: