openssl_decrypt PHP 到 CryptoJS
openssl_decrypt PHP to CryptoJS
在 PHP 中,我使用 openssl_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 中只有十进制值。
这里 encryptData
和 PHP 上的 key
和 JS 具有完全相同的值。但是 cryptoJS return 与 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 return 与 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 上重新加载时结果都会改变。
CryptoJS 使用 WordArray
类型并提供 encoders 进行转换,例如Hex
编码器。
在PHP代码中,应用了aes128
,它是aes-128-cbc
的别名,需要一个IV。如果指定 none,则 PHP 隐式使用零向量,必须在 CryptoJS 代码中明确指定。 CBC 模式本身不需要明确指定,因为它是 default.
此外,PHP 代码禁用填充,这必须在 CryptoJS 代码中明确指定,因为 PKCS7 填充是 default。请注意,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,它不是秘密的,并与密文(通常是串联的)一起传递给接收者,接收者在解密之前将两者分开。
在 PHP 中,我使用 openssl_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 中只有十进制值。
这里 encryptData
和 PHP 上的 key
和 JS 具有完全相同的值。但是 cryptoJS return 与 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 return 与 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 上重新加载时结果都会改变。
CryptoJS 使用 WordArray
类型并提供 encoders 进行转换,例如Hex
编码器。
在PHP代码中,应用了aes128
,它是aes-128-cbc
的别名,需要一个IV。如果指定 none,则 PHP 隐式使用零向量,必须在 CryptoJS 代码中明确指定。 CBC 模式本身不需要明确指定,因为它是 default.
此外,PHP 代码禁用填充,这必须在 CryptoJS 代码中明确指定,因为 PKCS7 填充是 default。请注意,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,它不是秘密的,并与密文(通常是串联的)一起传递给接收者,接收者在解密之前将两者分开。