AES (Advanced Encryption Standard)

Indice dei contenuti

    AES (Advanced Encryption Standard) è lo standard di crittografia simmetrica a blocchi adottato dal NIST (National Institute of Standards and Technology) nel 2001, a conclusione di un processo di selezione pubblica durato cinque anni. È basato sull’algoritmo Rijndael, progettato dai crittografi belgi Joan Daemen e Vincent Rijmen. AES è oggi il cifrario simmetrico più diffuso al mondo: è usato in TLS, WiFi (WPA2/WPA3), crittografia disco (BitLocker, FileVault), VPN, storage cloud e praticamente ogni sistema che richieda cifratura simmetrica ad alte prestazioni.

    Parametri

    AES opera su blocchi di 128 bit con tre varianti di lunghezza di chiave:

    VarianteLunghezza chiaveRound
    AES-128128 bit10
    AES-192192 bit12
    AES-256256 bit14

    Per la maggior parte delle applicazioni, AES-128 offre sicurezza sufficiente. AES-256 è preferito in contesti con requisiti di sicurezza elevati o che devono resistere anche a avversari con capacità quantistiche (l’algoritmo di Grover riduce la sicurezza effettiva di AES-256 a ~128 bit quantistici equivalenti).

    Struttura dell’algoritmo

    AES è una rete di sostituzione-permutazione (SP-network) che opera su uno stato di 4×4 byte (128 bit). Ogni round applica quattro trasformazioni sequenziali:

    1. SubBytes: sostituzione non lineare di ogni byte attraverso una S-box fissa (basata sull’inversione in GF (2⁸)).
    2. ShiftRows: rotazione ciclica delle righe dello stato di 0, 1, 2, 3 posizioni.
    3. MixColumns: combinazione lineare delle colonne tramite moltiplicazione in GF (2⁸) — garantisce la diffusione.
    4. AddRoundKey: XOR dello stato con la sottochiave di round derivata dalla key schedule.

    L’ultimo round omette MixColumns. La sicurezza deriva dall’alternarsi di confusione (SubBytes) e diffusione (ShiftRows + MixColumns), seguendo il principio di Shannon.

    Modalità operative

    AES è un cifrario a blocchi: cifra esattamente 128 bit alla volta. Per cifrare messaggi di lunghezza arbitraria si usano modalità operative:

    • ECB (Electronic Codebook): ogni blocco cifrato indipendentemente con la stessa chiave. Non sicuro: blocchi identici producono ciphertext identici (la struttura del plaintext è visibile). Da non usare.
    • CBC (Cipher Block Chaining): ogni blocco è XOR-ato con il ciphertext precedente prima della cifratura. Richiede un IV (Initialization Vector) casuale. Sequenziale, non parallelizzabile in cifratura.
    • CTR (Counter): converte AES in un cifrario a flusso cifrando un contatore incrementale e XOR-ando il keystream col plaintext. Parallelizzabile, accesso random ai blocchi. Richiede che la coppia (chiave, nonce) non sia mai riusata.
    • GCM (Galois/Counter Mode): CTR con autenticazione integrata (AEAD — Authenticated Encryption with Associated Data). Garantisce sia confidenzialità sia integrità/autenticità. È la modalità standard in TLS 1.3 e nelle applicazioni moderne.

    Attenzione — nonce reuse in GCM: GCM richiede che la coppia (chiave, nonce) non sia mai riusata. Riusare lo stesso nonce con la stessa chiave in GCM svela il keystream e permette la falsificazione dei tag di autenticazione: la sicurezza crittografica decade completamente. Questo non è un problema teorico: è stato sfruttato in implementazioni reali (WPA2 KRACK, 2017, basato su nonce reuse nel handshake). Le implementazioni devono usare un contatore incrementale o un nonce casuale a 96 bit (probabilità di collisione trascurabile per <232< 2^{32} messaggi con la stessa chiave).

    Sicurezza

    Non sono noti attacchi pratici contro AES correttamente implementato. Gli attacchi teorici migliori (biclique attack su AES-128) richiedono 2126.12^{126.1} operazioni — impraticabili. La minaccia principale non è crittoanalitica ma implementativa: timing side-channel, cache-timing attacks e fault injection possono compromettere implementazioni software naive. Le CPU moderne (x86, ARM) implementano AES in hardware (istruzione AES-NI) sia per le prestazioni sia per l’immunità ai timing attack.

    Ultimo aggiornamento: