Зашифровать с помощью crypto-js и расшифровать с помощью PHP натрия - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь зашифровать строку на стороне клиента с помощью машинописного текста, используя библиотеку crypto-js, а затем расшифровать ее на стороне сервера с помощью PHP и libsodium.Я шифрую вот так:

/// <reference types="crypto-js" />
import * as CryptoJS from 'crypto-js';

const key = CryptoJS.enc.Utf8.parse('length 32 hex string here');
const iv = CryptoJS.enc.Utf8.parse('length 32 hex string here');
const encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse("..."), key, {
    keySize: 32,
    iv: iv
});

const base64 = btoa(encrypted.ciphertext);

Многие примеры, которые я видел, вместо этого конвертируются в base 64 через encrypted.ciphertext.toString(CryptoJS.enc.Base64), но я получаю ошибки компилятора с этим, потому что toString не принимает параметр.

Затем я пытаюсь декодировать его в PHP следующим образом:

$key = pack("H*", "same length 32 hex string here");

$decoded = base64_decode("base 64 string here");

if (mb_strlen($decoded, '8bit') < (SODIUM_CRYPTO_SECRETBOX_NONCEBYTES + SODIUM_CRYPTO_SECRETBOX_MACBYTES)) {
    throw new Exception('truncated');
}

$nonce = mb_substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit');
$ciphertext = mb_substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit');

$plain = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);

if ($plain === false) {
    throw new Exception('the message was tampered with in transit');
}

sodium_memzero($ciphertext);
sodium_memzero($key);

Когда я запускаю его, я получаю это исключение, как только оно попадает в вызов sodium_crypto_secretbox_open:

Uncaught SodiumException: размер ключа должен быть SODIUM_CRYPTO_SECRETBOX_KEYBYTES

...