AES (Advanced Encryption Standard) è un algoritmo di crittografia simmetrica a blocchi adottato nel 2001 dal National Institute of Standards and Technology (NIST) come standard ufficiale. AES ha sostituito il DES obsoleto e da allora è diventato l'algoritmo di crittografia più diffuso al mondo, utilizzato dai sistemi bancari alle applicazioni mobili. Secondo il NIST (2023), AES fornisce una sicurezza equivalente a 2^256 operazioni per una chiave a 256 bit, rendendolo invulnerabile agli attacchi moderni di forza bruta. NIST FIPS 197, 2023
Punti chiave
AES (Advanced Encryption Standard) è un cifrario simmetrico a blocchi sviluppato dai crittografi belgi Joan Daemen e Vincent Rijmen sotto il nome Rijndael. Nel 2001, il NIST ha selezionato Rijndael come vincitore del concorso per un nuovo standard di crittografia statunitense dopo cinque anni di test pubblici e analisi. AES opera su blocchi di dati di dimensione fissa (128 bit) e supporta tre lunghezze di chiave: 128, 192 e 256 bit. Il numero di round di trasformazione dipende dalla lunghezza della chiave: 10 round per 128 bit, 12 per 192 bit e 14 per 256 bit. Ogni round include quattro operazioni: SubBytes (sostituzione non lineare di byte tramite S-box), ShiftRows (spostamento ciclico di righe), MixColumns (mescolanza di colonne) e AddRoundKey (XOR con la chiave di round).
Lo sviluppo di AES iniziò nel 1997 quando il NIST annunciò un concorso per sostituire DES, la cui chiave a 56 bit fu violata in 22 ore nel 1998 sul dispositivo specializzato Deep Crack. Quindici algoritmi di vari paesi parteciparono, tra cui Serpent (Regno Unito), Twofish (USA) e RC6 (USA). Per la finale del 1999, rimasero 5 candidati. Rijndael vinse grazie alla combinazione di alta velocità su tutte le piattaforme (da microcontrollori a 8 bit a server a 64 bit), resistenza alla crittoanalisi e implementazione compatta in hardware. Dal 2006, AES viene utilizzato per crittografare dati classificati SECRET e TOP SECRET nei sistemi governativi statunitensi. Oggi, AES è integrato in tutti i principali protocolli: TLS 1.2/1.3, IPsec, SSH, Wi-Fi WPA2/WPA3 e Bluetooth BR/EDR.
AES elabora i dati in blocchi di 128 bit (16 byte), organizzati come una matrice 4x4 byte chiamata state. Ogni round di crittografia esegue una sequenza di trasformazioni deterministiche che creano collettivamente un effetto valanga: modificare un bit dei dati di input modifica circa il 50% dei bit di output. Questo effetto rende AES resistente alla crittoanalisi differenziale e lineare — i metodi principali per violare i cifrari a blocchi.
Il processo inizia con AddRoundKey — XOR della chiave iniziale con lo state. Quindi vengono eseguiti i round: SubBytes sostituisce ogni byte dello state con un valore dalla S-box (tabella di sostituzione). ShiftRows sposta ciclicamente la seconda riga di 1 posizione, la terza di 2, la quarta di 3 — garantendo la mescolanza tra le colonne. MixColumns moltiplica ogni colonna dello state per una matrice fissa nel campo di Galois GF(2^8), creando dipendenza di ogni byte di output da tutti e quattro i byte di input della colonna. AddRoundKey applica XOR con la chiave di round successiva, derivata dalla chiave originale tramite Key Expansion. L'ultimo round omette MixColumns. La decifratura utilizza le operazioni inverse InvSubBytes, InvShiftRows, InvMixColumns e AddRoundKey in ordine inverso. Per gli sviluppatori mobili, non è necessario comprendere la struttura interna di AES — è sufficiente sapere come chiamare correttamente le API integrate della piattaforma con i parametri appropriati.
La caratteristica principale di AES che garantisce la sua forza crittografica è l'effetto valanga. Modificare un bit nel testo in chiaro o nella chiave comporta la modifica di circa il 50% dei bit del testo cifrato, rendendo AES estremamente resistente alla crittoanalisi differenziale e lineare. La combinazione di SubBytes (non linearità tramite S-box) e MixColumns (diffusione tramite moltiplicazione nel campo di Galois) crea una complessità matematica tale che anche conoscendo parte del testo cifrato non è possibile recuperare la chiave più velocemente della forza bruta. Secondo l'analisi del NIST (2018), il miglior attacco noto ad AES-128 — l'attacco biclique — riduce la lunghezza effettiva della chiave di soli 2 bit (a 126.2 bit), senza fornire alcun vantaggio pratico all'attaccante. Per AES-256, non esistono attacchi praticamente realizzabili che superino la forza bruta.
AES supporta tre dimensioni di chiave, ciascuna corrispondente a un livello specifico di forza crittografica. La scelta della dimensione della chiave influisce sulla sicurezza, sulle prestazioni e sui requisiti di risorse del dispositivo.
| Dimensione chiave | Numero di round | Livello di sicurezza | Applicazione |
|---|---|---|---|
| AES-128 | 10 | 128 bit | Applicazioni commerciali, TLS |
| AES-192 | 12 | 192 bit | Sistemi governativi (SECRET) |
| AES-256 | 14 | 256 bit | TOP SECRET, settore finanziario |
Regola pratica: per le applicazioni mobili utilizzare AES-256 per impostazione predefinita. La differenza di prestazioni tra AES-128 e AES-256 sui dispositivi moderni con supporto AES-NI non supera il 10–15%, ma il livello di sicurezza raddoppia. Secondo l'analisi quantistica (Grassl et al., 2016), violare AES-128 richiederebbe 2^77 operazioni quantistiche tramite l'algoritmo di Grover, mentre AES-256 ne richiederebbe 2^149, rendendo AES-256 resistente agli attacchi quantistici per i prossimi 20–30 anni. Anche AES-128 fornisce protezione sufficiente per la stragrande maggioranza degli scenari commerciali: la forza bruta di una chiave a 128 bit richiederebbe più energia di quanta ne esista nell'universo secondo la stima di Bruce Schneier. Tuttavia, gli standard di sicurezza (GDPR, HIPAA, PCI DSS) spesso richiedono esplicitamente AES-256, quindi i progetti in produzione dovrebbero utilizzare la lunghezza massima della chiave.
AES come cifrario a blocchi crittografa blocchi di dimensione fissa (128 bit). Per crittografare dati di lunghezza arbitraria, vengono utilizzate modalità di funzionamento. La selezione della modalità influisce criticamente sulla sicurezza: la modalità sbagliata può annullare la forza di AES.
Per i progetti mobili utilizzare AES-256-GCM con un nonce di 12 byte. GCM risolve due problemi contemporaneamente: crittografia dei dati e autenticazione, prevenendo attacchi padding oracle e chosen ciphertext. Android Keystore e iOS CryptoKit supportano AES-GCM nativamente senza bisogno di primitive crittografiche aggiuntive. Quando si lavora con GCM, è fondamentale non riutilizzare mai il nonce con la stessa chiave — questo distrugge completamente la sicurezza della crittografia. Generare un nuovo nonce casuale per ogni crittografia e memorizzarlo insieme al testo cifrato.
Vediamo un esempio di implementazione sicura di AES-256-GCM su Android utilizzando Jetpack Security. Il codice seguente mostra il ciclo completo: creazione di una chiave AES-256 tramite MasterKey, crittografia e decifratura di una stringa con dati autenticati aggiuntivi (AAD).
import androidx.security.crypto.MasterKey
import androidx.security.crypto.EncryptedSharedPreferences
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val securePrefs = EncryptedSharedPreferences.create(
context,
"secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
fun storeSecureData(key: String, value: String) {
securePrefs.edit().putString(key, value).apply()
}
fun readSecureData(key: String): String? {
return securePrefs.getString(key, null)
}
La caratteristica principale di questa soluzione è che AES-256-GCM viene utilizzato a due livelli: per crittografare le coppie chiave-valore (PrefValueEncryptionScheme) e per proteggere i nomi delle chiavi stessi (PrefKeyEncryptionScheme utilizza AES-256-SIV, resistente al riutilizzo del nonce). MasterKey viene generato utilizzando l'algoritmo AES-256-GCM e memorizzato in Android Keystore, protetto hardware sui dispositivi con Trusted Execution Environment. Sui dispositivi senza supporto hardware (TEE), la chiave viene crittografata tramite Bouncy Castle, che è comunque più sicuro della memorizzazione in SharedPreferences.
Per la crittografia diretta di grandi volumi di dati (ad esempio, immagini o file), utilizzare AES-256-GCM tramite EncryptedFile di AndroidX Security. Per l'esportazione delle chiavi (ad esempio, per backup), utilizzare una crittografia aggiuntiva con una password utente tramite PBKDF2 con 100000+ iterazioni.
Su iOS, le operazioni AES sono organizzate tramite il framework CryptoKit (Swift 5.0+). Una chiave AES-256 viene creata tramite SymmetricKey(size: .bits256) e memorizzata nel Secure Enclave — un crittoprocessore hardware isolato dalla CPU principale e dal sistema operativo. CryptoKit fornisce due implementazioni di AES: AES.GCM (consigliato) e AES.CBC (per compatibilità con formati legacy). La crittografia viene eseguita tramite il metodo seal(), che accetta dati, chiave e nonce (12 byte), e restituisce AES.GCM.SealedBox — una struttura contenente il testo cifrato e il tag di autenticazione. La decifratura avviene tramite open(). Apple raccomanda vivamente di non utilizzare CommonCrypto direttamente: CryptoKit seleziona automaticamente i parametri ottimali, protegge dagli attacchi side-channel e utilizza l'accelerazione hardware AES-NI sui processori Apple Silicon. Sui dispositivi con Secure Enclave, le chiavi non lasciano mai il modulo hardware, impedendo il furto anche in caso di compromissione totale dell'applicazione. Per la serializzazione della chiave, utilizzare il metodo withUnsafeBytes seguito dall'archiviazione in Keychain tramite SecItemAdd con l'attributo kSecAttrAccessible = kSecAttrAccessibleWhenUnlockedThisDeviceOnly.
Domande frequenti
AES è un algoritmo che converte dati leggibili in un insieme illeggibile di byte utilizzando una chiave segreta. La stessa chiave è necessaria per riportare i dati alla loro forma originale. AES è così affidabile che viene utilizzato per crittografare i documenti segreti del governo statunitense.
AES-128 utilizza una chiave a 128 bit ed esegue 10 round di crittografia. AES-256 utilizza una chiave a 256 bit e 14 round, rendendolo 2^128 volte più difficile da violare. Per le applicazioni mobili, si consiglia AES-256 a causa della differenza di prestazioni minima.
AES-256-GCM è la modalità più sicura e consigliata. GCM fornisce crittografia autenticata (crittografia + verifica dell'integrità). La modalità ECB è vietata, CBC richiede un MAC separato. GCM è lo standard de facto per le applicazioni mobili.
Teoricamente, AES può essere violato per forza bruta, ma per AES-256 sarebbero necessari 2^256 tentativi — più del numero di atomi nell'universo osservabile. Non esistono attacchi pratici ad AES-256. Gli attacchi side-channel (Spectre, Meltdown) non violano AES ma rubano le chiavi dalla memoria, quindi l'archiviazione hardware delle chiavi è fondamentale.
Utilizzare la libreria AndroidX Security: MasterKey.Builder con KeyScheme.AES256_GCM crea una chiave protetta in Android Keystore, e EncryptedSharedPreferences crittografa automaticamente tutti i dati tramite AES-256-GCM. Nessuna crittografia manuale — l'API è sicura per impostazione predefinita, senza rischio di errori dello sviluppatore.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche