微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

TweetNaCl.js最小公钥签名示例

如何解决TweetNaCl.js最小公钥签名示例

我正在尝试了解如何使用纯JavaScript来实现基于here上的演示的最小基本公共密钥签名示例。

我的研究还没有产生一个简单的javascript示例,我可以用它来了解它的内部工作原理,而documentation目前在我头上。

我尝试查看了该演示的source code,但没有透露其秘密。

图书馆的examples对此也没有示例。

密码学对我来说是一个很新的东西,因此,任何关于如何使用纯JavaScript在node.js中创建其公钥示例的基线示例都将不胜感激!

代码

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?

请注意,与ES6 require相比,我对node.js import更为熟悉,如果这与此处的答案有关,并且可以帮助您演示如何使用此功能。库。

解决方法

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

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

正如注释中已指出的那样,您不能清楚地区分加密(目的:保密)和signing(目的:认证/完整性)。特别是,消息的保密性不是签名的目的。例如,这变得明显。当from io import BytesIO from django.core.files import File from PIL import Image def make_thumbnail(image,size=(600,600)): im = Image.open(image) im.convert('RGB') im.thumbnail(size) thumb_io = BytesIO() im.save(thumb_io,'JPEG',quality=85) thumbnail = File(thumb_io,name=image.name) return thumbnail 的返回包含未加密的消息时(请参见下面的代码段)。但是,确实在签名过程中使用了私钥加密(但不是出于保密目的)。

以下实现是纯JavaScript实现:

nacl.sign()
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

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

顺便说一句,在实现中,您仅张贴了Utf8编码/解码:

<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>
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!

请使用TweetNaCl.js查看public key encryptionsymmetric encryption的以下链接。这是关于保密消息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。