7Z压缩支持加密

import java.io.;
import java.security.
;

import javax.crypto.*;

import org.apache.commons.compress.archivers.ArchiveStreamFactory;

import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;

import org.apache.commons.compress.archivers.sevenz.SevenZFile;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

import java.security.Provider;

public class SevenZCompressor {

public static void main(String\[\] args) {

try {

SevenZCompressor comp = new SevenZCompressor();

File inputFile = new File("input");

File outputFile = new File("output.7z");

int compressionLevel = 9; // 设置压缩级别,0为无压缩,9为最高压缩

Key secretKey = generateSecretKey();

comp.compressFolder(inputFile, outputFile, secretKey, compressionLevel);

} catch (Exception e) {

e.printStackTrace();

}

}

复制代码
public void compressFolder(File folder, File outputFile, Key secretKey, int compressionLevel) throws IOException, NoSuchAlgorithmException {
    OutputStream output-sevenZ = new FileOutputStream(outputFile);
    OutputStream output = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.SEVEN_Z, output-sevenZ);

    output = new CipherOutputStream(output, createCipher(secretKey));
    
    // 设置压缩方法
    SevenZArchiveEntry entry = new SevenZArchiveEntry(folder.getName());
    entry.setMethod(SevenZArchiveEntryMETHODSTORE);
    entry.setCompressionMethod(compressionLevel);
    output.putArchiveEntry(entry);

    // 添加文件或文件夹到压缩文件中
    SevenZFile sevenZFile = new SevenZFile(output-sevenZ);
    sevenZFile.addFile(folder);

    output.closeArchiveEntry();

    output.close();
}

private Cipher createCipher(Key secretKey) throws NoSuchAlgorithmException, NoSuchPaddingException {
    SecretKeySpec keySpec = new SecretKeySpec(secretKey.getEncoded(), "Blowfish");
    BouncyCastleProvider provider = new BouncyCastleProvider();
    Security.addProvider(provider);
    Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding", provider);
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(new byte[16]));
    return cipher;
}

private Key generateSecretKey() throws NoSuchAlgorithmException, InvalidKeyException {
    KeyGenerator keyGenerator = KeyGenerator.getInstance("Blowfish");
    keyGenerator.init(128);
    return keyGenerator.generateKey();
}

}

相关推荐
折哥的程序人生 · 物流技术专研9 小时前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
researcher-Jiang9 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
西门吹-禅11 小时前
java springboot N+1问题
java·开发语言·spring boot
DLYSB_11 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
weixin_BYSJ198711 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
AI小码11 小时前
LLM 应用的缓存工程:当每次 API 调用都在燃烧成本
java·人工智能·spring·计算机·llm·编程·api
Hui Baby12 小时前
Spring Security
java·后端·spring
IT笔记13 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
我才是银古13 小时前
构建 Java GIS 工具库:从碎片化 API 到统一抽象的设计实践
java·gis·geotools·gdal·esri
TPBoreas13 小时前
配置信息防泄露方案:.env 环境隔离详解(dotenv-java)
java·开发语言