NaCl crypto_secretbox - XSalsa20-Poly1305 Authenticated Encryption
Libsodium's crypto_secretbox is the same as NaCl's secretbox - authenticated encryption in one function.
Every coffee helps keep the servers running. Every book sale funds the next tool I'm dreaming up. You're not just supporting a site — you're helping me build what developers actually need.
The crypto_secretbox function (also known as secretbox in NaCl) encrypts and authenticates a message using a single secret key and a nonce. It combines XSalsa20 encryption with Poly1305 authentication in a single operation.
crypto_secretbox_KEYBYTEScrypto_secretbox_NONCEBYTESThis tool produces output compatible with:
nacl.secret.SecretBoxcrypto_secretbox_easy()nacl.secretbox()golang.org/x/crypto/nacl/secretboxThe nonce must be unique for each message encrypted with the same key. Never reuse a nonce - this would compromise security. The nonce doesn't need to be secret, only unique.
NaCl (pronounced "salt") is a high-speed, easy-to-use cryptography library created by Daniel J. Bernstein, the mathematician behind Curve25519 and ChaCha20. NaCl focuses on providing secure defaults and avoiding common cryptographic pitfalls.
Libsodium is a portable, cross-platform fork of NaCl with the same API but better packaging and additional algorithms. Most modern applications use libsodium.
| Function | Algorithm | Purpose |
|---|---|---|
crypto_secretbox |
XSalsa20-Poly1305 | Secret-key authenticated encryption |
crypto_box |
Curve25519 + XSalsa20-Poly1305 | Public-key authenticated encryption |
crypto_box_seal |
X25519 + XSalsa20-Poly1305 | Anonymous public-key encryption |
crypto_stream |
XSalsa20 | Stream cipher (no authentication) |
crypto_sign |
Ed25519 | Digital signatures |
crypto_hash |
SHA-512 | Cryptographic hashing |
crypto_auth |
HMAC-SHA-512-256 | Message authentication |
| Library | Language | Notes |
|---|---|---|
| NaCl | C | Original by D.J. Bernstein. Reference implementation. |
| Libsodium | C | Portable fork of NaCl. Most widely used. Adds AEAD, Argon2, etc. |
| TweetNaCl | C (100 tweets) | Minimal implementation in ~100 tweets. Auditable. |
| PyNaCl | Python | Python bindings to libsodium. |
| TweetNaCl.js | JavaScript | JavaScript port of TweetNaCl for browsers/Node.js. |
| Sodium (Go) | Go | golang.org/x/crypto/nacl |
secretbox when:box when:sealedbox when:stream (XSalsa20) when:# PyNaCl - Secret Box Encryption
from nacl.secret import SecretBox
from nacl.utils import random
key = random(SecretBox.KEY_SIZE) # 32 bytes
box = SecretBox(key)
# Encrypt
ciphertext = box.encrypt(b"Hello, World!")
# Decrypt
plaintext = box.decrypt(ciphertext)
// TweetNaCl.js - Secret Box Encryption
const nacl = require('tweetnacl');
const key = nacl.randomBytes(32);
const nonce = nacl.randomBytes(24);
const message = new TextEncoder().encode("Hello, World!");
// Encrypt
const ciphertext = nacl.secretbox(message, nonce, key);
// Decrypt
const plaintext = nacl.secretbox.open(ciphertext, nonce, key);
// Go - Secret Box Encryption
import "golang.org/x/crypto/nacl/secretbox"
var key [32]byte
var nonce [24]byte
rand.Read(key[:])
rand.Read(nonce[:])
// Encrypt
ciphertext := secretbox.Seal(nil, []byte("Hello"), &nonce, &key)
// Decrypt
plaintext, ok := secretbox.Open(nil, ciphertext, &nonce, &key)
sodium_memzero() to securely clear sensitive data.