【问题标题】:libsodium compatibility PHP vs Javascriptlibsodium 兼容性 PHP vs Javascript
【发布时间】:2018-09-13 04:38:46
【问题描述】:

我有一个 PHP 代码,它通过 libsodium (sodium_compat) 库使用 RSA 加密。

我的脚本如下:

//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 中,同一个库不提供。有什么帮助吗?

谢谢

【问题讨论】:

  • 令人困惑的是,Sodium 包含名为“box”和“secretbox”的函数;我相信这些是不可互换的,而且我认为您正在用一个加密并用另一个解密。
  • 我花了很多天才让 Libsodium 完全正常工作(尤其是跨 JS 和 PHP)。这是我所做的:stackoverflow.com/a/51814273/470749

标签: javascript php encryption libsodium sodium


【解决方案1】:

This libsodium function reference might help.

您需要在电线的两侧使用相同的一组函数。

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

对于box_seal,请确保您在 JavaScript 中使用公钥,在 PHP 中使用正确的密钥。

如果您想要共享密钥加密(即两个地方的密钥相同),请使用secretbox。

【讨论】:

    猜你喜欢
    • 2016-06-22
    • 2012-07-12
    • 2019-08-27
    • 2011-03-22
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多