Анонимное шифрование: seal box

Анонимное шифрование в модели Sealed Box опирается на асимметричную криптографию и конструкцию, при которой отправитель не обязан иметь собственную пару ключей. Сообщение шифруется только на стороне получателя, используя его публичный ключ, а расшифровка возможна исключительно приватным ключом получателя.

В экосистеме NaCl (Networking and Cryptography library) и её JavaScript-реализациях это поведение реализуется через расширение sealed box, чаще всего доступное через tweetnacl-sealedbox-js, так как базовый tweetnacl предоставляет только низкоуровневый box с явным участием обеих сторон.


Классическая схема nacl.box работает через:

  • публичный ключ получателя
  • приватный ключ получателя
  • публичный ключ отправителя
  • случайный nonce

Каждое сообщение требует явного управления nonce и идентификации отправителя.

В sealed box модель упрощена до одностороннего шифрования:

  • используется только публичный ключ получателя
  • отправитель не идентифицируется криптографически
  • nonce генерируется автоматически внутри алгоритма
  • сообщение становится «запечатанным контейнером»

Суть анонимного шифрования (Sealed Box)

Sealed box реализует гибридную схему:

  1. Генерируется временная (эпhemeral) пара ключей отправителя
  2. Выполняется согласование ключей по X25519 (ECDH)
  3. Получается общий секрет
  4. Сообщение шифруется симметричным алгоритмом XSalsa20
  5. Добавляется аутентификация Poly1305
  6. Эфемерный публичный ключ помещается в начало сообщения

В результате:

  • получатель может расшифровать сообщение
  • отправитель не оставляет криптографической идентичности
  • каждая операция шифрования уникальна

Отличие sealed box от nacl.box

nacl.box

  • требует ключевой пары отправителя
  • требует nonce
  • поддерживает двустороннюю аутентификацию
  • сообщение связано с идентичностью отправителя

Sealed box

  • использует только публичный ключ получателя
  • не требует nonce от пользователя
  • отправитель анонимный
  • каждый пакет содержит встроенные служебные данные

Формат sealed box сообщения

Внутренне структура обычно выглядит так:

[ephemeral public key][ciphertext + auth tag]

Эфемерный ключ используется только один раз и позволяет восстановить общий секрет на стороне получателя.


Библиотека в JavaScript

Базовый tweetnacl не включает sealed box, поэтому используется расширение:

npm install tweetnacl tweetnacl-util tweetnacl-sealedbox-js

Генерация ключей получателя

import nacl from "tweetnacl";
import * as util from "tweetnacl-util";

const keyPair = nacl.box.keyPair();

const publicKey = keyPair.publicKey;
const secretKey = keyPair.secretKey;

Ключи представлены в виде Uint8Array.


Шифрование сообщения (sealed box)

import * as sealedBox from "tweetnacl-sealedbox-js";
import * as util from "tweetnacl-util";

const message = "Секретное сообщение";
const messageBytes = util.decodeUTF8(message);

const encrypted = sealedBox.seal(messageBytes, publicKey);

На выходе получается бинарный массив (Uint8Array), содержащий:

  • ephemeral public key
  • зашифрованный payload
  • MAC

Декодирование результата

Для хранения или передачи данные обычно кодируются в Base64:

const encoded = util.encodeBase64(encrypted);

Расшифрование sealed box

const encryptedBytes = util.decodeBase64(encoded);

const decrypted = sealedBox.open(
  encryptedBytes,
  publicKey,
  secretKey
);

const originalMessage = util.encodeUTF8(decrypted);

Важная особенность модели

В sealed box отсутствует понятие отправителя на криптографическом уровне. Это означает:

  • невозможно доказать, кто именно зашифровал сообщение
  • нет привязки к ключу отправителя
  • обеспечивается однонаправленная конфиденциальность

Криптографические примитивы внутри

Sealed box использует компоненты NaCl:

  • X25519 (ECDH) — обмен ключами
  • XSalsa20 — потоковое шифрование
  • Poly1305 — проверка целостности

Эта комбинация обеспечивает:

  • конфиденциальность
  • целостность
  • защиту от подмены данных

Производительность

Поскольку каждый вызов включает:

  • генерацию ephemeral ключа
  • ECDH операцию
  • симметричное шифрование

sealed box медленнее, чем прямой nacl.secretbox, но быстрее и проще, чем управляемая схема nacl.box с ручным nonce management.


Типичные ошибки при использовании

Потеря бинарного формата

Попытка шифровать строки напрямую приводит к повреждению данных. Всегда требуется:

  • UTF-8 → Uint8Array
  • Uint8Array → UTF-8 после расшифровки

Повторное использование зашифрованных данных

Sealed box не предполагает повторного шифрования одного и того же payload без изменения состояния.


Хранение ключей в строковом виде

Публичные и приватные ключи должны храниться как:

  • Uint8Array
  • или Base64 с обязательной декодировкой перед использованием

Сценарии применения sealed box

Модель применяется там, где:

  • требуется отправка данных без установления сессии
  • отсутствует необходимость в идентификации отправителя
  • важна простота архитектуры

Типичные случаи:

  • одноразовые токены
  • зашифрованные уведомления
  • передача секретов через публичные каналы
  • bootstrap данных между сервисами

Ограничения модели

Несмотря на удобство, sealed box не предназначен для:

  • двустороннего канала связи
  • потокового шифрования
  • подтверждения личности отправителя

Также отсутствует управление ключевыми сессиями, что делает модель stateless по своей природе.


Внутреннее устройство генерации эфемерного ключа

Каждое шифрование включает:

  1. генерацию случайной пары ключей
  2. вычисление shared secret через ECDH
  3. derivation ключа симметричного шифрования
  4. шифрование payload

Эта одноразовость обеспечивает криптографическую изоляцию каждого сообщения.


Совместимость с NaCl экосистемой

Sealed box сохраняет совместимость с:

  • libsodium crypto_box_seal
  • NaCl box (через адаптеры)
  • различными языковыми реализациями X25519 + XSalsa20-Poly1305

Работа с большими данными

Sealed box не предназначен для больших потоков данных. При необходимости:

  • данные разбиваются на чанки
  • каждый чанк шифруется отдельно
  • либо используется гибридная схема с симметричным ключом

Особенности безопасности

Криптографическая стойкость базируется на:

  • 256-битной безопасности Curve25519
  • устойчивости XSalsa20 к известным атакам
  • MAC Poly1305 для защиты целостности

Компрометация возможна только при утечке приватного ключа получателя.