Javascript openssl_将PHP解密为CryptoJS

Javascript openssl_将PHP解密为CryptoJS,javascript,php,openssl,cryptography,cryptojs,Javascript,Php,Openssl,Cryptography,Cryptojs,在PHP中,我使用openssl_decrypt($encryptData,'AES128',$key,openssl_ZERO_PADDING | openssl_RAW_DATA)并且我需要在JS上使用与相同选项完全相同的东西,所以我使用CryptoJS与此函数CryptoJS.AES.decrypt(encryptData,key,{PADDING:CryptoJS.PADDING.zeroppadding})。toString()。 使用PHP,我的解码消息以C7开头,其他六位字符。但在

在PHP中,我使用
openssl_decrypt($encryptData,'AES128',$key,openssl_ZERO_PADDING | openssl_RAW_DATA)
并且我需要在JS上使用与相同选项完全相同的东西,所以我使用CryptoJS与此函数
CryptoJS.AES.decrypt(encryptData,key,{PADDING:CryptoJS.PADDING.zeroppadding})。toString()
。 使用PHP,我的解码消息以
C7
开头,其他六位字符。但在JS中只有十进制值

PHP和JS上的
encryptData
key
具有完全相同的值。但是cryptoJS返回与PHP不同的东西。 我不知道有什么问题。我试图用UTF8或Base64更改我的值的基数。但什么都不管用

如何将此函数转换为加密并使其工作? 谢谢大家!

PHP示例:

$encryptData = hex2bin("D5F630E93F36C21293012D78E5A384F1");
$key = hex2bin("A254FE00A791AA74386E8DEF3712B256");

var_dump(bin2hex(openssl_decrypt($encryptData,'AES128', $key, OPENSSL_ZERO_PADDING|OPENSSL_RAW_DATA)));
//result : c704469332aa61804601008a92dc10e5
JS示例:(当然,hex2bin返回的输出与PHP中相同)


每次我在JS上重新加载时,结果都会发生变化。

CryptoJS使用
WordArray
类型并提供转换,例如
Hex
编码器

在PHP代码中,应用了aes128,这是aes-128-cbc的别名,需要一个IV。如果未指定,PHP隐式使用零向量,必须在CryptoJS代码中显式指定。CBC模式本身不需要显式指定,因为它是

此外,PHP代码禁用填充,这必须在CryptoJS代码中明确指定,因为PKCS7填充是最重要的。请注意,
OPENSSL\u ZERO\u PADDING
不启用零填充,但禁用填充,即CryptoJS对应的是
NoPadding

您的CryptoJS代码必须进行如下更改,才能在功能上与PHP代码等效:

let encData=CryptoJS.enc.Hex.parse(“D5F630E93F36C21293012D78E5A384F1”);
let key=CryptoJS.enc.Hex.parse(“A254FE00A791A74386E8DEF3712B256”);
设iv=CryptoJS.enc.Hex.parse(“00000000000000000000”);
让data=CryptoJS.AES.decrypt(
{密文:encData},
钥匙
{iv:iv,padding:CryptoJS.pad.NoPadding}
).toString(CryptoJS.enc.Hex);
console.log(数据);//c704469332aa61804601008a92dc10e5

给出一个完整的数据集(明文、密钥和密文)和两个最小的示例来重现这些示例怎么样?太棒了!你救了我一天。我认为PHP的默认模式是CBC而不是ECB。@Develogg-你说得对
aes128
aes-128-CBC
的别名。我很困惑,因为缺少IV。但是PHP隐式地应用了零向量。这将为第一个块提供与ECB模式相同的结果,因此解密在这里也可以工作(因为只有一个块)。我已相应地修改了我的答案。
let encData = hex2bin("D5F630E93F36C21293012D78E5A384F1");
let key = hex2bin("A254FE00A791AA74386E8DEF3712B256");
let data = bin2hex(cryptoJS.AES.decrypt(encData, key, {padding: cryptoJS.pad.ZeroPadding}).toString());
console.log(data);
//result : 326638346632336661323135353832343236376139343564