JS CryptoJS加密-> PHP OpenSSL解密:密码更改长度

问题描述 投票:0回答:1

我有一个我无法理解的问题。我编写了一些代码,使用CryptoJS加密JS中的数据,并使用OpenSSL解密PHP中的数据。有时它可以正常工作,但大多数情况下会中断

CODE:

    PHP          JS
$passphrase == passkey

JS:

let data = CryptoJS.AES.encrypt(data, passkey).toString();
send(data);

PHP:

list($cipher, $salt) = decode($_POST["data"]);
list($passkey, $iv) = evpkdf($passphrase, $salt);

$data = openssl_decrypt($cipher, "AES-256-CBC", $passkey, OPENSSL_RAW_DATA, $iv);
echo $data

function evpkdf($passphrase, $salt) {
    $salted = "";
    $dx = "";
    while(strlen($salted) < 48) {
        $dx = md5($dx . $passphrase . $salt, true);
        $salted .= $dx;
    }
    $passkey = substr($salted, 0, 32);
    $iv = substr($salted, 32, 16);

    return [$passkey, $iv];
}

function decode($data) {
    $data = base64_decode($data);

    if (substr($data, 0, 8) !== "Salted__") {
        // throw new \InvalidArgumentException();
        echo "no salt\n";
    }

    $salt = substr($data, 8, 8);
    $cipher = substr($data, 16);

    return [$cipher, $salt];
}

结果:

   PHP    JS
    iv == iv
  salt == salt
cipher ?? cipher
?? = sometimes

我唯一注意到的是,密码长度并不总是一样,而且只有密码具有正确的长度才能起作用。我看不到什么可能是我的错误。我已经尝试了很多,但我真的不知道该怎么办。我试图更改JS中的密码或查看是否有其他区别,但是如上所述,只有密码始终没有意义。

javascript php encryption openssl cryptojs
1个回答
0
投票

您使用哪种通行密钥来加密数据?

CryptoJS支持AES-128,AES-192和AES-256。它将根据您传入的密钥的大小来选择变体。如果您使用密码短语,它将生成一个256位密钥。

https://cryptojs.gitbook.io/docs/

© www.soinside.com 2019 - 2024. All rights reserved.