Java 大文件加解密

本文将介绍如何使用 Java 编程语言对大文件进行加解密操作。加解密是信息安全领域中非常重要的技术,在许多应用场景中都有广泛的应用,比如保护用户的隐私数据或者保护敏感的商业数据等。

加解密算法简介

在进行大文件加解密之前,我们需要了解一些常用的加解密算法。常见的对称加密算法包括 DES、3DES、AES 等,而非对称加密算法则有 RSA、ECC 等。对称加密算法使用相同的密钥进行加解密,而非对称加密算法则使用一对密钥,分别是公钥和私钥。

在实际应用中,对称加密算法常用于加解密大文件,因为它的加解密速度快。非对称加密算法则常用于加解密对称加密算法所使用的密钥。

Java 加解密库介绍

Java 提供了丰富的加解密库,其中包括了对对称加密算法和非对称加密算法的支持。在本文中,我们将使用 Java 提供的 Cipher 类来实现加解密操作。

为了加强安全性,我们将使用 AES 对称加密算法来加解密大文件。AES 是一种高级加密标准,使用 128 位、192 位或 256 位的密钥进行加解密操作。

代码示例

下面是一个使用 Java 对大文件进行加解密的示例代码:

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.AlgorithmParameters;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.InvalidParameterSpecException;

public class FileEncryptionUtils {
    private static final int BUFFER_SIZE = 8192;

    public static void encryptFile(String inputFile, String outputFile, String password)
            throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidParameterSpecException, IOException {
        FileInputStream inputStream = new FileInputStream(inputFile);
        FileOutputStream outputStream = new FileOutputStream(outputFile);

        byte[] salt = generateSalt();

        SecretKey secretKey = generateSecretKey(password, salt);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);

        AlgorithmParameters parameters = cipher.getParameters();
        byte[] iv = parameters.getParameterSpec(IvParameterSpec.class).getIV();

        outputStream.write(salt);
        outputStream.write(iv);

        byte[] buffer = new byte[BUFFER_SIZE];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            byte[] encryptedBytes = cipher.update(buffer, 0, bytesRead);
            outputStream.write(encryptedBytes);
        }

        byte[] finalBytes = cipher.doFinal();
        outputStream.write(finalBytes);

        inputStream.close();
        outputStream.flush();
        outputStream.close();
    }

    public static void decryptFile(String inputFile, String outputFile, String password)
            throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidParameterSpecException, IOException {
        FileInputStream inputStream = new FileInputStream(inputFile);
        FileOutputStream outputStream = new FileOutputStream(outputFile);

        byte[] salt = new byte[16];
        inputStream.read(salt);

        byte[] iv = new byte[16];
        inputStream.read(iv);

        SecretKey secretKey = generateSecretKey(password, salt);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv));

        byte[] buffer = new byte[BUFFER_SIZE];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            byte[] decryptedBytes = cipher.update(buffer, 0, bytesRead);
            outputStream.write(decryptedBytes);
        }

        byte[] finalBytes = cipher.doFinal();
        outputStream.write(finalBytes);

        inputStream.close();
        outputStream.flush();
        outputStream.close();
    }

    private static byte[] generateSalt() throws NoSuchAlgorithmException {
        SecureRandom random = new SecureRandom();
        byte[] salt = new byte[16];
        random.nextBytes(salt);
        return salt;
    }

    private static SecretKey generateSecretKey(String password, byte[] salt)
            throws NoSuchAlgorithmException, InvalidKeySpecException {
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536