Cryptology Academy · Lektion

Kryptera och dekryptera med AES-GCM i Python

Implementera autentiserad kryptering med korrekt nonce-hantering.

Lektion 2 av 413 steg

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.

Gratis att börja

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

  1. Översikt över Python-biblioteket cryptography
  2. Kryptera och dekryptera med AES-GCM i Python
  3. RSA- och ECDSA-nyckelpar i Python
  4. Vanliga kryptografiska fallgropar i Python och säkra mönster
← Tillbaka till Cryptology Academy