如何在Dart encrypt包中实现AES-256-CBC与PHP加密结果一致?
解决PHP与Dart AES加密结果不一致的问题
一、修改Dart代码匹配PHP的AES-256-CBC加密结果
PHP的openssl_encrypt在指定AES-256-CBC模式时,若传入的密钥长度不足32字节(256位),会自动用NULL字节(\x00)补全到32字节。而Dart的encrypt包会严格校验密钥长度,16位密钥只会触发AES-128模式,这是两端结果不同的核心原因。
要让Dart端和PHP的AES-256-CBC结果一致,只需手动将密钥补全到32字节:
import 'package:encrypt/encrypt.dart' as encrypt; void main() { // 原始16位密钥,手动补全NULL字节至32位 final rawKey = '1234567890123456'; final paddedKey = rawKey + '\x00' * 16; // 补充16个NULL字节 final encryptKey = encrypt.Key.fromUtf8(paddedKey); final encryptIvKey = encrypt.IV.fromUtf8('1234567890123456'); final encrypter = encrypt.Encrypter(encrypt.AES(encryptKey, mode: encrypt.AESMode.cbc)); // 执行后输出结果将与PHP的adVh7c/vcyascTS0Z669IA==一致 print(encrypter.encrypt('data', iv: encryptIvKey).base64); }
二、若必须修改PHP代码,推荐的加密方式
如果不得不调整PHP端的加密逻辑,优先选择AES-128-CBC:
- 你的当前密钥正好是16字节(128位),完全匹配AES-128的密钥要求,无需额外补全,更符合密码学规范
- 已验证该模式下Dart与PHP加密结果完全一致,无需修改现有Dart代码
- 若追求更高安全性,可改用AES-256-CBC,但必须确保密钥为32字节长度(可通过PBKDF2等密钥派生函数生成),同时Dart端使用相同的32字节密钥,即可保证两端结果一致。
内容的提问来源于stack exchange,提问作者Sittiphan Sittisak
相关产品推荐
相关产品推荐

