繁体   English   中英

TweetNaCl.js 最小公钥签名示例

[英]TweetNaCl.js minimal Public-key signatures example

我试图了解如何基于位于此处的演示,使用纯 javascript 实现一个最小的基本公钥签名示例。

我的研究还没有产生一个简单的 javascript 示例,我可以用它来理解它的内部工作原理,目前我无法理解文档

我试图查看演示的源代码,但它并没有透露它的秘密。

图书馆的例子也没有这方面的例子。

密码学对我来说是非常新的东西,所以任何关于如何在 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.js require比对 ES6 import更熟悉,如果这对这里的答案有任何影响并且可以帮助演示如何使用这个库。

TweetNaCl.jsTweetNaCl 的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>

请参阅以下链接,了解使用 TweetNaCl.js 进行的公钥加密对称加密 这是关于对消息保密。

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


参考

TweetNaCl.js 公钥签名示例错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM