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

Flutter/Dart AES-256-CBC加密结果与PHP端不一致问题求解

问题排查与修复方案

核心原因

你的解密逻辑执行了两次Base64解码操作,而你编写的加密逻辑只做了一次Base64编码,两边编解码次数不匹配,导致最终输出的密文和PHP侧结果不一致:

  • 解密步骤:输入密文 → 第一次Base64解码得到加密结果的Base64字符串 → 第二次Base64解码得到AES密文二进制 → 解密得到明文
  • 原加密步骤:明文 → 加密得到AES密文二进制 → 第一次Base64编码 → 直接返回,缺少了和解密逻辑对应的第二次Base64编码步骤

修复方案

修改加密函数,将AES加密后得到的Base64字符串再做一次Base64编码,即可和PHP侧输出对齐。

修正后的加密代码

String enc(String payload) {
  String strPwd = "6P8yHVfeZ5JKaXQ6AyaBge";
  String strIv = 'cHaa5y7pQF5uqA2N';
  var iv = CryptoPack.sha256
      .convert(ConvertPack.utf8.encode(strIv))
      .toString()
      .substring(0, 16);
  var key = CryptoPack.sha256
      .convert(ConvertPack.utf8.encode(strPwd))
      .toString()
      .substring(0, 32);
  EncryptPack.IV ivObj = EncryptPack.IV.fromUtf8(iv);
  EncryptPack.Key keyObj = EncryptPack.Key.fromUtf8(key);

  final encrypter = EncryptPack.Encrypter(
      EncryptPack.AES(keyObj, mode: EncryptPack.AESMode.cbc));

  final encrypted = encrypter.encrypt(payload.toString(), iv: ivObj);
  // 新增:将第一次得到的Base64字符串做第二次Base64编码
  return ConvertPack.base64.encode(ConvertPack.utf8.encode(encrypted.base64));
}

验证结果

修正后加密Hello World得到的输出就是ZFNkckFEL2R5cW5ycTJpbWs0Ky9xQT09,和PHP侧生成的密文完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:45:11