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

Java转Flutter:AES加密代码转换异常问题排查

问题分析与修正方案

你的问题核心在于Java和Dart代码中使用的初始化向量(IV)不一致,另外还有一些细节需要对齐,下面一步步说明:

关键差异点与修复步骤

1. 初始化向量(IV)必须和Java代码完全匹配

在原Java代码里,IV直接复用了密钥的字节数组:

IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);

但你的Dart代码用了IV.fromLength(16),这会生成一个全0的IV,这正是加密结果开头部分异常、解密失败的根本原因。你需要在Dart中生成和Java完全相同的IV——也就是用'SOME16CHARSTRING'的UTF-8字节数组作为IV。

2. 填充方式的语义对齐(可选但推荐)

Java中使用的是PKCS5Padding,你当前Dart代码写的是PKCS7。虽然对于AES(块大小16字节)来说,这两种填充逻辑实际效果一致,但为了和原代码语义完全对齐,建议明确指定为PKCS5。

修正后的Dart代码

import 'package:encrypt/encrypt.dart';

String encryptAES(String plainTextString) {
  try {
    // 密钥:和Java一致,使用'SOME16CHARSTRING'的UTF-8字节
    final key = Key.fromUtf8('SOME16CHARSTRING');
    // IV:和Java逻辑一致,复用密钥对应的字节数组
    final iv = IV.fromUtf8('SOME16CHARSTRING');
    // 对齐加密模式与填充方式:CBC模式 + PKCS5填充
    final encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: 'PKCS5'));
    // 执行加密并返回Base64结果(和Java的NO_WRAP一致,Dart默认无换行)
    final encrypted = encrypter.encrypt(plainTextString, iv: iv);
    return encrypted.base64;
  } catch (e) {
    print("Error while encoding String : $e");
    return null;
  }
}

额外验证建议

  • 可以用同一明文分别在Java和Dart中加密,对比Base64结果是否一致,一致则说明加密逻辑已对齐。
  • 解密时也要确保Dart代码使用相同的IV和密钥,才能正确还原原始数据。

内容的提问来源于stack exchange,提问作者Ashutosh Vyas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:08:12