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) 😂


ссылка

TweetNaCl.js Пример подписи с открытым ключом err

Другие вопросы по тегам