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

Golang与Flutter的AES加解密跨端兼容实现问题

Flutter端与Golang AES-CFB加解密兼容实现方案

问题点梳理

你的Flutter代码和Golang实现存在三个核心差异,导致加解密不兼容:

  • IV处理逻辑不一致:Golang每次加密都会生成随机IV,将IV和密文拼接后一起做Base64编码;但你的Flutter代码使用固定IV,且未将IV与密文拼接。
  • Base64编码标准不匹配:Golang使用URL安全的Base64(base64.URLEncoding),而Flutter encrypt 包默认使用标准Base64。
  • CFB模式段大小不匹配:Golang的cipher.NewCFBEncrypter默认使用128位(AES块大小)的CFB模式,你Flutter代码里指定的是AESMode.cfb64,两者段大小不同。

正确的Flutter实现代码

以下是与Golang代码完全兼容的Flutter实现:

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

// 替换为你的密钥:若Golang密钥是Base64解码而来,用Key.fromBase64;若为原始字符串转字节,用Key.fromUtf8
const String ENCRYPTION_KEY = "你的密钥内容";

String encryption(String plainText) {
  // 生成16字节随机IV,与Golang AES块大小一致
  final iv = IV.fromSecureRandom(16);
  final key = Key.fromBase64(ENCRYPTION_KEY);
  // 使用CFB128模式,与Golang默认实现对齐
  final encrypter = Encrypter(AES(key, mode: AESMode.cfb128));
  
  final encrypted = encrypter.encrypt(plainText, iv: iv);
  // 拼接IV与密文,再做URL安全Base64编码
  final combinedBytes = iv.bytes + encrypted.bytes;
  return base64UrlEncode(combinedBytes);
}

String decryption(String cryptoText) {
  final key = Key.fromBase64(ENCRYPTION_KEY);
  // 解码URL安全Base64
  final combinedBytes = base64UrlDecode(cryptoText);
  
  // 分离IV(前16字节)与密文(剩余部分)
  final ivBytes = combinedBytes.sublist(0, 16);
  final cipherBytes = combinedBytes.sublist(16);
  
  final iv = IV(ivBytes);
  final encrypter = Encrypter(AES(key, mode: AESMode.cfb128));
  
  return encrypter.decrypt(Encrypted(cipherBytes), iv: iv);
}

额外注意事项

  • 密钥处理需与Golang完全对齐:如果Golang的密钥是从Base64解码得到的字节数组,Flutter就用Key.fromBase64;如果Golang直接用字符串转字节(如key := []byte("your-key")),Flutter就用Key.fromUtf8("your-key")。
  • 确保密钥长度一致:AES支持16、24、32字节的密钥(对应AES-128、AES-192、AES-256),两端必须使用相同长度的密钥。

内容的提问来源于stack exchange,提问作者Priadarshan Mega

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:30:58