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

PHP与JavaScript中AES加密结果不一致问题求助

解决PHP与JavaScript AES加密结果不一致的问题

你的代码存在三个关键问题,直接导致加密结果不匹配:

  • 密钥大小写不匹配:JavaScript里把密钥转成了大写(randomSeed.toUpperCase()),但PHP直接使用小写的"thisismykey",两边密钥完全不一致。
  • IV值完全不同:JavaScript用的是16个字符"0"组成的字符串作为IV,而PHP用的是16个ASCII值为0的空字节,这是加密结果差异的核心原因。
  • 变量拼写错误:PHP最后一行的$encyrption是笔误,应为$encryption,虽不影响当前输出,但属于语法错误。

修正后的PHP代码如下:

$payload = "this is my plaintext";
$binary_signature = "";
$private_key = openssl_pkey_get_private(file_get_contents(storage_path('privatekey.pem')), 'enc123456789');
openssl_sign($payload, $binary_signature, $private_key, OPENSSL_ALGO_SHA256);
$signature = base64_encode($binary_signature);
$new_payload = $payload."&sign=".$signature;

// 密钥转大写,和JS保持一致
$key = strtoupper("thisismykey");
// 使用和JS相同的IV:16个字符"0"
$iv = "0000000000000000";
// 执行加密,OPENSSL_RAW_DATA输出原始二进制,和CryptoJS底层输出一致
$encryption = openssl_encrypt($new_payload, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
// 修正变量拼写错误
dd(base64_encode($encryption));

额外验证点:

  1. 确保$new_payload在PHP和JS中完全一致,可以通过输出两者的字符串内容和长度来确认。
  2. AES-256要求密钥长度为32字节,你的原始密钥只有11字节,CryptoJS会自动补0到32字节,PHP的openssl_encrypt也会做相同的补全处理,这部分无需额外修改。

内容的提问来源于stack exchange,提问作者Vaulient

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:10:27