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

}

相关推荐
早日退休!!!21 分钟前
大模型推理瓶颈七层分析模型
java·服务器·数据库
叶小鸡37 分钟前
Java 篇-项目实战-天机学堂(从0到1)-day9
java·开发语言
@#¥&~是乱码鱼啦1 小时前
Spring分层架构:Controller、Service、Mapper数据链路,IOC的真实工作意义
java·spring·架构
xieliyu.1 小时前
Java手搓数据结构:从零模拟实现无头双向非循环链表
java·数据结构·链表
薪火铺子1 小时前
SpringMVC请求处理流程源码解析(第3篇):视图渲染与异常处理
java·后端·spring
逻辑驱动的ken2 小时前
Java高频面试场景题19
java·开发语言·面试·职场和发展·求职招聘
leoufung2 小时前
LeetCode 42:接雨水 —— 从“矩形法”到双指针的完整思考过程
java·算法·leetcode
小碗羊肉2 小时前
【MySQL | 第十一篇】InnoDB引擎
java·数据库·mysql
Dylan的码园2 小时前
Maven基础架构与整体认识
java·junit·maven
弹不出的5h3ll3 小时前
Ghost Bits:高位截断如何让 Java WAF 形同虚设
java·开发语言