Flutter AES加密数据在PHP端解密失败,求原因分析
解决Flutter(Dart Encrypt)与PHP OpenSSL AES解密失败问题
解密失败的核心原因是Dart端与PHP端的AES算法配置不匹配,具体问题点及修正方案如下:
问题分析
密钥长度与加密算法不匹配
你的Dart代码中,密钥是32字节的UTF-8字符串(32个A字符),对应标准的AES-256加密算法。但PHP代码中却指定了AES-192-CBC,算法与密钥长度不兼容,直接导致解密失败。加密模式与填充的一致性验证
Dart的encrypt包中,AES类默认使用CBC模式和PKCS7填充,这与PHP OpenSSL的默认行为(CBC模式、PKCS7填充)是一致的,所以这部分不需要额外调整。
修正后的PHP代码
// 加密后的字符串 $encrypted = "VBnTmnNX14Sbxqu99PMtWw=="; // 与Dart端完全一致的密钥和IV $key = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; $iv = "AAAAAAAAAAAAAAAA"; // 修正算法为AES-256-CBC,匹配32字节密钥 $decrypted = openssl_decrypt( base64_decode($encrypted), 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv ); var_dump($decrypted); // 输出:string(4) "test"
额外说明
如果后续需要调整加密模式或填充方式,需确保两端配置完全一致:
- 若Dart端指定了其他模式(如ECB),PHP端也要对应修改算法名称(如
AES-256-ECB) - 若修改了填充方式,需在PHP端通过
options参数调整(例如使用OPENSSL_ZERO_PADDING配合手动填充)
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

