首页 > 解决方案 > openssl_decrypt PHP 到 CryptoJS

问题描述

在我使用的 PHPopenssl_decrypt($encryptData,'AES128',$key, OPENSSL_ZERO_PADDING|OPENSSL_RAW_DATA)中,我需要在 JS 上使用相同选项的完全相同的东西,所以我将 CryptoJS 与这个函数一起使用cryptoJS.AES.decrypt(encryptData, key, {padding: cryptoJS.pad.ZeroPadding}).toString()。使用 PHP,我的解码消息C7以其他十六进制字符开头。但在 JS 中只有十进制值。

这里encryptDatakey上 PHP 和 JS 具有完全相同的值。但是 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 相同的输出)

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 

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

标签: javascriptphpopensslcryptographycryptojs

解决方案


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

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

此外,PHP 代码禁用了填充,这必须在 CryptoJS 代码中明确指定,因为 PKCS7 填充是默认的。请注意,OPENSSL_ZERO_PADDING不启用零填充,但禁用填充,即 CryptoJS 对应项是NoPadding.

您的 CryptoJS 代码必须进行如下更改,以在功能上等同于 PHP 代码:

let encData = CryptoJS.enc.Hex.parse("D5F630E93F36C21293012D78E5A384F1");
let key = CryptoJS.enc.Hex.parse("A254FE00A791AA74386E8DEF3712B256");
let iv = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");
let data = CryptoJS.AES.decrypt(
    {ciphertext: encData}, 
    key, 
    {iv: iv, padding: CryptoJS.pad.NoPadding}
).toString(CryptoJS.enc.Hex);
console.log(data); // c704469332aa61804601008a92dc10e5
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>

另请注意,静态 IV 是不安全的。通常,每次加密都会生成一个随机 IV,它不是秘密的,并与密文(通常是连接的)一起传递给接收者,接收者在解密之前将两者分开。


推荐阅读