为了账号安全,请及时绑定邮箱和手机立即绑定

TweetNaCl.js 最小公钥签名示例

TweetNaCl.js 最小公钥签名示例

白板的微信 2023-07-20 16:42:09
密码学对我来说是非常新的东西,因此任何有关如何在 Node.js 中使用纯 JavaScript 创建公钥示例的基线示例将不胜感激!伪代码:const nacl = require('tweetnacl')let message = "This is my unencrypted message"let naclPair = nacl.sign.keyPair()let signedMessage = nacl.sign(message, naclPair.secretKey)let decrypted = nacl.sign.open(signedMessage, naclPair.publicKey) // is this right?console.log(decrypted) // should this print the decrypted message?附带说明一下,我对 node.jsrequire比对 ES6更熟悉import,如果这对这里的答案有任何影响并且可以帮助演示如何使用这个库。
查看完整描述

2 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

TweetNaCl.js是TweetNaCl的 JavaScript 端口。TweetNacl 又是NaCl的紧凑实现,它提供了基本上基于Curve25519的各种加密和签名算法。许多平台都有 NaCl 兼容的实现或包装器,因此这些文档中的任何一个都可以用于介绍,例如Libsodium fork 的清晰文档。

TweetNaCl.js 的文档还提供了功能的简短概述:nacl.sign(message, secretKey)创建一条由 64 字节签名和附加消息组成的签名消息。nacl.sign.open(signedMessage, publicKey)使用签名验证消息,如果验证成功则返回消息。用于签名的算法是Ed25519。

正如评论中已经指出的,您没有明确区分加密(目的:保密)和签名(目的:身份验证/完整性)。特别是,消息的保密性不是签名的目的。例如,当返回nacl.sign()包含未加密的消息时,这一点变得很明显(请参见下面的代码片段)。然而,确实在签名过程中使用私钥进行了加密(但不是为了保密)。

以下实现是纯 JavaScript 实现:

var keyPair = nacl.sign.keyPair();

var secretKey  = keyPair.secretKey;

var publicKey = keyPair.publicKey;

var msgStr = "The quick brown fox jumps over the lazy dog";

var msg = nacl.util.decodeUTF8(msgStr);

var signature = nacl.sign(msg, secretKey);

var signatureB64 = nacl.util.encodeBase64(signature);

console.log(signatureB64.replace(/(.{64})/g,'$1\n')); // Display signature plus message (Base64 encoded)

var signatureMsgPart = signature.slice(64); 

console.log(nacl.util.encodeUTF8(signatureMsgPart));  // Display message from nacl.sign() return value: signing is not for encryption!

var verifiedMsg = nacl.sign.open(signature, publicKey);

console.log(nacl.util.encodeUTF8(verifiedMsg));       // Display message after successfull verification

<script src="https://cdn.jsdelivr.net/npm/tweetnacl-util@0.15.0/nacl-util.min.js"></script>

<script src="https://cdn.jsdelivr.net/npm/tweetnacl@1.0.1/nacl.min.js"></script>

并应用软件包tweetnacl-util-js进行编码。

顺便说一句,在您发布的实现中,仅缺少 Utf8 编码/解码:

let message = "This is my unencrypted message"

let naclPair = nacl.sign.keyPair()

let signedMessage = nacl.sign(nacl.util.decodeUTF8(message), naclPair.secretKey)

let decrypted = nacl.sign.open(signedMessage, naclPair.publicKey) // is this right? -> Yes

console.log(nacl.util.encodeUTF8(decrypted)) // should this print the decrypted message? -> Yes, but the 'verified' message is printed!

<script src="https://cdn.jsdelivr.net/npm/tweetnacl-util@0.15.0/nacl-util.min.js"></script>

<script src="https://cdn.jsdelivr.net/npm/tweetnacl@1.0.1/nacl.min.js"></script>



查看完整回答
反对 回复 2023-07-20
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

顺便说一句,使用示例页面(公钥签名)来测试代码需要使用nacl.sign.detached(message, secretKey)not nacl.sign(msg, secretKey)😂

查看完整回答
反对 回复 2023-07-20
  • 2 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信