Функция nacl.box.keyPair() в TweetNaCl.js / nacl.js
предназначена для генерации асимметрической пары ключей, используемой в
криптосистеме публичного шифрования Curve25519. Результатом её работы
является связка из двух значений: публичного ключа и приватного ключа,
которые далее применяются в операциях nacl.box для
шифрования и расшифрования сообщений.
Вызов функции имеет следующий вид:
const keyPair = nacl.box.keyPair();
Возвращаемый объект содержит два поля:
{
publicKey: Uint8Array(32),
secretKey: Uint8Array(32)
}
Обе части представляют собой массивы байт фиксированной длины 32 байта.
Публичный ключ предназначен для распространения. Он используется другими участниками системы для шифрования сообщений, адресованных владельцу приватного ключа.
Приватный ключ должен храниться в строгой тайне. Он используется для расшифрования сообщений, зашифрованных соответствующим публичным ключом.
nacl.box.keyPair() основана на криптографическом
примитиве Curve25519 (X25519), предназначенном для обмена ключами и
построения защищённых каналов связи.
Генерация ключевой пары включает:
В браузерной среде библиотека использует:
crypto.getRandomValues()
Это источник криптографически стойкой случайности, предоставляемый Web Crypto API.
В среде Node.js (в зависимости от сборки) используется:
crypto.randomBytes() илиКачество случайности критично: повторяемость или предсказуемость приводит к компрометации всей криптосистемы.
import nacl from "tweetnacl";
const keyPair = nacl.box.keyPair();
console.log(keyPair.publicKey);
console.log(keyPair.secretKey);
Каждое выполнение этого кода создаёт новую независимую пару ключей.
Сгенерированная пара напрямую используется в асимметричном шифровании:
const message = new TextEncoder().encode("секретное сообщение");
const nonce = nacl.randomBytes(24);
const encrypted = nacl.box(
message,
nonce,
recipientPublicKey,
senderSecretKey
);
Расшифрование:
const decrypted = nacl.box.open(
encrypted,
nonce,
senderPublicKey,
recipientSecretKey
);
Все ключи представлены в виде Uint8Array(32), что важно
учитывать:
При работе с API или хранении данные часто требуется преобразование.
Для хранения или передачи ключи обычно конвертируются.
function toHex(bytes) {
return Array.from(bytes)
.map(b => b.toString(16).padStart(2, "0"))
.join("");
}
function toBase64(bytes) {
return btoa(String.fromCharCode(...bytes));
}
Обратное преобразование требуется при восстановлении ключей.
Архитектура публичного шифрования строго разделяет роли:
Любая утечка secretKey полностью компрометирует
безопасность сообщений.
Каждый вызов nacl.box.keyPair():
Это означает отсутствие возможности восстановить ключ без
сохранённого secretKey.
В TweetNaCl существует альтернативная функция:
nacl.box.keyPair.fromSecretKey(secretKey)
Она позволяет восстановить публичный ключ из приватного:
const kp = nacl.box.keyPair();
const restored = nacl.box.keyPair.fromSecretKey(kp.secretKey);
restored.publicKey всегда совпадает с исходным.
При проектировании систем хранения необходимо учитывать:
Пример небезопасного подхода:
localStorage.setItem("secretKey", toBase64(keyPair.secretKey));
Такой способ делает ключ уязвимым для XSS-атак.
Шифрование требует именно приватного ключа отправителя и публичного ключа получателя:
nacl.box(message, nonce, recipientPublicKey, senderSecretKey);
Ошибочное переключение параметров приводит к невозможности расшифровки.
Nonce (одноразовый случайный параметр) должен быть уникальным для каждой операции:
nacl.randomBytes(24)Без приватного ключа восстановление данных невозможно. Алгоритм не предусматривает backdoor или recovery.
Это делает систему компактной и подходящей для клиентских приложений, WebSocket-соединений и мессенджеров.
Генерация ключевой пары:
Основная нагрузка возникает при массовом шифровании сообщений, а не при генерации ключей.
TweetNaCl.js является минималистичной JavaScript-портированной реализацией NaCl. В контексте ключевой пары:
Различия могут быть только в сборках и окружении исполнения.
nacl.box.keyPair() обычно используется:
Каждый участник коммуникации имеет собственную пару ключей, формируя основу асимметричной криптографии.
На уровне реализации:
Этот процесс гарантирует, что публичный ключ математически связан с приватным, но обратное вычисление невозможно.
Curve25519 используется благодаря:
nacl.box.keyPair() является базовым строительным блоком
для:
nacl.box (шифрование)nacl.box.open (дешифрование)nacl.box.before (предварительное вычисление shared
key)Без корректной генерации ключей невозможна работа всей схемы public-key encryption в библиотеке.