在Java中,可以使用 SecretKey
进行对称加密和解密。下面是一个使用 AES(高级加密标准)进行加密和解密的示例。该示例展示了如何生成一个 SecretKey
,以及如何使用该密钥进行数据的加解密。
使用AES进行对称加密和解密的Java示例
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AesEncryptionExample {
public static void main(String[] args) throws Exception {
// 生成 SecretKey
SecretKey secretKey = generateSecretKey();
// 待加密的文本
String originalText = "Hello, World!";
// 加密
String encryptedText = encrypt(originalText, secretKey);
System.out.println("Encrypted Text: " + encryptedText);
// 解密
String decryptedText = decrypt(encryptedText, secretKey);
System.out.println("Decrypted Text: " + decryptedText);
}
public static SecretKey generateSecretKey() throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128); // 可以选择 128, 192 或 256 位长的 AES 密钥
return keyGen.generateKey();
}
public static String encrypt(String plainText, SecretKey secretKey) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
// 将字节数组转换为 Base64 编码字符串以便于传输
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static String decrypt(String encryptedText, SecretKey secretKey) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
return new String(decryptedBytes);
}
}
代码解释
生成
SecretKey
:- 使用
KeyGenerator
类来创建一个 AES 类型的SecretKey
。 keyGen.init(128)
指定生成128位长的 AES 密钥。
- 使用
加密方法:
- 创建一个
Cipher
实例,并初始化为加密模式。 - 调用
doFinal()
方法,对明文进行加密,并返回字节数组。 - 使用 Base64 编码将字节数组转换成字符串,以便于存储或传输。
- 创建一个
解密方法:
- 创建另一个
Cipher
实例并初始化为解密模式。 - 解码 Base64 字符串,得到原始字节数组,然后调用
doFinal()
方法进行解密。
- 创建另一个
注意事项
- 确保你的 Java 环境支持适当长度的 AES 密钥。如果你希望使用 256 位长的 AES 密钥,请确保安装了无限制强度策略文件。
- 在实际应用中,建议不要直接硬编码秘钥,而是通过安全方式管理和存储秘钥,比如使用环境变量、专门的秘钥管理服务等。
- 不要重复使用同一秘钥处理大量数据,为每次会话或数据交换生成新的随机秘钥,并通过安全通道传递。
如果您有其他问题或需要进一步的信息,请告诉我!
内容由零声教学AI助手提供,问题来源于学员提问