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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:20:27