【发布时间】:2020-12-10 21:22:10
【问题描述】:
我正在使用 Crypto-js 使用密钥加密密码并将其发送到服务器。我想使用 PHP 在服务器中解密它。如何做到这一点?
JS:
let encKey = "Secret Passphrase";
let text = "123";
let iv = CryptoJS.enc.Hex.parse("FgLFXEr1MZl2mEnk");
var encryptedText = CryptoJS.AES.encrypt(text, encKey, { iv: iv }).toString();
加密文本:
U2FsdGVkX1+EaW3J1GE1k/EU5h6C+nxBH364Xhez+b0=
PHP:
<?php
$strg = "U2FsdGVkX1+EaW3J1GE1k/EU5h6C+nxBH364Xhez+b0=";
$encryptedstrings = base64_decode($strg);
$encryptionMethod = 'aes-256-cbc';
$key = "Secret Passphrase";
$iv = "FgLFXEr1MZl2mEnk";
$rawText = openssl_decrypt($encryptedstrings, $encryptionMethod, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING , $iv);
var_dump($rawText);
结果:
string(32) "����>���s����V?E��M���I"
我在这里得到了奇怪的结果。
【问题讨论】:
-
你没有通过
$ivin. -
我传入了 $iv,仍然得到错误的数据。 (编辑问题)
-
目前您在 CryptoJS 代码中不使用 key,而是使用 password。要使用 32 字节密钥(对于 AES-256),您必须传递
WordArray,例如CryptoJS.enc.Utf8.parse("01234567890123456789012345678901")。关于 IV,使用了错误的解析器。 Utf8 编码器可以使用 16 字节的 IV,例如CryptoJS.enc.Utf8.parse("FgLFXEr1MZl2mEnk")。在 PHP 代码中必须使用 PKCS7 填充,即必须删除OPENSSL_ZERO_PADDING标志。 -
@Topaco 当我删除
OPENSSL_ZERO_PADDING标志时,它返回 false。可以举个例子吗? -
您不仅必须更改标志,还必须修复其他错误,如我的评论中所述。如果您想使用问题中所述的密钥,则必须将密钥作为
WordArray传递。如果要使用密码,则必须将其作为字符串传递。不过我不推荐后者,因为应用了不安全的密钥派生函数。
标签: javascript php encryption openssl cryptojs