Lo stesso AES ha tre varianti: AES-128, AES-192 e AES-256. Internamente, gli algoritmi hanno costruzioni molto simili. Il numero è la lunghezza della chiave (in bit), ovvero la lunghezza del segreto predisposto (AES è un codice segreto condiviso). Un numero più alto significa non solo una chiave più lunga, ma anche più lavoro svolto con la chiave e l'input per produrre l'output.
Ciascuno di questi tre algoritmi specifica due funzioni encrypt
e decrypt
; entrambe le funzioni prendono come input un n valore -bit ( n = 128, 192 o 256) chiamato la chiave e un valore a 128 bit chiamato blocco di ingresso e producono come emette un valore a 128 bit chiamato blocco di uscita. Il blocco di input in encrypt
è chiamato testo in chiaro e il blocco di output è chiamato testo cifrato; per decrypt
, i ruoli sono invertiti.
encrypt(key, plaintext) = ciphertext
decrypt(key, ciphertext) = plaintext
AES è una cifra a blocchi . Specifica solo come crittografare o decodificare un blocco a 128 bit. Se i tuoi dati sono più corti o più lunghi di quello, hai bisogno di qualcosa di più sofisticato: devi avere un
modalità di funzionamento , spesso chiamata modalità di concatenamento perché specifica come elaborare un blocco dopo l'altro. La scelta della modalità concatenamento è largamente indipendente dalla scelta dell'algoritmo di elaborazione dei blocchi.
Alcune modalità di concatenamento richiedono solo la chiave e l'input. Ad esempio, ECB , la modalità più semplice di tutte, dice solo di tagliare l'input in blocchi di la dimensione appropriata, applicare l'algoritmo di crittografia / decrittografia e incollare i blocchi di output insieme. Questa modalità ha molti difetti (ad esempio, puoi individuare le ripetizioni nell'input se sono allineate con un limite di blocco, puoi dire se due messaggi cifrati sono uguali perché hanno lo stesso testo cifrato).
Molte modalità di concatenamento richiedono un ulteriore input, in genere un blocco di dimensioni. Di solito è mescolato con il primo blocco di input in qualche modo, e chiamato un vettore di inizializzazione ( spesso abbreviato IV ). L'IV viene solitamente scelto in modo casuale; questo è un requisito per alcune modalità, mentre per gli altri è sufficiente non scegliere mai la stessa IV due volte per la stessa chiave (che assicura un sorteggio casuale). L'IV serve (almeno) a fare due cifrature dello stesso testo in chiaro con la stessa chiave distinta. Una modalità popolare che utilizza un IV casuale è CBC . Un'altra modalità popolare è CTR (contatore) ; il suo IV è più propriamente chiamato un nonce , perché non deve essere casuale, solo non ripetuto.
Spezzare l'input in blocchi funziona solo quando è un multiplo della dimensione del blocco. Altrimenti, il solito processo consiste nel separare il maggior numero possibile di blocchi all'inizio e applicare uno schema di riempimento fino all'ultimo blocco parziale. Anche se padding tende a implicare che alcuni bit vengono aggiunti per creare un blocco completo, il padding in modo sicuro non è così semplice: un blocco parziale B con qualche padding P i rischi aggiunti vengono confusi con un blocco completo che si trova BP . I buoni schemi di padding devono applicare un po 'di padding a tutti i messaggi, anche quelli che sono un numero esatto di blocchi. Alcune modalità di funzionamento impongono uno schema di riempimento particolare, mentre altre sono indipendenti dal padding. Le librerie crittografiche richiedono spesso che l'input per bloccare le funzioni di cifratura sia solo a blocchi completi, lasciando l'attività di riempimento al chiamante.
Ci sono modi che fanno qualcosa di diverso da un algoritmo di crittografia / decodifica con cifrari a blocchi. Modalità come CMAC creano un codice di autenticazione del messaggio , ovvero una firma basata su un segreto condiviso. Modalità come GCM eseguono sia la crittografia sia la firma (l'output di AES- n - GCM-encrypt (chiave, IV, tag, testo in chiaro) è sia un testo cifrato che un MAC).