Golang与Flutter的AES加解密跨端兼容实现问题
Flutter端与Golang AES-CFB加解密兼容实现方案
问题点梳理
你的Flutter代码和Golang实现存在三个核心差异,导致加解密不兼容:
- IV处理逻辑不一致:Golang每次加密都会生成随机IV,将IV和密文拼接后一起做Base64编码;但你的Flutter代码使用固定IV,且未将IV与密文拼接。
- Base64编码标准不匹配:Golang使用URL安全的Base64(
base64.URLEncoding),而Flutterencrypt包默认使用标准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
相关产品推荐
相关产品推荐

