Flutter AES-CFB加密与Go后端不匹配问题及代码修正咨询
问题1:如何在Flutter中实现AES加密?
- 最便捷的方式是使用第三方库
encrypt,步骤如下:- 在项目的
pubspec.yaml中添加依赖:dependencies: encrypt: ^5.0.1 - 基础实现示例(以通用的CFB-128模式为例):
import 'package:encrypt/encrypt.dart'; // 加密函数 String aesEncrypt(String plainText, String key, String iv) { final keyObj = Key.fromUtf8(key); final ivObj = IV.fromUtf8(iv); final encrypter = Encrypter(AES(keyObj, mode: AESMode.cfb128)); final encrypted = encrypter.encrypt(plainText, iv: ivObj); return encrypted.base16; // 可根据需求换成base64编码 } // 解密函数 String aesDecrypt(String encryptedText, String key, String iv) { final keyObj = Key.fromUtf8(key); final ivObj = IV.fromUtf8(iv); final encrypter = Encrypter(AES(keyObj, mode: AESMode.cfb128)); return encrypter.decrypt16(encryptedText, iv: ivObj); } - 注意事项:
- 加密模式(如CBC、CFB)、密钥长度(128/192/256位)需和对接端完全一致
- CBC模式需要配置补码方式(如PKCS7),CFB/CTR模式无需补码
- IV(初始化向量)必须是16字节(AES块大小),且不能重复使用
- 在项目的
问题2:Flutter与Go后端AES加密结果不匹配的解决方案
对比你提供的Go后端代码和Flutter代码,核心问题出在CFB模式的段大小差异:
- Go标准库的
cipher.NewCFBEncrypter默认使用CFB-128(段大小等于AES块大小,16字节/128位) - 你的Flutter代码用了
AESMode.cfb64(段大小8字节/64位),这直接导致两端加密逻辑不兼容
只需修改Flutter代码中的加密模式,就能解决匹配问题:
修改后的Flutter代码:
static String encrypt(String data) { final iv = IV.fromUtf8(Env.iv); // 将AESMode.cfb64改为AESMode.cfb128 final encrypter = Encrypter(AES(Key.fromUtf8(Env.secretKey), mode: AESMode.cfb128)); return encrypter.encrypt(data, iv: iv).base16; } static String decrypt(String data) { final iv = IV.fromUtf8(Env.iv); // 同样修改加密模式为cfb128 final encrypter = Encrypter(AES(Key.fromUtf8(Env.secretKey), mode: AESMode.cfb128)); return encrypter.decrypt16(data, iv: iv); }
额外验证点:
- 确认
Env.secretKey和Env.iv的字符串与Go端的config.CipherConfig.Key、config.CipherConfig.Iv完全一致,无空格、换行或编码差异 - Go端加密后直接返回密文的hex编码,Flutter中用
base16和decrypt16对应,这部分逻辑是正确的
内容的提问来源于stack exchange,提问作者Parama Artha
相关产品推荐
相关产品推荐

