用Java编写一个RSA和AES混合加解密系统,要求还能实现图片加解密
时间: 2024-02-27 22:57:53 浏览: 153
RSA与AES的加解密(Java)
RSA 和 AES 是非常常见的加密算法。RSA 算法可以用于进行公钥加密和数字签名,AES 算法可以用于进行对称加密。下面是一个使用 Java 实现 RSA 和 AES 混合加解密系统的示例代码,同时支持图片加解密:
```java
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Base64;
public class RSAAndAES {
// 随机生成 AES 密钥
public static byte[] generateAESKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 128 位密钥长度
SecretKey secretKey = keyGenerator.generateKey();
return secretKey.getEncoded();
}
// 随机生成 RSA 密钥对
public static KeyPair generateRSAKeyPair() throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024); // 1024 位密钥长度
return keyPairGenerator.generateKeyPair();
}
// 使用 RSA 公钥加密数据
public static byte[] encryptWithRSAPublicKey(byte[] data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
// 使用 RSA 私钥解密数据
public static byte[] decryptWithRSAPrivateKey(byte[] data, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
// 使用 AES 密钥加密数据
public static byte[] encryptWithAES(byte[] data, byte[] key, byte[] iv) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
return cipher.doFinal(data);
}
// 使用 AES 密钥解密数据
public static byte[] decryptWithAES(byte[] data, byte[] key, byte[] iv) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
return cipher.doFinal(data);
}
// 将字节数组转换为 Base64 编码的字符串
public static String encodeBase64(byte[] data) {
return Base64.getEncoder().encodeToString(data);
}
// 将 Base64 编码的字符串转换为字节数组
public static byte[] decodeBase64(String str) {
return Base64.getDecoder().decode(str);
}
// 读取文件内容到字节数组
public static byte[] readFile(String filename) throws Exception {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filename));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bis.close();
bos.close();
return bos.toByteArray();
}
// 将字节数组写入文件
public static void writeFile(byte[] data, String filename) throws Exception {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filename));
bos.write(data);
bos.close();
}
public static void main(String[] args) throws Exception {
// 随机生成 AES 密钥和向量
byte[] aesKey = generateAESKey();
byte[] iv = generateAESKey();
// 随机生成 RSA 密钥对
KeyPair keyPair = generateRSAKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// 加密图片文件
byte[] imageBytes = readFile("image.png");
byte[] encryptedImageBytes = encryptWithAES(imageBytes, aesKey, iv);
byte[] encryptedImageKeyBytes = encryptWithRSAPublicKey(aesKey, publicKey);
String encryptedImage = encodeBase64(encryptedImageBytes);
String encryptedImageKey = encodeBase64(encryptedImageKeyBytes);
writeFile(encryptedImage.getBytes(StandardCharsets.UTF_8), "encryptedImage.txt");
writeFile(encryptedImageKey.getBytes(StandardCharsets.UTF_8), "encryptedImageKey.txt");
// 解密图片文件
byte[] encryptedImageBytes2 = decodeBase64(new String(readFile("encryptedImage.txt"), StandardCharsets.UTF_8));
byte[] encryptedImageKeyBytes2 = decodeBase64(new String(readFile("encryptedImageKey.txt"), StandardCharsets.UTF_8));
byte[] aesKey2 = decryptWithRSAPrivateKey(encryptedImageKeyBytes2, privateKey);
byte[] decryptedImageBytes = decryptWithAES(encryptedImageBytes2, aesKey2, iv);
writeFile(decryptedImageBytes, "decryptedImage.png");
}
}
```
这个示例代码中,我们首先使用 `KeyGenerator` 生成 AES 密钥和向量,使用 `KeyPairGenerator` 生成 RSA 密钥对。然后,我们使用 `Cipher` 对象进行加解密操作。需要注意的是,AES 加解密时需要使用密钥和向量,而 RSA 加解密时只需要使用公钥或私钥。最后,我们使用 `Base64` 对字节数组进行编码和解码,以便于将加密后的数据存储到文件中。
在实际应用中,需要注意使用的算法和密钥长度,以及密钥的管理和保护。此外,在对图片等二进制文件进行加解密时,需要注意编码和解码的方式,以免出现数据损坏或丢失的问题。
阅读全文