在Java中,有多种方法可以对文件进行加密和解密。以下是一些常用的方法:
Java Cryptography Extension (JCE) 提供了强大的加密和解密功能。你可以使用它来实现对称加密(如AES)和非对称加密(如RSA)。
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.security.NoSuchAlgorithmException;
public class FileEncryption {
public static void encryptFile(String key, String inputFile, String outputFile) throws Exception {
doCrypto(Cipher.ENCRYPT_MODE, key, inputFile, outputFile);
}
public static void decryptFile(String key, String inputFile, String outputFile) throws Exception {
doCrypto(Cipher.DECRYPT_MODE, key, inputFile, outputFile);
}
private static void doCrypto(int cipherMode, String key, String inputFile, String outputFile) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(cipherMode, secretKey);
FileInputStream inputStream = new FileInputStream(inputFile);
byte[] inputBytes = new byte[(int) new File(inputFile).length()];
inputStream.read(inputBytes);
byte[] outputBytes = cipher.doFinal(inputBytes);
FileOutputStream outputStream = new FileOutputStream(outputFile);
outputStream.write(outputBytes);
inputStream.close();
outputStream.close();
}
public static void main(String[] args) {
try {
String key = "ThisIsASecretKey"; // 16 bytes key for AES
String inputFile = "input.txt";
String encryptedFile = "encrypted.txt";
String decryptedFile = "decrypted.txt";
encryptFile(key, inputFile, encryptedFile);
decryptFile(key, encryptedFile, decryptedFile);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
为了增强安全性,可以使用Java Secure Random生成随机密钥。
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;
public class SecureRandomKeyGenerator {
public static SecretKey generateKey(int n) throws NoSuchAlgorithmException {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(n);
SecretKey secretKey = keyGenerator.generateKey();
return secretKey;
}
public static void main(String[] args) {
try {
SecretKey secretKey = generateKey(128);
System.out.println("Generated Key: " + secretKey.getEncoded());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
还有一些第三方库可以简化文件加密和解密的过程,例如:
首先,添加Bouncy Castle依赖到你的项目中(例如,使用Maven):
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>
然后,使用Bouncy Castle进行加密和解密:
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.security.Security;
public class BouncyCastleEncryption {
static {
Security.addProvider(new BouncyCastleProvider());
}
public static void encryptFile(String key, String inputFile, String outputFile) throws Exception {
doCrypto(Cipher.ENCRYPT_MODE, key, inputFile, outputFile);
}
public static void decryptFile(String key, String inputFile, String outputFile) throws Exception {
doCrypto(Cipher.DECRYPT_MODE, key, inputFile, outputFile);
}
private static void doCrypto(int cipherMode, String key, String inputFile, String outputFile) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "BC");
cipher.init(cipherMode, secretKey);
FileInputStream inputStream = new FileInputStream(inputFile);
byte[] inputBytes = new byte[(int) new File(inputFile).length()];
inputStream.read(inputBytes);
byte[] outputBytes = cipher.doFinal(inputBytes);
FileOutputStream outputStream = new FileOutputStream(outputFile);
outputStream.write(outputBytes);
inputStream.close();
outputStream.close();
}
public static void main(String[] args) {
try {
String key = "ThisIsASecretKey"; // 16 bytes key for AES
String inputFile = "input.txt";
String encryptedFile = "encrypted.txt";
String decryptedFile = "decrypted.txt";
encryptFile(key, inputFile, encryptedFile);
decryptFile(key, encryptedFile, decryptedFile);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
这些方法可以帮助你在Java中实现文件的加密和解密。选择哪种方法取决于你的具体需求和安全要求。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。