В библиотеке TweetNaCl.js реализованы два основных высокоуровневых подхода к шифрованию данных:
Оба метода опираются на алгоритмы семейства NaCl и используют единый принцип формирования зашифрованного сообщения: данные преобразуются в бинарный буфер с обязательным наличием nonce и аутентификационного кода (MAC).
Любое зашифрованное сообщение в TweetNaCl.js состоит из следующих элементов:
Nonce не является секретом, но критически важен для безопасности.
Результат применения алгоритма XSalsa20
Включает в себя:
Важно: MAC не хранится отдельно — он встроен в конец ciphertext.
При использовании nacl.secretbox структура результата
выглядит логически так:
[ ciphertext || MAC ]
Nonce передаётся отдельно, но при сериализации часто объединяется:
[ nonce (24 байта) || ciphertext+MAC ]
Фактический результат функции:
nacl.secretbox(message, nonce, key)
возвращает:
Uint8Array(ciphertext + 16 байт MAC)
Nonce не включается автоматически.
На практике разработчики почти всегда формируют единый пакет:
[ nonce ][ ciphertext ]
Где:
При использовании:
nacl.box(message, nonce, publicKey, secretKey)
структура результата аналогична secretbox, но ключи отличаются:
Дополнительно внутри криптографии происходит:
В отличие от secretbox:
ключ не общий симметричный
используется пара ключей:
Но формат результата остаётся тем же:
ciphertext включает MAC, nonce хранится отдельно
В реальных приложениях бинарные данные редко передаются напрямую. Используются обёртки.
{
nonce: Uint8Array(24),
ciphertext: Uint8Array(n)
}
Используется внутри приложений или WebCrypto-подобных систем.
Чаще всего применяется для JSON/API:
{
"nonce": "base64...",
"box": "base64..."
}
Преобразование:
Иногда используется компактный формат:
[ nonce || ciphertext ]
Длина итогового сообщения:
24 + ciphertext.length
Ciphertext в TweetNaCl.js всегда включает:
[ encrypted_message || 16-byte MAC ]
Таким образом:
nonce (24 bytes)
+
ciphertext (message + 16 bytes MAC)
nonce (24 bytes)
+
ciphertext (message + 16 bytes MAC)
Без nonce расшифрование невозможно.
Даже частичное чтение невозможно из-за XSalsa20.
Отдельного поля проверки целостности нет.
TweetNaCl.js не навязывает формат хранения — он только возвращает бинарные данные.
Чаще всего используется следующая схема хранения:
{
version: 1,
algorithm: "xsalsa20-poly1305",
nonce: base64,
data: base64(ciphertext)
}
Причины:
Критическая ошибка, приводящая к утечке ключа при XOR-аналитике.
Отделение последних 16 байт ломает проверку целостности.
TweetNaCl.js строго ожидает 24 байта — любое отклонение приводит к ошибке шифрования или дешифрования.
Зашифрованное сообщение в TweetNaCl.js можно представить как фиксированную структуру:
nonce (24 bytes)
+
ciphertext (encrypted data)
└── message + MAC (16 bytes)
или в сериализованном виде:
[ nonce || ciphertext ]