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

