You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用手动生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:17:44