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>
有关使用 TweetNaCl.js的公钥加密和对称加密,请参阅以下链接。这是关于对消息保密。