# NaCl (software)

NaCl (Networking and Cryptography Library, pronunciato in inglese come "salt") è una libreria software ad alta velocità di pubblico dominio per la crittografia.
Questa libreria crittografica è stata creata dal matematico e programmatore Daniel J. Bernstein, noto per aver creato Qmail e Curve25519 . Del team principale fanno parte anche Tanja Lange (crittografa e teorica dei numeri tedesca) e Peter Schwabe (crittografo e ricercatore tedesco).
NaCl è stata progettata per migliorare la sicurezza evitando problemi come le perdite di casualità e le fughe laterali e incoraggiare l'uso della crittografia autenticata. Utilizza primitive crittografiche moderne e robuste, come Curve25519 e Salsa20, per garantire la sicurezza delle comunicazioni digitali.
È stata utilizzata come base per librerie come libsodium, che estende l'API di NaCl con nuovi algoritmi e funzioni.

## Funzioni
### Crittografia a chiave pubblica

* crypto_box, fornisce un'autenticazione cifrata, combinando sia la cifratura che l'autenticazione in un singolo passaggio. Cifratura autenticata a chiave pubblica. Lo scambio delle chiavi avviene tramite X25519. La crittografia attraverso Salsa20-Poly1305.
* crypto_scalarmult,viene utilizzata per generare chiavi pubbliche e private e per eseguire lo scambio di chiavi Diffie-Hellman
* crypto_sign, fornisce una firma digitale, che permette di verificare l'autenticità e l'integrità di un messaggio. Utilizza Ed25519 and SHA-512

### Crittografia a chiave segreta

* crypto_secretbox, Cifra e autentica un messaggio in un'unica operazione, garantendo sia la riservatezza che l'integrità dei dati. Utilizza Salsa20-
* crypto_stream, Genera un flusso di cifratura utilizzando Salsa20, XSalsa20 o AES
* crypto_auth, Calcola un codice di autenticazione del messaggio (MAC), che permette di verificare l'integrità di un messaggio ma non la sua riservatezza. Utilizza HMAC-SHA-512-256.
* crypto_onetimeauth,Calcola un MAC per messaggi di lunghezza variabile, garantendo l'integrità ma non la riservatezza. Utilizza Poly1305.

### Funzioni di basso livello

* crypto_hash, Calcola un'impronta digitale (hash) di un messaggio utilizzando SHA-512 o SHA-256.
* crypto_verify, Confronta due hash per verificare l'integrità.

## Implementazioni

NaCl è scritta principalmente in linguaggio C per garantire alte prestazioni e portabilità. Utilizza però anche l'assembly in linea per ottimizzare le prestazioni su specifiche architetture hardware, massimizzando così l'efficienza e la velocità.
NaCl include un wrapper per C++, che offre un'interfaccia più adatta agli sviluppatori che utilizzano questo linguaggio. Il wrapper semplifica l'integrazione delle funzionalità di NaCl in applicazioni C++.
Esiste anche un wrapper Python chiamato PyNaCl. Una libreria Python che fornisce binding per la libreria libsodium, che è un fork di NaCl. Questa libreria rende le funzionalità di NaCl disponibili in Python, permettendo agli sviluppatori di utilizzare le funzioni di crittografia,
autenticazione e hashing in modo semplice e sicuro.
Esistono implementazioni anche per PHP che sono libsodium-php (una libreria che fornisce binding per libsodium) e Salt (un'altra libreria PHP per NaCl, disponibile su GitHub).
Tcl implementa NaCl attraverso i wrapper TclPro Wrapper e aschoepe/nacl.

### Libsodium

Libsodium è un fork di NaCl creato nel 2013. È stato sviluppato per essere portabile (funziona su molte piattaforme e compilatori, inclusi Windows, macOS, Linux, iOS e Android) e facilmente installabile mantenendo un'API compatibile con NaCl ma estendendola per migliorarne l'usabilità. Include funzioni per la gestione della memoria protetta, che aiutano a prevenire attacchi di memoria.
Può essere utilizzata come una libreria dinamica (shared library) rendendola una scelta eccellente per i binding a linguaggi di programmazione come come Pharo, Perl 5, e Python.
libsodium estende le API di NaCl con nuovi algoritmi (ad esempio BLAKE2, ChaCha20-Poly1305, AEGIS) e nuove classi di funzioni (generazione di numeri casuali, hashing di input breve, hashing della password e derivazione della chiave ).

### TweetNaCl

TweetNaCl è una libreria di crittografia estremamente compatta e facile da usare creata nel 2013 dagli autori di NaCl e progettata per fornire un alto livello di sicurezza in modo efficiente. Il nome stesso suggerisce la sua caratteristica principale: l'intera libreria può essere descritta in soli 100 tweet (ognuno dei quali composto da 140 simboli)!
TweetNaCl è stato utilizzato come base per TweetNaCl.js e TweetNaCl-Java.
TweetNaCl è stato riscritto in SPARK Ada, un sottolinguaggio di Ada progettato per la programmazione ad alta integrità. Questa riscrittura è conosciuta come SPARKNaCl. La caratteristica distintiva di SPARKNaCl è che, a differenza di TweetNaCl, è reso più leggibile grazie all'inclusione di numerosi commenti esplicativi e contratti nel codice.

### Altre implementazioni

* dryoc — una libreria di crittografia Rust pura che implementa l'API libsodium/NaCl con supporto per la memoria protetta .
* Monocypher — è una libreria di crittografia leggera e facile da usare, scritta in C. È progettata per essere piccola e portatile, ideale per sistemi embedded. Mira ad avere la velocità di NaCl con la dimensione di TweetNaCl.