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

Flutter(Dart)中AES-GCM模式解密问题求助

Dart AES-GCM模式解密实现方案

依赖准备

首先在pubspec.yaml中添加加密库依赖:

dependencies:
  encrypt: ^5.0.1

完整解密代码

import 'package:encrypt/encrypt.dart';
import 'dart:convert';

void main() {
  // Java生成的十六进制密文
  const String cipherTextHex = "c6b80cf9e86e2ec219b4fef448aa73e6eed8e6e6e93211832dee5d45bb6043d6e9193ef084686e482700c86673c5616b10d583b39e0450513de415ce9ce7a32b90a9dcaa9e0b382593a5718d330373344a969013865ad690a6fda81ee47d28746f8bfb9acce9fd8f80d1efa0edd5703693571fafdffe466105488be2c8e78c942eeb3a8b0e81612b5575e2cac3aef4ab0435227483f69c505ad90094a9a50b601ef42663bd09900c20e7ebe8d1a98a29291d81f024304a387194979fbaa940d9d85325ee37c8b2fb70d248cdeeceb552aa157201f374527e4fedfc490c055b256b81a83e877abbf5e8f59972007e9bbd64bfec35343635c681d5916dbbf16e34fadaf1fe6690f06a759b31aac7b64505ac34bf19dfe0b9e21398f0bd9d3d47dbd6773520a71389184c10aaec99aa81dc0a8872d525f94d48160dcae7d74a59f7589ce3cc5205529b7000b23af3b1391abca458f49a96f2dae2148de3ed04c01a0af77e5e4f09f76b4e279e51524d94ff132ad5d2e4a87afe301b3899b9fb3540e1c281a724828f6d643cd597ea0f0952c55702d512a93e162045b738fb1916c85b5cfb4a13c4c20426187fb1f34339d1";
  // Base64编码的IV
  const String ivBase64 = "myLfN7pToARn4t33RyZwAw==";
  // Base64编码的共享密钥
  const String keyBase64 = "DGq1tmmtiXXlCtBAFpFuGZbdWolHcna7kbRJTbTIw4Y=";

  // 解码密钥
  final key = Key.fromBase64(keyBase64);
  // 解码IV
  final iv = IV.fromBase64(ivBase64);

  // 十六进制密文转字节数组,拆分密文和认证标签(GCM默认16字节标签)
  final cipherBytes = hex.decode(cipherTextHex);
  final plainTextBytes = cipherBytes.sublist(0, cipherBytes.length - 16);
  final tag = Tag(cipherBytes.sublist(cipherBytes.length - 16));

  // 初始化AES-GCM解密器
  final encrypter = Encrypter(AES(key, mode: AESMode.gcm));

  // 执行解密
  final decryptedBytes = encrypter.decryptBytes(
    Encrypted(plainTextBytes),
    iv: iv,
    tag: tag,
    // 若Java加密时使用了关联数据(AD),此处需传入相同数据,否则传null
    associatedData: null,
  );

  // 转成UTF-8字符串输出
  print(utf8.decode(decryptedBytes));
}

关键注意事项

  • 标签长度对齐:Java中AES-GCM默认生成16字节(128位)的认证标签,若Java端修改过标签长度,需对应调整代码中拆分标签的字节数
  • 关联数据匹配:如果Java加密时传入了关联数据(Associated Data),解密时必须传入完全相同的AD,否则会验证失败
  • IV一致性:确保解密使用的IV和加密时完全一致,此处IV由Java端生成并通过Base64传递,需确认解码后的IV长度符合GCM要求(推荐12字节,若不符需检查Java端逻辑)
  • 密钥长度:当前密钥Base64解码后为32字节,对应AES-256,符合安全要求

内容的提问来源于stack exchange,提问作者Ezhilarasan S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:15:31