簡體   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