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

}

相关推荐
Han.miracle2 小时前
数据结构——二叉树的从前序与中序遍历序列构造二叉树
java·数据结构·学习·算法·leetcode
Le1Yu3 小时前
分布式事务以及Seata(XA、AT模式)
java
寒山李白4 小时前
关于Java项目构建/配置工具方式(Gradle-Groovy、Gradle-Kotlin、Maven)的区别于选择
java·kotlin·gradle·maven
无妄无望4 小时前
docker学习(4)容器的生命周期与资源控制
java·学习·docker
MC丶科5 小时前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
千码君20165 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
夜白宋6 小时前
【word多文档docx合并】
java·word
@yanyu6666 小时前
idea中配置tomcat
java·mysql·tomcat
2501_916766546 小时前
【项目部署】JavaWeb、MavenJavaWeb项目部署至 Tomcat 的实现方式
java·tomcat
RoboWizard6 小时前
扩容刚需 金士顿新款Canvas Plus存储卡
java·spring·缓存·电脑·金士顿