使用手动生成的AES密钥时无法打印加密数据的问题
问题分析与解决
为什么打印加密数据失败?
加密生成的encryptedData是二进制字节数组,里面包含大量不可打印的控制字符或非ASCII字符,直接用new String(encryptedData)转换后,终端遇到这些字符会出现输出截断、乱码或不显示的情况,并非真的没有生成加密数据。用generateSecretKey()能正常打印只是巧合——那次加密结果刚好没有触发终端输出异常的字符,但这种打印方式本身是错误的。
两个必须修复的问题
1. 正确打印加密数据
不管用哪种密钥生成方式,都应该用Base64或十六进制编码将二进制数据转换成可打印字符串,就像你代码最后一行已经实现的那样。修改打印语句:
// 替换原来的打印语句 Base64.Encoder encoder = Base64.getEncoder(); System.out.println("Encrypted data: " + encoder.encodeToString(encryptedData));
2. 修复手动密钥的生成逻辑
你的manualSecretKey()方法存在严重问题:密钥字符串是十六进制格式,但直接调用getBytes()是把每个字符转成ASCII字节(比如字符'7'转成0x37,'c'转成0x63),这和你预期的十六进制解码完全不符。正确做法是把十六进制字符串解码成字节数组:
public static SecretKey manualSecretKey() throws Exception { String keyString = "7c4a8d09ca3762af61e59520943dc264"; // 将十六进制字符串解码为字节数组 byte[] keyBytes = HexFormat.of().parseHex(keyString); // 注意:你的keyString是32个十六进制字符,解码后是16字节,对应AES-128 // 如果要使用AES-256,需要64个十六进制字符(32字节)的密钥字符串 return new SecretKeySpec(keyBytes, "AES"); }
注:Java 17+提供
HexFormat工具类,若用低版本Java,可以用DatatypeConverter.parseHexBinary(keyString)(需要引入javax.xml.bind.DatatypeConverter)或者自己实现十六进制解码逻辑。
修复后的完整代码示例
import java.security.KeyGenerator; import java.security.SecretKey; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; import java.util.HexFormat; public class EncryptionUtil { private static final String ALGORITHM = "AES"; public static byte[] encrypt(String data, SecretKey secretKey) throws Exception { Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, secretKey); return cipher.doFinal(data.getBytes()); } public static String decrypt(byte[] encryptedData, SecretKey secretKey) throws Exception { Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedBytes = cipher.doFinal(encryptedData); return new String(decryptedBytes); } public static SecretKey generateSecretKey() throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM); keyGenerator.init(256); return keyGenerator.generateKey(); } public static SecretKey manualSecretKey() throws Exception { String keyString = "7c4a8d09ca3762af61e59520943dc264"; byte[] keyBytes = HexFormat.of().parseHex(keyString); return new SecretKeySpec(keyBytes, "AES"); } public static void main(String[] args) throws Exception { SecretKey secretKey = manualSecretKey(); // 可切换为generateSecretKey() String originalData = "ABHISHEK"; byte[] encryptedData = encrypt(originalData, secretKey); // 用Base64编码后打印加密数据 Base64.Encoder encoder = Base64.getEncoder(); System.out.println("Encrypted data: " + encoder.encodeToString(encryptedData)); String decryptedData = decrypt(encryptedData, secretKey); System.out.println("Decrypted data: " + decryptedData); } }
内容的提问来源于stack exchange,提问作者Abhishek Nathe
相关产品推荐
相关产品推荐

