AES-GCM: Kryptering og dekryptering i Python
Implementér autentificeret kryptering med korrekt håndtering af noncer.
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.
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
- Oversigt over Python cryptography-biblioteket
- AES-GCM: Kryptering og dekryptering i Python
- RSA- og ECDSA-nøglepar i Python
- Almindelige Python-kryptografifejl og sikre mønstre