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

}

相关推荐
Jabes.yang5 小时前
Java求职面试:从Spring Boot到Kafka的技术探讨
java·spring boot·面试·kafka·互联网大厂
canonical_entropy5 小时前
DDD本质论:从哲学到数学,再到工程实践的完整指南之实践篇
java·后端·领域驱动设计
_Power_Y6 小时前
Java面试常用算法api速刷
java·算法·面试
纪莫6 小时前
技术面:Spring (事务传播机制、事务失效的原因、BeanFactory和FactoryBean的关系)
java·spring·java面试⑧股
红衣小蛇妖6 小时前
LeetCode-704-二分查找
java·算法·leetcode·职场和发展
!chen6 小时前
【Spring Boot】自定义starter
java·数据库·spring boot
koko426 小时前
天津小公司面经
java·学习·面试
zjjuejin6 小时前
Maven 现代开发流程的集成
java·后端·maven
Zzzzmo_6 小时前
【Java】杨辉三角、洗牌算法
java·数据结构·算法
码界奇点6 小时前
基于飞算JavaAI的在线图书借阅平台从设计到实现的完整指南
java·飞书