Kryptera och dekryptera med AES-GCM i Python
Implementera autentiserad kryptering med korrekt nonce-hantering.
Kryptera och dekryptera med AES-GCM i Python är en gratis lektion i Cryptology Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Cryptology Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Cryptology Academy innehåller totalt 4 lektioner.
Varför AES-GCM?
AES-GCM är en metod för autentiserad kryptering med associerade data (AEAD). Den ger konfidentialitet (AES-CTR) och integritet/äkthet (GHASH-MAC) i ett enda steg – standarden för modern kryptering.
GCM-komponenter: CTR + GHASH
AES-GCM = AES i räknarläge (kryptering) + polynomiell GHASH-MAC (autentisering). Den 128 bitar långa autentiseringstaggen omfattar både chiffertexten och eventuella ytterligare autentiserade data (AAD).
Krav på nonce
Den 96 bitar långa nonce:n får aldrig återanvändas med samma nyckel. Återanvändning av nonce förstör GCM helt – en angripare kan återfå autentiseringsnyckeln och förfalska chiffertexter. Använd slumpmässiga nonce-värden eller en räknare med nyckelrotation.
Kryptering med AES-GCM i Python
Användning av hazmat-lagret:
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())Dekryptering med AES-GCM i Python
Dekrypteringen verifierar taggen automatiskt och kastar InvalidTag vid fel:
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!")Lagra nonce + chiffertext
Placera nonce-värdet framför chiffertexten före lagring. Dela vid byte 12 vid dekryptering:
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)Ytterligare autentiserade data (AAD)
AAD autentiseras men krypteras inte. Använd det för att binda chiffertexten till en kontext: användar-ID, post-ID eller API-version. Det förhindrar en angripare från att flytta en giltig chiffertext till en annan kontext.
Använda Cipher-API:t på låg nivå
För strömmande eller direkt kryptering använder du Cipher-API:t direkt med GCM-läge:
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())Motståndskraft mot felaktig nonce-användning: AES-GCM-SIV
AES-GCM-SIV (RFC 8452) är motståndskraftigt mot felaktig nonce-användning: återanvändning av nonce avslöjar att två klartexter är identiska, men förstör INTE autenticiteten. Välj helst detta när det är svårt att garantera unika nonce-värden.
Härled nyckeln före kryptering
Använd aldrig ett obehandlat lösenord som AES-nyckel. Härled en nyckel med Argon2 eller 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())Prestandaöverväganden
Hårdvaruacceleration med AES-NI gör AES-GCM extremt snabbt (cirka 1–4 GB/s på moderna processorer). Python-biblioteket cryptography använder OpenSSL, som utnyttjar AES-NI. För filer större än 100 MB använder du blockvis strömning med Cipher-API:t på låg nivå.
Kunskapskontroll
Vad händer om samma nonce används två gånger med AES-GCM och samma nyckel?
Lektionssammanfattning
AES-GCM tillhandahåller autentiserad kryptering i ett enda steg. Använd en ny slumpmässig nonce på 96 bitar för varje kryptering. Placera nonce-värdet framför chiffertexten vid lagring. AAD binder chiffertexten till en kontext. AES-GCM-SIV står emot felaktig nonce-användning. Härled nycklar med HKDF och använd aldrig obehandlade lösenord.
Lär dig Cryptology Academy med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 67
- Lektioner
- 261
Vanliga frågor
Är lektionen ”Kryptera och dekryptera med AES-GCM i Python” gratis?
Ja – hela texten till ”Kryptera och dekryptera med AES-GCM i Python” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Cryptology Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Cryptology Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Kryptera och dekryptera med AES-GCM i Python”?
Implementera autentiserad kryptering med korrekt nonce-hantering. Ni övar på Cryptology Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Cryptology Academy?
Du behöver inga förkunskaper. Utbildningen i Cryptology Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Kryptera och dekryptera med AES-GCM i Python”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Cryptology Academy-lektionen?
Ja. Varje Cryptology Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Översikt över Python-biblioteket cryptography
- Kryptera och dekryptera med AES-GCM i Python
- RSA- och ECDSA-nyckelpar i Python
- Vanliga kryptografiska fallgropar i Python och säkra mönster