2 回答

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/[email protected]/nacl-util.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/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/[email protected]/nacl-util.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/nacl.min.js"></script>

TA貢獻1887條經驗 獲得超5個贊
順便說一句,使用示例頁面(公鑰簽名)來測試代碼需要使用nacl.sign.detached(message, secretKey)
not?nacl.sign(msg, secretKey)
??
添加回答
舉報