| Parameter | Size | Description |
|---|---|---|
| Key | 256 bits (32 bytes) | Secret symmetric key |
| Nonce | 192 bits (24 bytes) | Unique per message |
| Output | Same as input | XOR with keystream |
XSalsa20 is a stream cipher designed by Daniel J. Bernstein. It's an extended-nonce variant of Salsa20, used in NaCl (Networking and Cryptography library) and libsodium. The "X" indicates the extended 192-bit nonce (vs Salsa20's 64-bit nonce).
| Function | Primitive | Key Size | Nonce Size |
|---|---|---|---|
| crypto_stream_xsalsa20 | XSalsa20/20 | 32 bytes | 24 bytes |
| crypto_stream_salsa20 | Salsa20/20 | 32 bytes | 8 bytes |
| crypto_stream_salsa2012 | Salsa20/12 | 32 bytes | 8 bytes |
| crypto_stream_aes128ctr | AES-128-CTR | 16 bytes | 16 bytes |
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.
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.