Cryptology Academy · Lekcja

Szyfrowanie i odszyfrowywanie AES-GCM w Pythonie

Zaimplementować szyfrowanie uwierzytelnione z prawidłowym zarządzaniem nonce’ami

Lekcja 2 z 413 kroki

Szyfrowanie i odszyfrowywanie AES-GCM w Pythonie to bezpłatna lekcja Cryptology Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cryptology Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cryptology Academy zawiera 4 lekcji w sumie.

Dlaczego AES-GCM?

AES-GCM to schemat uwierzytelnionego szyfrowania z powiązanymi danymi (Authenticated Encryption with Associated Data, AEAD). Zapewnia poufność (AES-CTR) oraz integralność i autentyczność (MAC GHASH) w jednym przebiegu — jest standardem nowoczesnego szyfrowania.

Elementy GCM: CTR + GHASH

AES-GCM = AES w trybie licznika (szyfrowanie) + wielomianowy MAC GHASH (uwierzytelnianie). 128-bitowy znacznik uwierzytelniający obejmuje zarówno szyfrogram, jak i opcjonalne dodatkowe uwierzytelniane dane (AAD).

Wymagania dotyczące nonce

96-bitowego nonce nie wolno nigdy używać ponownie z tym samym kluczem. Ponowne użycie nonce całkowicie łamie GCM — atakujący odzyskuje klucz uwierzytelniania i może fałszować szyfrogramy. Używaj losowych nonce albo licznika połączonego z rotacją kluczy.

Szyfrowanie za pomocą AES-GCM w Pythonie

Przy użyciu warstwy 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())

Deszyfrowanie za pomocą AES-GCM w Pythonie

Deszyfrowanie automatycznie weryfikuje znacznik; w przypadku niepowodzenia zgłasza InvalidTag:

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

Przechowywanie nonce i szyfrogramu

Przed przechowywaniem dołącz nonce na początku szyfrogramu. Podczas deszyfrowania rozdziel dane na pozycji 12. bajtu:

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)

Dodatkowe uwierzytelniane dane (AAD)

AAD jest uwierzytelniane, ale nie jest szyfrowane. Używaj go do powiązania szyfrogramu z kontekstem: identyfikatorem użytkownika, identyfikatorem rekordu lub wersją API. Uniemożliwia to atakującemu przeniesienie prawidłowego szyfrogramu do innego kontekstu.

Używanie niskopoziomowego interfejsu Cipher

W przypadku szyfrowania strumieniowego lub szyfrowania w miejscu używaj bezpośrednio interfejsu Cipher z trybem 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())

Odporność na niewłaściwe użycie nonce: AES-GCM-SIV

AES-GCM-SIV (RFC 8452) jest odporny na niewłaściwe użycie nonce: ponowne użycie nonce ujawnia, że dwa teksty jawne są identyczne, ale NIE łamie autentyczności. Preferuj ten tryb, gdy trudno zagwarantować unikatowość nonce.

Wyprowadzanie klucza przed szyfrowaniem

Nigdy nie używaj surowego hasła jako klucza AES. Wyprowadź klucz za pomocą Argon2 lub 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())

Kwestie wydajności

Sprzętowa akceleracja AES-NI sprawia, że AES-GCM działa niezwykle szybko (około 1–4 GB/s na współczesnych procesorach). Python cryptography korzysta z OpenSSL, który wykorzystuje AES-NI. W przypadku plików większych niż 100 MB używaj strumieniowego przetwarzania fragmentami za pomocą niskopoziomowego interfejsu Cipher.

Sprawdzenie wiedzy

Co się stanie, jeśli ten sam nonce zostanie użyty dwukrotnie z AES-GCM i tym samym kluczem?

Podsumowanie lekcji

AES-GCM zapewnia uwierzytelnione szyfrowanie w jednym przebiegu. Przy każdym szyfrowaniu używaj nowego, losowego nonce o długości 96 bitów. Przed przechowywaniem dołącz nonce do szyfrogramu. AAD wiąże szyfrogram z kontekstem. AES-GCM-SIV jest odporny na niewłaściwe użycie nonce. Wyprowadzaj klucze za pomocą HKDF i nigdy nie używaj surowych haseł.

Bezpłatny start

Ucz się Cryptology Academy dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
67
Lekcje
261

Często zadawane pytania

Czy lekcja „Szyfrowanie i odszyfrowywanie AES-GCM w Pythonie” jest bezpłatna?

Tak — pełny tekst „Szyfrowanie i odszyfrowywanie AES-GCM w Pythonie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cryptology Academy, przejdź na CoddyKit PRO. Kurs Cryptology Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Szyfrowanie i odszyfrowywanie AES-GCM w Pythonie”?

Zaimplementować szyfrowanie uwierzytelnione z prawidłowym zarządzaniem nonce’ami Ćwiczysz Cryptology Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Cryptology Academy?

Nie wymagamy żadnego doświadczenia. Cryptology Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Szyfrowanie i odszyfrowywanie AES-GCM w Pythonie”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Cryptology Academy?

Tak. Każda lekcja Cryptology Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Przegląd biblioteki cryptography dla języka Python
  2. Szyfrowanie i odszyfrowywanie AES-GCM w Pythonie
  3. Pary kluczy RSA i ECDSA w Pythonie
  4. Typowe pułapki kryptograficzne w Pythonie i bezpieczne wzorce
← Powrót do Cryptology Academy