TweetNaCl.js - пример минимальной подписи с открытым ключом
Я пытаюсь понять, как реализовать минимальный базовый пример подписи с открытым ключом на основе демонстрации, расположенной здесь, с использованием чистого javascript.
Мое исследование не дало простого примера javascript, который я мог бы использовать, чтобы понять его внутреннюю работу, и документация на данный момент у меня над головой.
Я попытался посмотреть исходный код демонстрации, но он не раскрывает ее секретов.
В примерах библиотеки также нет примера для этого.
Криптография - это что-то очень новое для меня, поэтому я был бы очень признателен за любой базовый пример того, как создать свой пример открытого ключа с чистым 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?
Кстати, я больше знаком с node.js
require
, чем я с ES6
import
, если это имеет какое-либо отношение к ответам здесь и может помочь продемонстрировать, как использовать эту библиотеку.
2 ответа
TweetNaCl.js - это порт для JavaScript TweetNaCl. TweetNacl, в свою очередь, представляет собой компактную реализацию NaCl, которая предоставляет различные алгоритмы шифрования и подписи, в основном основанные на Curve25519. Существуют совместимые с NaCl реализации или оболочки для многих платформ, так что любую из этих документов можно использовать для введения, например, четкую документацию по вилке Libsodium.
В документации 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)
😂
ссылка