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

编写与CryptoJS AES加密函数等价的PHP代码:结果不一致求助

AES加密:CryptoJS与PHP等价实现修正

原始JavaScript加密代码

function aesEncrypt (data) {
   const key = 'GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r=';
   const iv = '\0';
   
   const cipher = CryptoJS.AES.encrypt(data, CryptoJS.enc.Base64.parse(key), {
       iv: CryptoJS.enc.Utf8.parse(iv), // parse the IV 
       padding: CryptoJS.pad.Pkcs7,
       mode: CryptoJS.mode.CBC
   })
   
   return cipher.toString()
}

输入plainText时,运行结果:pHjpwiyKq7Rf4dFcBMbm1w==

问题PHP代码(结果不一致)

$plaintext  = "plainText";
$method     = 'aes-256-cbc';

$key = base64_encode("GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r=");
$iv  = hex2bin('00000000000000000000000000000000');
        
$ciphertext = openssl_encrypt(
                               $plaintext,
                               $method,
                               $key,
                               OPENSSL_RAW_DATA,
                               $iv
                            );

$ciphertext = base64_encode($ciphertext);

echo $ciphertext; 

运行结果:+YJOMi2vISmEXIjUZls3MA==

问题分析

  • 密钥处理逻辑颠倒:JavaScript中CryptoJS.enc.Base64.parse(key)是将Base64格式的密钥字符串解码为原始二进制字节流,而你的PHP代码错误地使用base64_encode对密钥进行编码,完全搞反了处理方向,应该改为base64_decode。
  • IV处理是正确的:JavaScript中单个\0字符会被CryptoJS自动补全为符合AES-CBC要求的16字节0x00序列,和PHP中hex2bin('00'重复16次)的结果一致。

正确的PHP等价实现

$plaintext = "plainText";
$method = 'aes-256-cbc';

// 正确处理密钥:对给定的Base64密钥字符串进行解码
$key = base64_decode("GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r=");
// IV为16字节的0x00,与JS中补全后的IV一致
$iv = hex2bin('00000000000000000000000000000000');

$ciphertext = openssl_encrypt(
    $plaintext,
    $method,
    $key,
    OPENSSL_RAW_DATA,
    $iv
);

$ciphertext = base64_encode($ciphertext);

echo $ciphertext; // 输出:pHjpwiyKq7Rf4dFcBMbm1w==

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:45:46