Совместимость libsodium PHP против Javascript

У меня есть код PHP, который использует шифрование RSA через библиотеку libsodium (odium_compat).

Мой скрипт, как показано ниже:

//https://packagist.org/packages/paragonie/sodium_compat
//composer require paragonie/sodium_compat
require_once "/path/to/sodium_compat/autoload.php";
$privateKey = "HJu4JU0biDAewq0asdfgtDKXlQZZzmVy2chL0x74yhgr";
$publicKey = "874dmkuhiDAewq0asdfgtDKXlQZZzmVy2chL0x74yhgr";
$message = "HJu4JU0biDAewq0hgbvfcdsXlQZZzmVy2chL0x74yhgr";
$encryption_keypair = \Sodium\crypto_box_keypair_from_secretkey_and_publickey(base64_decode($privateKey), base64_decode($publicKey));
try {
$decodedMessage = \Sodium\crypto_box_seal_open(base64_decode($message), $encryption_keypair);
echo $decodedMessage;
} catch (Exception $e) {
echo $e->getMessage();
}

Сценарий выше показывает, как я расшифровываю зашифрованное сообщение из уже сгенерированной пары ключей.

Я хотел бы сделать то же самое дешифрование с теми же ключами на стороне Javascript, чтобы избежать перегрузки сервера, я нашел эту библиотеку, которая должна быть такой же libsodium

Документ показывает, как расшифровать, как показано ниже:

let key = sodium.from_hex('724b092810ec86d7e35c9d067702b31ef90bc43a7b598626749914d6a3e033ed');

function encrypt_and_prepend_nonce(message) {
let nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES);
return nonce.concat(sodium.crypto_secretbox_easy(message, nonce, key));
}

function decrypt_after_extracting_nonce(nonce_and_ciphertext) {
if (nonce_and_ciphertext.length < sodium.crypto_secretbox_NONCEBYTES + sodium.crypto_secretbox_MACBYTES) {
throw "Short message";
}
let nonce = nonce_and_ciphertext.slice(0, sodium.crypto_secretbox_NONCEBYTES),
ciphertext = nonce_and_ciphertext.slice(sodium.crypto_secretbox_NONCEBYTES);
return sodium.crypto_secretbox_open_easy(ciphertext, nonce, key);
}

Я не понимаю, как я могу сделать дешифрование совместимым в PHP и Js, они ссылаются на одноразовый номер для создания с ключом в Js, но в PHP эта же библиотека не обеспечивает этого. Любая помощь, пожалуйста?

Спасибо

2

Решение

Эта ссылка на функцию libsodium может помочь.

Вам нужно использовать одну и ту же группу функций с обеих сторон провода.

  • secretbox -> secretbox_open
  • box -> box_open
  • box_seal -> box_seal_open

За box_sealУбедитесь, что вы используете открытый ключ в JavaScript и правильный секретный ключ в PHP.

Если вы хотите использовать шифрование с общим ключом (т. Е. Один и тот же ключ в обоих местах), используйте secretbox,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]