Cos'e'#
La crittografia asimmetrica usa una coppia di chiavi matematicamente correlate: una public key (distribuita liberamente) e una private key (mai condivisa). Risolve il problema fondamentale della crittografia simmetrica — come si scambia la chiave segreta su un canale insicuro — senza richiedere un canale separato pre-sicuro. Il prezzo e' la velocita': e' significativamente piu' lenta di AES, quindi viene usata solo per key exchange e firme, mai per cifrare bulk data.

Cifra e firma usando una coppia di chiavi matematicamente correlate. La public key cifra o verifica — la private key decifra o firma. Le due operazioni hanno scopi opposti: confidenzialita' vs autenticazione.
TL;DR#
Asimmetrica = due chiavi, due operazioni distinte:
- Cifrare: chiunque cifra con la pub key del destinatario → solo il destinatario (priv key) legge.
- Firmare: il mittente firma con la propria priv key → chiunque verifica con la pub key del mittente.
La firma non cifra il messaggio — lo autentica. Si firma sempre l'hash del messaggio, mai il testo grezzo. La firma dice: "chi ha la private key ha prodotto questo hash" — e' non-repudiabile.
Regola Fondamentale#
La regola e' semplice ma i sensi sono opposti. E' la cosa piu' importante di tutta la crittografia asimmetrica — e la piu' frequente fonte di confusione all'esame.
graph LR
PUB["PUBLIC KEY
distribuita a tutti"]
PRIV["PRIVATE KEY
mai condivisa"]
CONF["Confidenzialita'
solo il possessore legge"]
AUTH["Autenticazione
firma digitale + non-repudio"]
PUB -->|cifra| CONF
PRIV -->|decifra| CONF
PRIV -->|firma l'hash| AUTH
PUB -->|verifica la firma| AUTH
Lettura: Due percorsi separati con scopi opposti. Sinistra (confidenzialita'): la public key cifra, solo la private key decifra. Destra (autenticazione): la private key firma l'hash del messaggio, la public key verifica la firma. La stessa coppia di chiavi, usata in direzioni invertite per scopi diversi.

Cifrare con la private key NON protegge la riservatezza. Chiunque abbia la public key puo' leggere. Questo e' autenticazione. La riservatezza si ottiene cifrando con la public key del destinatario.
The Raybern Box#
Gibson usa questa metafora per rendere visivo il principio della crittografia asimmetrica senza matematica. E' uno strumento pratico per ragionare sui casi d'uso e le varianti.
sequenceDiagram
participant M as Mittente
participant R as Ricevente
rect rgba(50, 120, 220, 0.2)
Note over M,R: VERSIONE 1 - CONFIDENZIALITA'
R->>M: Cassetta vuota + PUBLIC KEY (chiude ma non apre)
Note over M: Inserisce il contenuto e chiude con PUBLIC KEY
M->>R: Cassetta chiusa
Note over R: Apre con PRIVATE KEY (unica copia)
Note over M,R: Chi ha copie della pub key non puo' aprire
end
rect rgba(50, 180, 80, 0.2)
Note over M,R: VERSIONE 2 - AUTENTICAZIONE
Note over M: Inserisce il messaggio e chiude con PRIVATE KEY
M->>R: Cassetta chiusa con private key
R->>R: Apre con PUBLIC KEY del mittente
Note over R: Si apre con pub key = mittente l'ha chiusa = ha firmato
Note over M,R: Spia apre con pub key ma non puo' richiudere
end
Lettura: Due scenari della cassetta. Versione 1 (blu): confidenzialita'. Il ricevente manda la cassetta aperta con copie della public key. Il mittente inserisce e chiude. Solo la private key apre. Versione 2 (verde): autenticazione. Il mittente chiude con la propria private key. Chiunque puo' aprire con la public key — ma l'apertura prova chi ha chiuso. Una spia puo' aprire ma non richiudere: il ricevente trova la cassetta aperta e sa che c'e' stata manomissione.
RSA#
RSA (Rivest-Shamir-Adleman, 1977) e' l'algoritmo asimmetrico storico per eccellenza. La sua sicurezza si basa sulla difficolta' computazionale di fattorizzare il prodotto di due numeri primi molto grandi. Funziona, ma e' piu' lento e richiede chiavi piu' lunghe di ECC per la stessa sicurezza.
RSA-1024 e' stato deprecato dal NIST nel 2010. Se vedi RSA-1024 in un sistema → vulnerabilita' critica. Il minimo accettabile e' 2048, il raccomandato e' 3072.
ECC — Elliptic Curve Cryptography#
ECC usa equazioni matematiche su curve ellittiche invece della fattorizzazione di interi. Il vantaggio operativo e' decisivo: chiavi molto piu' corte per la stessa sicurezza, meno CPU, meno banda. ECC sta sostituendo RSA come standard per tutti i nuovi sistemi.
graph LR
ECC["ECC
Elliptic Curve Cryptography"]
ECDHE["ECDHE
Key exchange TLS 1.3
Perfect Forward Secrecy"]
ECDSA["ECDSA
Digital Signature
JWT, code signing, certificati"]
BTC["Bitcoin / Blockchain
curva secp256k1
chiavi wallet, firme tx"]
IOT["Low-power devices
IoT, smart card
meno CPU di RSA"]
ECC --> ECDHE
ECC --> ECDSA
ECC --> BTC
ECC --> IOT
Lettura: La matematica delle curve ellittiche si ramifica in quattro applicazioni distinte. ECDHE: key exchange con PFS in TLS 1.3. ECDSA: firme digitali per JWT, code signing, certificati moderni. Bitcoin: curva secp256k1 per wallet e firme transazioni. Low-power: IoT e smart card dove RSA sarebbe troppo pesante.
Dev parallel: Quando generi un JWT in Node.js o Symfony hai due opzioni comuni —
RS256(RSA 2048, firma 256 byte) oES256(ECDSA P-256, firma 64 byte). ES256 usa chiavi piu' piccole, firma piu' veloce, meno CPU per ogni richiesta. Lo impacto diventa visibile ad alto traffico: 10.000 JWT/secondo verifica con RS256 vs ES256 e' facilmente misurabile. Lo stesso principio si vede nelle cipher suite TLS:ECDHE_ECDSAusa key exchange effimero (ECDHE, PFS) e firma del certificato in ECDSA.Bitcoin usa esattamente ECC — la curva
secp256k1. Il tuo indirizzo Bitcoin e' derivato dalla public key ECDSA. Quando firmi una transazione usi la private key ECDSA. E' la stessa matematica del TLS, su una curva diversa scelta per proprieta' algebriche che facilitano l'implementazione hardware ottimizzata.
Chiavi Statiche vs Efimere#
Nella crittografia asimmetrica coesistono due tipi di chiavi con cicli di vita radicalmente diversi. Le chiavi statiche identificano un'entita' nel tempo. Le chiavi efimere proteggono una singola sessione e poi scompaiono.
Le due chiavi coesistono in TLS 1.3: la chiave statica (nel certificato) autentica il server, le chiavi efimere ECDHE derivano la session key per quella sessione specifica. Perdere la private key statica del server compromette l'identita' — ma non le sessioni passate, protette da PFS.
Code Signing#
Code signing applica la firma digitale ai binari software. Lo sviluppatore firma il codice con la propria private key prima della distribuzione. Il sistema operativo verifica la firma con la public key del developer (dal certificato) prima di eseguire il binario. Se la firma manca o non torna, il sistema allerta l'utente o blocca l'esecuzione.
Il caso SolarWinds mostra il limite del code signing: se il build server viene compromesso, il malware viene firmato con la chiave legittima del vendor. La firma dice "questo e' autentico" — ma autentico del processo di build corrotto. Code signing protegge dall'attacco al mirror/CDN, non dall'attacco al build environment.
In un audit di sicurezza: controlla sempre il campo Key Usage nel certificato code signing. Un certificato con Key Usage limitato a Server Authentication non puo' firmare codice — e se lo fa, e' una anomalia investigabile.
Scenario Reale Blue Team#
La crittografia asimmetrica e' operativa in ogni livello dello stack moderno. Il Blue Team la incontra nell'analisi dei log TLS, nella verifica dei certificati, nell'ispezione dei JWT e nel monitoraggio degli update software.
# Verifica cipher suite ECDHE_ECDSA in uso su un server
openssl s_client -connect api.service.com:443 2>/dev/null \
| grep -E "Cipher|Group|Protocol"
# Cercare: TLS_AES_256_GCM_SHA384 (TLS 1.3) o ECDHE_ECDSA_* (TLS 1.2)
# ECDHE = PFS attivo; ECDSA = server firmato con ECC
# Controlla algoritmo usato nel certificato del server
openssl s_client -connect api.service.com:443 2>/dev/null \
| openssl x509 -noout -text \
| grep -E "Public Key Algorithm|RSA|ECDSA|Signature"
# RSA: chiave statica, piu' grande
# ECDSA: chiave piu' piccola, moderna
# Verifica firma di un eseguibile su Linux con GPG
gpg --verify software.tar.gz.sig software.tar.gz
# Exit code 0 = firma valida; 1 = firma invalida o chiave sconosciuta
# Decodifica un JWT per vedere algoritmo usato
# (header.payload.signature — base64url)
echo "eyJhbGciOiJSUzI1NiJ9" | base64 -d 2>/dev/null
# "alg":"RS256" = RSA; "alg":"ES256" = ECDSA P-256Quando ispezionate un JWT sospetto in un log, il campo alg nell'header (decodificato dal primo segmento base64) rivela subito l'algoritmo. RS256 = RSA, ES256 = ECDSA, HS256 = HMAC simmetrico (nessuna crittografia asimmetrica — la chiave e' condivisa tra mittente e verificatore).
Collegato a#
- crypto — categoria
- cryptography — teoria crittografica base: simmetrica, asimmetrica, hashing
- ssl-tls — ECDHE per key exchange e PFS nel TLS handshake
- pki — come la public key viene distribuita via certificati e catena CA


