Cryptology Academy · Lektion

AES-GCM: Kryptering og dekryptering i Python

Implementér autentificeret kryptering med korrekt håndtering af noncer.

Lektion 2 af 413 trin

AES-GCM: Kryptering og dekryptering i Python er en gratis Cryptology Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Cryptology Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Cryptology Academy-kurset indeholder 4 lektioner i alt.

Hvorfor AES-GCM?

AES-GCM er en ordning til godkendt kryptering med tilknyttede data (AEAD). Den tilbyder fortrolighed (AES-CTR) og integritet/ægthed (GHASH-MAC) i én enkelt gennemgang — standarden for moderne kryptering.

GCM-komponenter: CTR + GHASH

AES-GCM = AES i tællertilstand (kryptering) + polynomiel GHASH-MAC (godkendelse). Den 128-bit store godkendelsestag dækker både chiffertekst og eventuelle yderligere godkendte data (AAD).

Krav til nonce

Den 96-bit store nonce må aldrig genbruges med den samme nøgle. Genbrug af nonce ødelægger GCM fuldstændigt — en angriber kan gendanne godkendelsesnøglen og forfalske chiffertekster. Brug tilfældige noncer eller en tæller sammen med nøgleudskiftning.

Kryptering med AES-GCM i Python

Brug af hazmat-laget:

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

Dekryptering bekræfter automatisk tagget og udløser InvalidTag ved fejl:

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!")

Opbevaring af nonce + chiffertekst

Føj noncen foran chifferteksten før opbevaring. Ved dekryptering opdeler du ved 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)

Yderligere godkendte data (AAD)

AAD godkendes, men krypteres ikke. Brug det til at binde chifferteksten til en kontekst: bruger-id, post-id eller API-version. Det forhindrer en angriber i at flytte en gyldig chiffertekst til en anden kontekst.

Brug af Cipher-API'et på lavt niveau

Til streaming eller kryptering på stedet skal du bruge Cipher-API'et direkte med GCM-tilstand:

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())

Modstandsdygtighed over for fejl i nonce: AES-GCM-SIV

AES-GCM-SIV (RFC 8452) er modstandsdygtig over for fejl i nonce: Genbrug af nonce afslører, at to klartekster er identiske, men ødelægger IKKE ægtheden. Foretræk den, når det er svært at garantere unikke noncer.

Nøgleafledning før kryptering

Brug aldrig en rå adgangskode som AES-nøgle. Afled en nøgle 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())

Ydelsesovervejelser

AES-NI-hardwareacceleration gør AES-GCM ekstremt hurtigt (~1-4 GB/s på moderne CPU'er). Python cryptography bruger OpenSSL, som udnytter AES-NI. Til filer på over 100 MB skal du bruge streaming i blokke med Cipher-API'et på lavt niveau.

Videnscheck

Hvad sker der, hvis den samme nonce bruges to gange med AES-GCM under den samme nøgle?

Opsummering af lektionen

AES-GCM tilbyder godkendt kryptering i én enkelt gennemgang. Brug en ny tilfældig nonce på 96 bit til hver kryptering. Sæt noncen foran chifferteksten ved opbevaring. AAD binder chifferteksten til konteksten. AES-GCM-SIV modstår forkert brug af noncer. Afled nøgler med HKDF, og brug aldrig rå adgangskoder.

Gratis at komme i gang

Lær Cryptology Academy med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
67
Lektioner
261

Ofte stillede spørgsmål

Er lektionen “AES-GCM: Kryptering og dekryptering i Python” gratis?

Ja — hele teksten til “AES-GCM: Kryptering og dekryptering i Python” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Cryptology Academy-kurset, skal du opgradere til CoddyKit PRO. Cryptology Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “AES-GCM: Kryptering og dekryptering i Python”?

Implementér autentificeret kryptering med korrekt håndtering af noncer. Du øver dig i Cryptology Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Cryptology Academy?

Der kræves ingen tidligere erfaring. Cryptology Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “AES-GCM: Kryptering og dekryptering i Python”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Cryptology Academy-lektion?

Ja. Alle Cryptology Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Oversigt over Python cryptography-biblioteket
  2. AES-GCM: Kryptering og dekryptering i Python
  3. RSA- og ECDSA-nøglepar i Python
  4. Almindelige Python-kryptografifejl og sikre mønstre
← Tilbage til Cryptology Academy