编写与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
相关产品推荐
相关产品推荐

