Visão geral

Aspose.ZIP facilita uma série de operações relacionadas à criptografia e descriptografia de arquivos. Usando a API Aspose.Zip para Java, você pode criptografar e descriptografar rapidamente arquivos ZIP, RAR e 7-Zip.

Criptografar/descriptografar arquivos ZIP

Existem dois métodos de criptografia disponíveis para arquivos ZIP : o método tradicional, que agora é considerado fraco, e o método AES moderno. O padrão ZIP permite que qualquer entrada seja criptografada com qualquer método, mesmo dentro do mesmo arquivo ZIP. A criptografia AES oferece segurança mais forte e está disponível em diferentes comprimentos de chave (128 bits, 192 bits e 256 bits). Isso fornece melhor proteção para dados confidenciais armazenados em arquivos ZIP.

Criptografe um ZIP com o método Deflate

    try (FileOutputStream zipFile = new FileOutputStream("archive.zip")) {
        try (FileInputStream source = new FileInputStream("alice29.txt")) {
            Archive archive = new Archive(new ArchiveEntrySettings(CompressionSettings.getDeflate(), new TraditionalEncryptionSettings("p@s$S")));
            archive.createEntry("alice29.txt", source);
            archive.save(zipFile);
        }
    } catch (IOException ex) {
        System.err.println(ex.getMessage());
    }

Este código cria um arquivo ZIP chamado “archive.zip” usando o método de compactação Deflate e criptografia ZIP tradicional. Isso é conseguido abrindo primeiro um novo fluxo de saída para o arquivo usando try FileOutputStream. A fonte FileInputStream serve como fluxo de entrada para o arquivo de origem "alice29.txt" que será adicionado ao arquivo. Em seguida, um objeto Archive é criado, especificando o método de compactação Deflate e a criptografia tradicional. A senha para criptografia está definida como "p@s$S". A instrução catch trata quaisquer exceções que possam surgir durante operações de arquivo ou archive, imprimindo uma mensagem de erro no console.

Criptografando ZIP com método AES

    try (FileOutputStream zipFile = new FileOutputStream("archive.zip")) {
        try (FileInputStream source = new FileInputStream("alice29.txt")) {
            try (Archive archive = new Archive(new ArchiveEntrySettings(CompressionSettings.getDeflate(), new AesEncryptionSettings("p@s$S", EncryptionMethod.AES256)))) {
                archive.createEntry("alice29.txt", source);
                archive.save(zipFile);
            }
        }
    } catch (IOException ex) {
        System.err.println(ex.getMessage());
    }

Este código cria um arquivo ZIP chamado "archive.zip" usando o método de compactação Deflate e criptografa os dados com o forte algoritmo AES-256.
Para esses exemplos, fornecemos instâncias de EncryptionSetting dentro do construtor de arquivo . É possível aplicar criptografia para uma entrada específica deixando outras desprotegidas.

Usando o algoritmo de criptografia ZIP, criptografe a segunda entrada de três

    try (FileOutputStream zipFile = new FileOutputStream("archive.zip")) {
        File source1 = new File("alice29.txt");
        File source2 = new File("asyoulik.txt");
        File source3 = new File("fields.c");

        try (Archive archive = new Archive()) {
            archive.createEntry("alice29.txt", source1);
            archive.createEntry("asyoulik.txt", source2, false, new ArchiveEntrySettings(null, new AesEncryptionSettings("p@s$S", EncryptionMethod.AES256)));
            archive.createEntry("fields.c", source3);
            archive.save(zipFile);
        }
    } catch (IOException ex) {
        System.err.println(ex.getMessage());
    }

Este código demonstra a criação de um arquivo ZIP com três arquivos de entrada: "alice29.txt", "asyoulik.txt" e "fields.c". Exclusivamente, o primeiro e o último arquivos são adicionados sem criptografia, enquanto o segundo arquivo, "asyoulik.txt", é protegido por senha usando criptografia AES-256 com a senha "p@s$S".
Esta abordagem de criptografia seletiva arquivos dentro de um arquivo ZIP é incomum. No entanto, a API Aspose.Zip para Java fornece a funcionalidade para criptografar entradas específicas em um arquivo ZIP usando diferentes métodos de criptografia e senhas. Embora isso melhore a segurança dos dados, complica o processo de gerenciamento e descriptografia de arquivos

Criptografe ZIP com diferentes métodos e senhas

    try (FileOutputStream zipFile = new FileOutputStream("archive.zip")) {
        File source1 = new File("alice29.txt");
        File source2 = new File("asyoulik.txt");
        File source3 = new File("fields.c");

        try (Archive archive = new Archive()) {
            archive.createEntry("alice29.txt", source1, false, new ArchiveEntrySettings(null, new AesEncryptionSettings("p@s$S", EncryptionMethod.AES256)));
            archive.createEntry("asyoulik.txt", source2, false, new ArchiveEntrySettings(null, new TraditionalEncryptionSettings("p@s$D")));
            archive.createEntry("fields.c", source3, false, new ArchiveEntrySettings(null, new AesEncryptionSettings("p@s$F", EncryptionMethod.AES256)));
            archive.save(zipFile);
        }
    } catch (IOException ex) {
        System.err.println(ex.getMessage());
    }

Este código cria um arquivo ZIP contendo três arquivos criptografados: “alice29.txt”, “asyoulik.txt” e “fields.c”. Cada arquivo é criptografado com um método distinto.
A primeira parte reflete a funcionalidade do exemplo de código anterior. A seção principal concentra-se na criação de entradas no arquivo para cada arquivo. Essas entradas fazem referência a seus nomes e arquivos de origem (objetos de arquivo). A criptografia é aplicada com vários métodos:

  • "alice29.txt" : criptografia AES-256 com a senha "p@s$S"
  • "asyoulik.txt" : Tradicional método de criptografia com a senha "p@s$D"
  • "fields.c" : criptografia AES-256 com a senha "p@s$F"
A parte final salva o arquivo e inclui tratamento de erros para notificá-lo sobre quaisquer problemas durante o processo.

Criptografar arquivo ZIP existente

    try (Archive archive = new Archive("plain.zip")) {
        ArchiveSaveOptions options = new ArchiveSaveOptions();
        options.setEncryptionOptions(new AesEncryptionSettings("p@s$S", EncryptionMethod.AES256));
        archive.save("encrypted.zip", options);
    }

Este código pega um arquivo "plain.zip" existente, aplica criptografia AES a ele com a senha "p@s$S" e o salva como um novo arquivo chamado "encrypted.zip"

Descriptografar arquivo ZIP com senha

    try (Archive archive = new Archive("source.zip")) {
        archive.getEntries().get(0).extract("first_entry.bin", "p@s$S");
    }

Este código extrai a primeira entrada do arquivo "source.zip" e a salva como um arquivo chamado "first_entry.bin" usando a senha "p@s$S".
O usuário tem a opção de descriptografar uma entrada específica no arquivo ZIP criptografado ou o arquivo inteiro como um todo.

Descriptografar arquivo ZIP inteiro

    ArchiveLoadOptions options = new ArchiveLoadOptions();
    options.setDecryptionPassword("p@s$S");
    try (Archive archive = new Archive("source.zip", options)) {
        archive.extractToDirectory("destination");
    }

Neste caso precisamos fornecer uma senha dentro de um construtor.

Criptografar/descriptografar arquivo RAR com Java

Aspose.ZIP não fornece funcionalidade para criação de arquivos RAR ; ele suporta apenas a extração. Um arquivo RAR pode ser criptografado, com a opção de proteger nomes de arquivos ou não.
No cenário anterior, o usuário deve fornecer a senha de descriptografia dentro do objeto RarArchiveLoadOptions na inicialização do Arquivo RAR. Neste último caso, a senha pode ser fornecida durante a extração de entradas individuais.

Descriptografar arquivo RAR com nomes de arquivo criptografados

    RarArchiveLoadOptions options = new RarArchiveLoadOptions();
    options.setDecryptionPassword("p@s$S");
    try (RarArchive archive = new RarArchive("source.rar", options)) {
        archive.extractToDirectory("destination");
    }

Este código descriptografa e extrai o conteúdo do arquivo “source.rar” para a pasta “destination”. Se o arquivo estiver criptografado, ele usará a senha de descriptografia especificada.
Aqui está um detalhamento de como funciona:

  • Carregar configurações com senha de descriptografia: primeiro, ele cria um objeto de configurações de carregamento para o Arquivo RAR usando o operador de opções RarArchiveLoadOptions. Em seguida, ele define a senha de descriptografia para o arquivo usando o método options.setDecryptionPassword.
  • Open Encrypted Archive: A próxima linha abre o arquivo "source.rar" para leitura e edição usando um construção try-with-resources. Ele especifica o objeto de opções com a senha de descriptografia para lidar com arquivos criptografados.
  • Extrair conteúdo do arquivo: Finalmente, o método archive.extractToDirectory extrai o conteúdo do arquivo descriptografado para o "destino" pasta.

Arquivo RAR de descriptografia direcionada

    try (RarArchive archive = new RarArchive("source.rar")) {
        archive.getEntries().get(0).extract("first_entry.bin", "p@s$S");
    }

Este trecho de código tenta extrair a primeira entrada do arquivo RAR "source.rar" e salvá-la como "first_entry.bin", usando a senha de descriptografia "p@s$S" se o arquivo estiver criptografado.

Descriptografando conteúdo específico de entrada RAR (Stream)

    ByteArrayOutputStream destination = new ByteArrayOutputStream();
    try (RarArchive archive = new RarArchive("source.rar")) {
        try (InputStream source = archive.getEntries().get(1).open("p@s$S")) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = source.read(buffer, 0, buffer.length)) > 0) {
                destination.write(buffer, 0, bytesRead);
            }
        } catch (IOException ex) {
            System.err.println(ex.getMessage());
        }
    }

Este trecho de código tem como alvo uma entrada específica em um arquivo RAR. Ele descriptografa o conteúdo da entrada e o transmite diretamente para a memória, assumindo que apenas os dados da entrada estão criptografados, e não os nomes dos arquivos em si.
Uma descrição completa do que o código faz:

  • Inicialização do buffer de memória : Um destino nomeado ByteArrayOutputStream é criado para servir como um buffer na memória para armazenar o conteúdo descriptografado da entrada de destino.
  • Acesso a arquivo e entrada: o código utiliza um try-with -bloco de recursos para abrir o arquivo RAR de origem "source.rar". Dentro de outro bloco try-with-resources, ele recupera um fluxo de entrada para a segunda entrada e o descriptografa usando a senha "p@s$S".
  • Descriptografia e streaming: os bytes descriptografados são lidos do fluxo de entrada em partes usando um buffer. Cada parte é então gravada no ByteArrayOutputStream de destino até que todos os dados sejam processados.
  • Tratamento de erros: O código incorpora um bloco catch para tratar quaisquer possíveis IOExceptions que possam surgir durante o processo de descriptografia ou streaming. Se ocorrer um erro, a mensagem de erro será impressa no fluxo de erros padrão para fins de depuração.

Criptografar e descriptografar arquivo 7-ZIP com Java

Será implementado em Aspose.ZIP para versão Java 24.4. A única opção de criptografia de arquivo 7z é AES.

Criptografar e compactar arquivo 7-Zip com LZMA2

    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$S"))))
        {
            archive.CreateEntry("alice29.txt", source1);
            archive.CreateEntry("asyoulik.txt", source2);
            archive.CreateEntry("fields.c", source3);
            archive.Save(szFile);
        }
    }

Os arquivos 7Z suportam a capacidade de criptografar cada entrada com sua própria senha ou deixá-la desprotegida. Este código cria um novo arquivo 7z com compactação e criptografia LZMA2 e AES.

  • Abertura de arquivo: Um FileStream é usado para abrir um novo arquivo chamado "archive.7z" no modo de criação.
  • Inicializando objetos: Três objetos FileInfo são criados para os arquivos "alice29.txt", "asyoulik.txt" e "fields.c".
  • Criando um arquivo 7-zip: O objeto SevenZipArchive é criado com:
    - configurações de compactação LZMA2.
    - Configurações de criptografia AES usando a senha "p@s$S"
  • Adicionando arquivos: Os métodos CreateEntry são usados ​​para adicionar cada arquivo ao arquivo a partir de um arquivo separado fonte.
  • Salvando o arquivo: O arquivo é salvo no fluxo de arquivos szFile usando o método Save.

Criptografia seletiva no arquivo 7z

    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$S")));
            archive.CreateEntry("fields.c", source3, false, new SevenZipEntrySettings(new SevenZipLZMA2CompressionSettings(), new SevenZipAESEncryptionSettings("$ecret")));
            archive.Save(szFile);
        }
    }

Este código cria um arquivo 7z contendo três arquivos: “alice29.txt”, “asyoulik.txt” e “fields.c”. Os dois últimos arquivos são compactados e criptografados com senhas diferentes.
Diferentemente do código anterior, o método archive.CreateEntry é usado no objeto archive para criar entradas para cada arquivo. Ao criar a entrada para "asyoulik.txt" a partir do objeto source2 FileInfo, o terceiro parâmetro de CreateEntry é definido como false. Isso indica que serão usadas configurações personalizadas de compactação e criptografia, definidas no quarto parâmetro (um objeto SevenZipEntrySettings). Neste caso, as configurações especificam a compactação "Zip LZMA2" e a criptografia "Zip AES" com a senha "p@s$S".
Semelhante ao ZIP, o usuário pode descriptografar o arquivo inteiro ou uma entrada específica dele.
arquivo 7Z pode ser criptografado com ou sem proteção nomes de arquivos. Se os nomes dos arquivos estiverem criptografados, você precisará fornecer uma senha na instanciação do arquivo .

Descriptografia 7z com nomes de arquivos criptografados

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

Este código utiliza um bloco try-with-resources para abrir um arquivo 7z chamado "archive.7z" protegido com a senha "p@s$S". Em seguida, extrai o conteúdo do arquivo para a pasta "C:\extracted".
Quer os nomes dos arquivos sejam criptografados ou não, é seguro fornecer uma senha no construtor de extração. O exemplo abaixo só funcionará quando apenas o conteúdo estiver protegido.

Descriptografando entrada específica 7z

    try (SevenZipArchive archive = new SevenZipArchive("archive.7z")) {
        archive.getEntries().get(0).extract("data.bin", "p@s$S");
    }

Este código utiliza um bloco try-with-resources para abrir um arquivo 7z chamado "archive.7z" protegido com a senha "p@s$S". Em seguida, extrai o conteúdo do arquivo para a pasta "C:\extracted".
Quer os nomes dos arquivos sejam criptografados ou não, é seguro fornecer uma senha no construtor de extração. O exemplo abaixo só funcionará quando apenas o conteúdo estiver protegido.

  

Support and Learning Resources

  
  

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