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

Java使用AES/CBC/NOPADDING解密返回乱码,求排查问题

AES CBC解密乱码问题修复

核心问题:解密时Cipher模式错误

你的getCipher方法硬编码使用了Cipher.ENCRYPT_MODE初始化加密器,但解密操作必须使用DECRYPT_MODE。用加密模式去处理解密逻辑,必然会输出乱码。

修复步骤

  1. 修改getCipher方法,支持指定加密/解密模式
    新增参数传入模式,同时移除吞异常的操作(吞异常会掩盖问题,甚至引发空指针):

    private static Cipher getCipher(String keyString, byte[] iv, int mode) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/NOPADDING");
        cipher.init(mode, new SecretKeySpec(keyString.getBytes(StandardCharsets.UTF_8), "AES"), new IvParameterSpec(iv));
        return cipher;
    }
    
  2. 更新加密和解密的调用逻辑

    • 加密方法中调用时传入加密模式:
      Cipher cipher = getCipher(keyString, iv, Cipher.ENCRYPT_MODE);
      
    • 解密方法中调用时传入解密模式:
      Cipher cipher = getCipher(keyString, iv, Cipher.DECRYPT_MODE);
      
  3. 处理手动填充的空格(可选)
    加密时你用空格填充到16字节倍数,解密后可以调用trim()去除末尾冗余空格,还原原始明文:

    return new String(plainTextBytes, StandardCharsets.UTF_8).trim();
    

修复后的完整解密方法示例

public static String decrypt(String cipherText, String keyString) throws Exception {
    String[] cipherTextAndIv = cipherText.split(":");
    byte[] cipherTextBytes = Base64.getDecoder().decode(cipherTextAndIv[0]);
    byte[] iv = Base64.getDecoder().decode(cipherTextAndIv[1]);
    
    Cipher cipher = getCipher(keyString, iv, Cipher.DECRYPT_MODE);
    byte[] plainTextBytes = cipher.doFinal(cipherTextBytes);
    
    return new String(plainTextBytes, StandardCharsets.UTF_8).trim();
}

测试验证

用你提供的示例数据测试:

  • 密钥:12345678901234567890123456789012
  • 加密结果:tEGeM6ls3Z2J1ov8qb5Anw==:Mn3UKr4CwrBLJmT9tih9Pw==
    解密后应正确返回Hello World。

内容的提问来源于stack exchange,提问作者Konstanius EU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:16:04