JS Crypto JS зашифровано -> PHP OpenSSL расшифровано: длина шифра изменяется - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть проблема, которую я не могу понять. Я запрограммировал некоторый код для шифрования данных в JS с помощью Crypto JS и для расшифровки этих данных в PHP с помощью OpenSSL. Иногда это работает, но большую часть времени он ломается

Код:

    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 или посмотреть, отличается ли что-то еще, но, как указано выше, только шифр не имеет смысла все время.

...