Cifratura e decifratura AES-GCM in Python
Implementi la cifratura autenticata con una gestione corretta del nonce.
Cifratura e decifratura AES-GCM in Python è una lezione Cryptology Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Cryptology Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Cryptology Academy include 4 lezioni in totale.
Perché AES-GCM?
AES-GCM è uno schema di Authenticated Encryption with Associated Data (AEAD). Fornisce riservatezza (AES-CTR) e integrità/autenticità (MAC GHASH) in un unico passaggio: è lo standard per la crittografia moderna.
Componenti di GCM: CTR + GHASH
AES-GCM = AES in modalità Counter (crittografia) + MAC polinomiale GHASH (autenticazione). Il tag di autenticazione di 128 bit copre sia il testo cifrato sia gli eventuali Additional Authenticated Data (AAD).
Requisiti dei nonce
Il nonce di 96 bit non deve mai essere riutilizzato con la stessa chiave. Il riutilizzo del nonce compromette completamente GCM: un attaccante recupera la chiave di autenticazione e può falsificare testi cifrati. Utilizzi nonce casuali oppure un contatore con rotazione delle chiavi.
Crittografia con AES-GCM in Python
Utilizzando il livello hazmat:
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
# Generate a 256-bit key
key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)
# Fresh 96-bit nonce per encryption
nonce = os.urandom(12)
plaintext = b"sensitive payload"
aad = b"user_id=42" # authenticated but not encrypted
ciphertext = aesgcm.encrypt(nonce, plaintext, aad)
print("Nonce:", nonce.hex())
print("Ciphertext+tag:", ciphertext.hex())Decrittografia con AES-GCM in Python
La decrittografia verifica automaticamente il tag e genera InvalidTag in caso di errore:
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.exceptions import InvalidTag
# key, nonce, ciphertext, aad from previous step
try:
recovered = aesgcm.decrypt(nonce, ciphertext, aad)
print("Decrypted:", recovered)
except InvalidTag:
print("Authentication failed — ciphertext tampered!")Archiviazione di nonce + testo cifrato
Pre anteponga il nonce al testo cifrato prima di archiviarli. Durante la decrittografia, divida i dati al byte 12:
def encrypt_blob(key: bytes, data: bytes, aad: bytes = b"") -> bytes:
aesgcm = AESGCM(key)
nonce = os.urandom(12)
ct = aesgcm.encrypt(nonce, data, aad or None)
return nonce + ct # prepend nonce
def decrypt_blob(key: bytes, blob: bytes, aad: bytes = b"") -> bytes:
aesgcm = AESGCM(key)
nonce, ct = blob[:12], blob[12:]
return aesgcm.decrypt(nonce, ct, aad or None)Additional Authenticated Data (AAD)
L'AAD viene autenticato ma non crittografato. Lo utilizzi per associare il testo cifrato al contesto: ID utente, ID record, versione dell'API. In questo modo impedisce a un attaccante di spostare un testo cifrato valido in un contesto diverso.
Utilizzo dell'API Cipher di basso livello
Per la crittografia in streaming o direttamente in memoria, utilizzi l'API Cipher direttamente con la modalità GCM:
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
key = os.urandom(32)
nonce = os.urandom(12)
cipher = Cipher(algorithms.AES(key), modes.GCM(nonce))
encryptor = cipher.encryptor()
encryptor.authenticate_additional_data(b"aad-value")
ct = encryptor.update(b"hello world") + encryptor.finalize()
tag = encryptor.tag
print("Tag:", tag.hex())Resistenza all'uso improprio dei nonce: AES-GCM-SIV
AES-GCM-SIV (RFC 8452) resiste all'uso improprio dei nonce: il riutilizzo del nonce rivela che due testi in chiaro sono identici, ma NON compromette l'autenticità. Lo preferisca quando è difficile garantire l'unicità dei nonce.
Derivazione della chiave prima della crittografia
Non utilizzi mai una password grezza come chiave AES. Derivi una chiave con Argon2 o HKDF:
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
import os
master_secret = b"shared_secret_from_ECDH"
salt = os.urandom(16)
kdf = HKDF(algorithm=hashes.SHA256(), length=32, salt=salt, info=b"aes-gcm-key")
aes_key = kdf.derive(master_secret)
print("Derived AES key:", aes_key.hex())Considerazioni sulle prestazioni
L'accelerazione hardware AES-NI rende AES-GCM estremamente veloce (circa 1-4 GB/s sulle CPU moderne). La libreria cryptography per Python utilizza OpenSSL, che sfrutta AES-NI. Per file di dimensioni superiori a 100 MB, utilizzi lo streaming a blocchi con l'API Cipher di basso livello.
Verifica delle conoscenze
Che cosa accade se lo stesso nonce viene utilizzato due volte con AES-GCM e la stessa chiave?
Riepilogo della lezione
AES-GCM fornisce crittografia autenticata in un unico passaggio. Utilizzi un nonce casuale di 96 bit nuovo per ogni crittografia. Ante ponga il nonce al testo cifrato per archiviarli. L'AAD associa il testo cifrato al contesto. AES-GCM-SIV resiste all'uso improprio dei nonce. Derivi le chiavi con HKDF e non utilizzi mai password grezze.
Domande Frequenti
La lezione «Cifratura e decifratura AES-GCM in Python» è gratuita?
Sì — il testo completo di «Cifratura e decifratura AES-GCM in Python» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Cryptology Academy, passa a CoddyKit PRO. Il corso Cryptology Academy include 4 lezioni in totale.
Cosa imparerò in «Cifratura e decifratura AES-GCM in Python»?
Implementi la cifratura autenticata con una gestione corretta del nonce. Eserciti Cryptology Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Cryptology Academy?
Non è richiesta alcuna esperienza precedente. Cryptology Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Cifratura e decifratura AES-GCM in Python»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Cryptology Academy?
Sì. Ogni lezione Cryptology Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Panoramica della libreria Python cryptography
- Cifratura e decifratura AES-GCM in Python
- Coppie di chiavi RSA ed ECDSA in Python
- Errori comuni nella crittografia Python e pattern sicuri