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

