对接 Java/.NET 端 AES-ECB 加密数据,PHP mcrypt_decrypt 解密后出现乱码或多余字符,核心原因在于填充模式不一致。本文给出生产级解密函数,自动处理 PKCS#7 填充移除,兼容跨语言对接。
$block) {
return false; // 填充异常
}
for ($i = 1; $i <= $pad; $i++) {
if (ord($str[$len - $i]) !== $pad) {
return false; // 填充字节不一致
}
}
return substr($str, 0, $len - $pad);
}
// 测试
$key = '1234567890123456';
$content = 'T7UT2NQ1AFvR9unjA0wKWA=='; // 对应明文 "abcd"
echo decryptString($content, $key); // 输出: abcd
?>
openssl_decrypt():openssl_decrypt($data, 'AES-128-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING) 并自行处理 PKCS#7。| 项 | Java (BouncyCastle/JCE) | .NET (AesManaged) | PHP (openssl) |
|---|---|---|---|
| 模式 | AES/ECB/PKCS5Padding | Aes.Mode = ECB; Padding = PKCS7 | AES-128-ECB + 手动 PKCS7 |
| 密钥 | SecretKeySpec(keyBytes, "AES") | aes.Key = keyBytes | $key (16 字节) |
| Base64 | Base64.getEncoder() | Convert.ToBase64String() | base64_encode/decode |
规范填充处理、统一编码、弃用 ECB,是跨语言加密互操作的三大铁律。