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