Tổng quan

Aspose.ZIP tạo điều kiện thuận lợi cho một số hoạt động liên quan đến mã hóa và giải mã tài liệu lưu trữ. Sử dụng API Aspose.Zip cho Java, bạn có thể nhanh chóng Mã hóa và giải mã các kho lưu trữ ZIP, RAR, 7-Zip.

Mã hóa/Giải mã tập tin ZIP

Có hai phương thức mã hóa dành cho kho lưu trữ ZIP : phương thức truyền thống hiện được coi là yếu và phương thức AES hiện đại. Tiêu chuẩn ZIP cho phép mọi mục nhập được mã hóa bằng một trong hai phương pháp, ngay cả trong cùng một kho lưu trữ ZIP. Mã hóa AES cung cấp khả năng bảo mật mạnh mẽ hơn và có sẵn ở các độ dài khóa khác nhau (128 bit, 192 bit và 256 bit). Điều này giúp bảo vệ tốt hơn cho dữ liệu nhạy cảm được lưu trữ trong kho lưu trữ ZIP.

Mã hóa ZIP bằng phương pháp 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());
    }

Mã này tạo một kho lưu trữ ZIP có tên "archive.zip" bằng phương pháp nén Deflate và mã hóa ZIP truyền thống. Nó đạt được điều này bằng cách trước tiên mở luồng đầu ra mới cho kho lưu trữ bằng cách sử dụng thử FileOutputStream. Nguồn FileInputStream đóng vai trò là luồng đầu vào cho tệp nguồn "alice29.txt" sẽ được thêm vào kho lưu trữ. Tiếp theo, một đối tượng Archive được tạo, chỉ định cả phương pháp nén Deflate và mã hóa truyền thống. Mật khẩu để mã hóa được đặt thành "p@s$S". Câu lệnh bắt xử lý mọi trường hợp ngoại lệ có thể phát sinh trong quá trình thao tác tệp hoặc lưu trữ, in thông báo lỗi ra bảng điều khiển.

Mã hóa ZIP bằng phương pháp 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());
    }

Mã này tạo một kho lưu trữ ZIP có tên "archive.zip" bằng phương pháp nén Deflate và mã hóa dữ liệu bằng thuật toán mạnh AES-256.
Đối với những mẫu này, chúng tôi đã cung cấp các phiên bản của EncryptionSetting trong Archive constructor . Có thể áp dụng mã hóa cho mục nhập cụ thể mà không bảo vệ mục khác.

Sử dụng thuật toán mã hóa ZIP, mã hóa mục nhập thứ hai của ba

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

Mã này minh họa việc tạo một kho lưu trữ ZIP với ba tệp đầu vào: "alice29.txt", "asyoulik.txt" và "fields.c". Đặc biệt, tệp đầu tiên và tệp cuối cùng được thêm vào mà không được mã hóa, trong khi tệp thứ hai, "asyoulik.txt", được bảo vệ bằng mật khẩu bằng mã hóa AES-256 với mật khẩu "p@s$S".
Phương pháp mã hóa có chọn lọc này các tập tin trong kho lưu trữ ZIP là không phổ biến. Tuy nhiên, API Aspose.Zip cho Java cung cấp chức năng mã hóa các mục cụ thể trong kho lưu trữ ZIP bằng các phương thức mã hóa và mật khẩu khác nhau. Mặc dù điều này giúp tăng cường bảo mật dữ liệu nhưng lại làm phức tạp quá trình quản lý và giải mã kho lưu trữ

Mã hóa ZIP bằng các phương pháp và mật khẩu khác nhau

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

Mã này tạo một kho lưu trữ ZIP chứa ba tệp được mã hóa: "alice29.txt", "asyoulik.txt" và "fields.c". Mỗi tệp được mã hóa bằng một phương thức riêng biệt.
Phần đầu tiên phản ánh chức năng của ví dụ mã trước đó. Phần cốt lõi tập trung vào việc tạo các mục trong kho lưu trữ cho mỗi tệp. Các mục này tham chiếu tên và tệp nguồn của chúng (Đối tượng tệp). Mã hóa được áp dụng với nhiều phương pháp khác nhau:

  • "alice29.txt" : Mã hóa AES-256 với mật khẩu "p@s$S"
  • "asyoulik.txt" : Truyền thống phương thức mã hóa với mật khẩu "p@s$D"
  • "fields.c" : Mã hóa AES-256 với mật khẩu "p@s$F"
Phần cuối cùng lưu kho lưu trữ và bao gồm việc xử lý lỗi để thông báo cho bạn về bất kỳ vấn đề nào trong quá trình này.

Mã hóa kho lưu trữ ZIP hiện có

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

Mã này lấy một kho lưu trữ "plain.zip" hiện có, áp dụng mã hóa AES cho nó bằng mật khẩu "p@s$S" và lưu nó dưới dạng một kho lưu trữ mới có tên "encrypted.zip"

Giải mã tệp ZIP bằng mật khẩu

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

Mã này trích xuất mục nhập đầu tiên từ kho lưu trữ "source.zip" và lưu nó dưới dạng tệp có tên "first_entry.bin" bằng mật khẩu "p@s$S".
Người dùng có tùy chọn giải mã một mục cụ thể trong kho lưu trữ ZIP được mã hóa hoặc toàn bộ kho lưu trữ.

Giải mã toàn bộ tệp ZIP

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

Trong trường hợp này, chúng tôi cần cung cấp mật khẩu trong hàm tạo.

Mã hóa/Giải mã tệp RAR bằng Java

Aspose.ZIP không cung cấp chức năng tạo lưu trữ RAR ; nó chỉ hỗ trợ khai thác. Kho lưu trữ RAR có thể được mã hóa, với tùy chọn bảo vệ tên tệp hoặc không.
Trong trường hợp trước, người dùng phải cung cấp mật khẩu giải mã trong đối tượng RarArchiveLoadOptions khi khởi tạo Lưu trữ RAR. Trong trường hợp sau, mật khẩu có thể được cung cấp trong quá trình trích xuất các mục riêng lẻ.

Giải mã file RAR bằng tên file được mã hóa

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

Mã này giải mã và trích xuất nội dung của kho lưu trữ "source.rar" vào thư mục "destination". Nếu kho lưu trữ được mã hóa, nó sẽ sử dụng mật khẩu giải mã được chỉ định.
Sau đây là thông tin chi tiết về cách thức hoạt động của nó:

  • Tải cài đặt bằng mật khẩu giải mã: Đầu tiên, nó tạo một đối tượng cài đặt tải cho Lưu trữ RAR bằng toán tử tùy chọn RarArchiveLoadOptions. Sau đó, nó đặt mật khẩu giải mã cho kho lưu trữ bằng phương thức options.setDecryptionPassword.
  • Mở kho lưu trữ được mã hóa: Dòng tiếp theo sẽ mở kho lưu trữ "source.rar" để đọc và chỉnh sửa bằng một *cấu trúc thử với tài nguyên. Nó chỉ định đối tượng tùy chọn với mật khẩu giải mã để xử lý các kho lưu trữ được mã hóa.
  • Trích xuất nội dung lưu trữ: Cuối cùng, phương thức archive.extractToDirectory trích xuất nội dung của kho lưu trữ được giải mã đến "đích" thư mục.

Tệp RAR giải mã mục tiêu

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

Đoạn mã này cố gắng trích xuất mục nhập đầu tiên từ kho lưu trữ RAR "source.rar" và lưu nó dưới dạng "first_entry.bin", sử dụng mật khẩu giải mã "p@s$S" nếu kho lưu trữ được mã hóa.

Giải mã nội dung mục nhập RAR cụ thể (Luồng)

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

Đoạn mã này nhắm mục tiêu một mục cụ thể trong kho lưu trữ RAR. Nó giải mã nội dung của mục nhập và truyền trực tiếp vào bộ nhớ, giả sử chỉ có dữ liệu mục nhập được mã hóa chứ không phải tên tệp.
Mô tả đầy đủ về chức năng của mã:

  • Khởi tạo bộ đệm bộ nhớ : Đích có tên ByteArrayOutputStream được tạo để phục vụ như một bộ đệm trong bộ nhớ để lưu trữ nội dung được giải mã của mục nhập được nhắm mục tiêu.
  • Quyền truy cập lưu trữ và mục nhập: Mã sử ​​dụng cơ chế thử với -resources để mở kho lưu trữ RAR nguồn "source.rar". Bên trong một khối try-with-resources khác, nó truy xuất luồng đầu vào cho mục nhập thứ hai và giải mã nó bằng mật khẩu "p@s$S".
  • Decryption and Streaming: Các byte được giải mã được đọc từ luồng đầu vào theo từng đoạn bằng cách sử dụng bộ đệm. Mỗi đoạn sau đó được ghi vào ByteArrayOutputStream đích cho đến khi tất cả dữ liệu được xử lý.
  • Xử lý lỗi: Mã kết hợp một khối bắt để xử lý bất kỳ IOExceptions tiềm năng nào có thể phát sinh trong quá trình giải mã hoặc truyền phát. Nếu xảy ra lỗi, thông báo lỗi sẽ được in ra luồng lỗi tiêu chuẩn nhằm mục đích gỡ lỗi.

Mã hóa và giải mã tệp 7-ZIP bằng Java

Sẽ được triển khai trong Aspose.ZIP cho phiên bản Java 24.4. Tùy chọn mã hóa lưu trữ 7z duy nhất là AES.

Mã hóa và nén file 7-Zip bằng 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);
        }
    }

Kho lưu trữ 7Z hỗ trợ khả năng mã hóa từng mục nhập bằng mật khẩu riêng hoặc không được bảo vệ. Mã này tạo một kho lưu trữ 7z mới với tính năng nén và mã hóa LZMA2 và AES.

  • Mở tệp: FileStream được sử dụng để mở tệp mới có tên "archive.7z" trong chế độ tạo.
  • Khởi tạo đối tượng: Ba đối tượng FileInfo được tạo cho các tệp "alice29.txt", "asyoulik.txt" và "fields.c".
  • Tạo tệp 7-zip: Đối tượng SevenZipArchive được tạo bằng:
    - LZMA2 cài đặt nén.
    - Cài đặt mã hóa AES bằng mật khẩu "p@s$S"
  • Thêm tệp: Các phương thức CreateEntry được sử dụng để thêm từng tệp vào kho lưu trữ từ một tệp riêng biệt nguồn.
  • Lưu bản lưu trữ: Bản lưu trữ được lưu vào luồng tệp szFile bằng phương thức Lưu.

Mã hóa chọn lọc trong kho lưu trữ 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);
        }
    }

Mã này tạo một kho lưu trữ 7z chứa ba tệp: "alice29.txt", "asyoulik.txt" và "fields.c". Hai tệp sau được nén và mã hóa bằng các mật khẩu khác nhau.
Không giống như mã trước đó, phương thức archive.CreateEntry được sử dụng trên đối tượng lưu trữ để tạo các mục nhập cho mỗi tệp. Khi tạo mục nhập cho "asyoulik.txt" từ đối tượng FileInfo source2, tham số thứ ba của CreateEntry được đặt thành false. Điều này cho biết rằng cài đặt mã hóa và nén tùy chỉnh sẽ được sử dụng, được xác định trong tham số thứ tư (đối tượng SevenZipEntrySettings). Trong trường hợp này, cài đặt chỉ định nén "Zip LZMA2" và mã hóa "Zip AES" bằng mật khẩu "p@s$S".
Tương tự như ZIP, người dùng có thể giải mã toàn bộ kho lưu trữ hoặc mục nhập cụ thể từ đó.
7Z archive có thể được mã hóa có hoặc không có biện pháp bảo vệ tên tập tin. Nếu tên tệp được mã hóa, bạn cần cung cấp mật khẩu khi khởi tạo kho lưu trữ .

Giải mã 7z bằng tên tệp được mã hóa

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

Mã này sử dụng khối try-with-resources để mở kho lưu trữ 7z có tên "archive.7z" được bảo vệ bằng mật khẩu "p@s$S". Sau đó, nó trích xuất nội dung của kho lưu trữ vào thư mục "C:\extracted".
Cho dù tên tệp có được mã hóa hay không thì việc cung cấp mật khẩu trong hàm tạo giải nén là an toàn. Mẫu dưới đây sẽ chỉ hoạt động khi chỉ có nội dung được bảo vệ.

Giải mã mục nhập cụ thể 7z

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

Mã này sử dụng khối try-with-resources để mở kho lưu trữ 7z có tên "archive.7z" được bảo vệ bằng mật khẩu "p@s$S". Sau đó, nó trích xuất nội dung của kho lưu trữ vào thư mục "C:\extracted".
Cho dù tên tệp có được mã hóa hay không thì việc cung cấp mật khẩu trong hàm tạo giải nén là an toàn. Mẫu dưới đây sẽ chỉ hoạt động khi chỉ có nội dung được bảo vệ.

API nén Java được hỗ trợ khác

Sử dụng thư viện Java Aspose.ZIP để chuyển đổi, hợp nhất, chỉnh sửa tài liệu tệp zip, trích xuất dữ liệu từ kho lưu trữ và hơn thế nữa!

  

Support and Learning Resources

  
  

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