RSA
和AES
是两种常用的加密算法,分别用于非对称加密
和对称加密
。RSA使用一对公钥和私钥,而AES使用单一的密钥。在实际应用中,我们通常会使用RSA来加密AES的密钥,然后将该密钥用于AES加密数据,这种方法称为混合加密
。
RSA非对称加密解密
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class RSA {
public static void main(String[] args) {
try {
// 生成密钥对
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair pair = kpg.generateKeyPair();
// 公钥和私钥
PublicKey publicKey = pair.getPublic();
PrivateKey privateKey = pair.getPrivate();
// 待加密的明文
String plainText = "Hello";
byte[] encryptedText = encrypt(publicKey, plainText);
String decryptedText = decrypt(privateKey, encryptedText);
// 打印结果
System.out.println("原文: " + plainText);
System.out.println("解密后: " + decryptedText);
} catch (Exception e) {
e.printStackTrace();
}
}
// 使用公钥加密
public static byte[] encrypt(PublicKey publicKey, String plainText) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(plainText.getBytes());
}
// 使用私钥解密
public static String decrypt(PrivateKey privateKey, byte[] encryptedText) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return new String(cipher.doFinal(encryptedText));
}
}
AES对称加密解密,动态选择AES的加解密模式(ECB, CBC, PCBC, CTR, CTS)
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;
public class AES {
public static void main(String[] args) {
try {
// 生成AES密钥
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
SecretKey secretKey = keyGenerator.generateKey();
// 待加密的明文
String plainText = "Hello";
// 动态选择加密模式
String mode = "CBC"; // 可以是"ECB", "CBC", "PCBC", "CTR", "CTS"等
IvParameterSpec iv = new IvParameterSpec(new byte[16]); // 16字节的随机IV
// 加密
byte[] encryptedText = encrypt(secretKey, mode, iv, plainText);
// 解密
String decryptedText = decrypt(secretKey, mode, iv, encryptedText);
// 打印结果
System.out.println("原文: " + plainText);
System.out.println("解密后: " + decryptedText);
} catch (Exception e) {
e.printStackTrace();
}
}
// 使用密钥、模式和IV进行加密
public static byte[] encrypt(SecretKey secretKey, String mode, IvParameterSpec iv, String plainText) throws Exception {
Cipher cipher = Cipher.getInstance("AES/" + mode + "/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
return Base64.getEncoder().encode(cipher.doFinal(plainText.getBytes()));
}
// 使用密钥、模式和IV进行解密
public static String decrypt(SecretKey secretKey, String mode, IvParameterSpec iv, byte[] encryptedText) throws Exception {
Cipher cipher = Cipher.getInstance("AES/" + mode + "/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
return new String(cipher.doFinal(Base64.getDecoder().decode(encryptedText)));
}
}
KeyPairGenerator.getInstance("RSA")
和KeyGenerator.getInstance("AES")
:分别获取RSA和AES的密钥生成器实例。kpg.initialize(2048)
和keyGenerator.init(256)
:分别设置RSA和AES密钥的长度。cipher.init()
:初始化Cipher
对象,设置加密或解密模式,以及所需的密钥或密钥对和初始化向量IV(对于需要IV的模式)。"AES/" + mode + "/PKCS5Padding"
:动态地根据传入的模式参数设置AES的加密模式和填充方式。Base64.getEncoder().encode()
和Base64.getDecoder().decode()
:用于将加密后的字节数据编码为可打印的字符串形式,以及将编码后的字符串解码回字节数据,便于存储和传输。