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));
额外验证点:
- 确保
$new_payload在PHP和JS中完全一致,可以通过输出两者的字符串内容和长度来确认。 - AES-256要求密钥长度为32字节,你的原始密钥只有11字节,CryptoJS会自动补0到32字节,PHP的
openssl_encrypt也会做相同的补全处理,这部分无需额外修改。
内容的提问来源于stack exchange,提问作者Vaulient
相关产品推荐
相关产品推荐

