sodium-plus.js
我想在 Web 浏览器中使用PHP 钠生成的密钥来实现匿名公钥加密,如下所示:
$keyPair = sodium_crypto_box_keypair();
$privateKey = sodium_crypto_box_secretkey($keyPair);
$publicKey = sodium_crypto_box_publickey($keyPair);
使用此方法生成的密钥在 PHP 中使用sodium_crypto_box_seal
andsodium_crypto_box_seal_open
方法可以正常工作,但是,我无法使其在前端工作。我的做法:
<script type='text/javascript' src='js/sodium-plus.min.js?v=0.4.2'></script>
<script>
async function getPublicKey() {
return X25519PublicKey.from(
'<?php echo sodium_bin2hex($publicKey); ?>', // 6a00b1550ccdeff3886a469b9cd4e5dc9aecd30f5deb3dd3e29fd01f8a32103f
'hex'
);
}
async function encryptString(clearText, publicKey) {
if (!window.sodium) window.sodium = await SodiumPlus.auto();
let cipherText = await sodium.crypto_box_seal(clearText, publicKey);
return cipherText.toString('hex');
}
(async function () {
let clearText = "String that contains secret.";
let publicKey = await getPublicKey();
console.log(await encryptString(clearText,publicKey));
})();
</script>
这将返回TypeError: Argument 2 must be an instance of X25519PublicKey in the console。
笔记:
sodium.crypto_box_keypair()
从前端派生的公钥有效。- 尝试使用
CryptographyKey.from()
而不是X25519PublicKey.from()
- 没有用。 - 该
getPublicKey()
函数返回一个对象 witbuffer: Uint8Array(32) [ … ]
,而从 派生的公钥sodium.crypto_box_keypair()
返回一个带有 的对象buffer: Uint8Array(32) [ … ], keyType: "x25519", publicKey: true
。
概念基于: