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
相关产品推荐
相关产品推荐

