Java实现文件加密:从基础到实践

引言

在当今数字化时代,文件安全至关重要。Java作为企业级应用的主流语言,提供了强大的加密支持。本文将带你深入探索如何使用Java实现文件加密,从基础原理到完整代码,助你掌握数据保护的核心技能。

加密基础

加密分为对称加密和非对称加密。对称加密使用同一个密钥进行加密和解密,速度快,适合大文件;非对称加密使用公钥/私钥对,安全性高但速度慢,常用于密钥交换。Java通过JCA(Java Cryptography Architecture)提供标准加密接口。

环境准备

确保JDK 1.8以上,无需额外库,Java内置了完善的加密API。主要涉及javax.crypto包。

对称加密:AES文件加密

AES(Advanced Encryption Standard)是目前最流行的对称加密算法。下面演示如何使用AES对文件进行加密和解密。

生成密钥

KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256); // 128, 192, 256
SecretKey secretKey = keyGen.generateKey();

加密文件

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
IvParameterSpec iv = new IvParameterSpec(cipher.getIV());

FileInputStream inputStream = new FileInputStream("plain.txt");
FileOutputStream outputStream = new FileOutputStream("encrypted.aes");
// 写入IV
outputStream.write(iv.getIV());
CipherOutputStream cipherOutputStream = new CipherOutputStream(outputStream, cipher);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
    cipherOutputStream.write(buffer, 0, bytesRead);
}
cipherOutputStream.close();
inputStream.close();

解密文件

cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
FileInputStream encryptedStream = new FileInputStream("encrypted.aes");
byte[] ivBytes = new byte[16];
encryptedStream.read(ivBytes);
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
CipherInputStream cipherInputStream = new CipherInputStream(encryptedStream, cipher);
FileOutputStream decryptedStream = new FileOutputStream("decrypted.txt");
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = cipherInputStream.read(buffer)) != -1) {
    decryptedStream.write(buffer, 0, bytesRead);
}
cipherInputStream.close();
decryptedStream.close();

非对称加密:RSA文件加密

RSA适合加密小数据,如密钥。通常用RSA加密AES密钥,再用AES加密文件。这里演示直接加密小文件。

生成密钥对

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
keyPairGen.initialize(2048);
KeyPair keyPair = keyPairGen.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();

加密文件(小文件)

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] fileBytes = Files.readAllBytes(Paths.get("small.txt"));
byte[] encryptedBytes = cipher.doFinal(fileBytes);
Files.write(Paths.get("encrypted.rsa"), encryptedBytes);

性能与安全性建议

  • 大文件应使用对称加密,非对称加密仅用于密钥保护。
  • 使用安全的随机数生成器。
  • 妥善保管密钥,可存储于密钥库或硬件安全模块。
  • 考虑添加完整性校验,如HMAC。

总结

Java为文件加密提供了简洁而强大的工具。通过AES和RSA的组合,可以构建高效的加密方案。希望本文能帮助你轻松上手文件加密,守护数据安全。