Szyfrowanie uwierzytelnione: AES-GCM i ChaCha20-Poly1305
Poznaj sposób, w jaki szyfry AEAD jednocześnie zapewniają poufność i integralność, oraz dowiedz się, dlaczego niewłaściwe użycie nonce w AES-GCM prowadzi do katastrofalnego odzyskania klucza.
Szyfrowanie uwierzytelnione: AES-GCM i ChaCha20-Poly1305 to bezpłatna lekcja Security+ 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 Security+ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Security+ Academy zawiera 4 lekcji w sumie.
Czym jest szyfrowanie uwierzytelnione
Szyfrowanie uwierzytelnione (Authenticated Encryption, AE) rozwiązuje podstawowy problem: tradycyjne szyfrowanie zapewnia wyłącznie poufność — utrzymuje dane w tajemnicy — ale nie weryfikuje, czy szyfrogram został zmodyfikowany. Atakujący może zmienić bity w szyfrogramie, a odbiorca odszyfruje bezwartościowe dane, nie wiedząc, że zostały zmienione. Szyfrowanie uwierzytelnione z powiązanymi danymi (Authenticated Encryption with Associated Data, AEAD) jednocześnie zapewnia integralność i autentyczność, generując zarówno zaszyfrowany szyfrogram, jak i znacznik uwierzytelniający, który wykrywa każdą modyfikację.
AES-GCM: tryb licznikowy i GMAC
AES-GCM (Galois/Counter Mode) łączy dwa komponenty: AES-CTR (Counter Mode) do szyfrowania oraz GMAC (Galois Message Authentication Code) do zapewniania integralności. AES-CTR generuje strumień klucza przez szyfrowanie wartości licznika i wykonanie operacji XOR z tekstem jawnym — dzięki temu szyfrowanie można zrównoleglić, w przeciwieństwie do trybu CBC. GMAC oblicza znacznik uwierzytelniający na podstawie szyfrogramu i wszelkich powiązanych danych. Powstały znacznik (128 bitów) jest przesyłany wraz z szyfrogramem; zmiana choćby jednego bitu unieważnia znacznik.
# AES-256-GCM encryption with openssl
openssl enc -aes-256-gcm -in plaintext.txt -out encrypted.bin \
-K $(openssl rand -hex 32) \
-iv $(openssl rand -hex 12)Nonce: krytyczny i podatny na błędy
AES-GCM wymaga nonce (liczby użytej tylko raz), zwykle o długości 96 bitów (12 bajtów). Nonce musi być unikalny dla każdej pojedynczej operacji szyfrowania z użyciem tego samego klucza — nie musi być tajny, ale nigdy nie może się powtórzyć. Ponowne użycie nonce w AES-GCM ma katastrofalne skutki: jeśli dwie wiadomości zostaną zaszyfrowane tym samym kluczem i nonce, atakujący może wykonać operację XOR na szyfrogramach, anulując strumień kluczowy i potencjalnie odzyskując oba teksty jawne. Ta luka jest czasami nazywana „niewłaściwym użyciem nonce” i doprowadziła do rzeczywistych ataków umożliwiających odzyskanie kluczy.
Wyjaśnienie ataku związanego z niewłaściwym użyciem nonce
Gdy wartości nonce AES-GCM są ponownie używane, atakujący może obliczyć C1 XOR C2 = P1 XOR P2 (XOR obu tekstów jawnych), ponieważ w obu przypadkach użyto tego samego strumienia kluczowego. Ponowne użycie nonce umożliwia także odzyskanie klucza uwierzytelniania H, co pozwala atakującemu fałszować prawidłowe tagi uwierzytelniania dla dowolnych wiadomości — całkowicie łamiąc zarówno poufność, jak i integralność. System Sony PS3 padł ofiarą dokładnie takiego ataku. Ochronę zapewniają losowe wartości nonce (generowane za pomocą CSPRNG) albo deterministyczny licznik, który nigdy się nie zeruje.
ChaCha20-Poly1305: alternatywa w postaci szyfru strumieniowego
ChaCha20-Poly1305 to drugi szyfr AEAD wymagany w TLS 1.3. ChaCha20 jest szyfrem strumieniowym zaprojektowanym przez Daniela Bernsteina, który generuje strumień kluczowy za pomocą operacji add-rotate-XOR (ARX) — bez tablic przeglądania, w całkowicie stałym czasie i z bardzo wysoką szybkością na procesorach bez sprzętowego przyspieszenia AES. Poly1305 to jednorazowy MAC (kod uwierzytelniania wiadomości), który oblicza tag uwierzytelniania na podstawie szyfrogramu. Razem zapewniają zabezpieczenia równoważne AES-GCM, ale są znacznie szybsze na urządzeniach mobilnych i IoT.
Dlaczego ChaCha20-Poly1305 na urządzeniach mobilnych?
Nowoczesne procesory x86 i ARM64 używane w komputerach stacjonarnych i serwerach zawierają instrukcje sprzętowe AES-NI, dzięki którym AES-GCM działa niezwykle szybko. Jednak wiele procesorów urządzeń mobilnych i IoT nie obsługuje AES-NI, przez co programowa implementacja AES-GCM jest stosunkowo wolna. ChaCha20-Poly1305 zaprojektowano z myślą o szybkim działaniu programowym z użyciem prostych operacji arytmetycznych, dzięki czemu urządzenia mobilne osiągają porównywalną wydajność bez sprzętowego przyspieszenia. Firma Google dodała ChaCha20-Poly1305 do TLS jako alternatywę właśnie dla urządzeń z Androidem, a obecnie jest to pełnoprawny zestaw szyfrów w TLS 1.3.
Dane powiązane: ochrona nagłówków
„AD” w AEAD oznacza Associated Data (dane powiązane) — metadane tekstu jawnego, które są uwierzytelniane, ale nie są szyfrowane. Umożliwia to uwierzytelnianie danych, które muszą pozostać czytelne (takich jak nagłówki pakietów lub pola typu rekordu), przy jednoczesnej ochronie przed modyfikacją. W TLS 1.3 bajty nagłówka rekordu są uwzględniane jako dane powiązane w obliczeniach AEAD. Jeśli atakujący zmodyfikuje nagłówek (np. zmieni długość rekordu), weryfikacja tagu uwierzytelniania zakończy się niepowodzeniem, a połączenie zostanie przerwane.
AEAD a Encrypt-Then-MAC
Zanim AEAD stał się standardem, kryptografowie zalecali rozwiązanie Encrypt-then-MAC (EtM): zaszyfrowanie tekstu jawnego, a następnie obliczenie kodu MAC na podstawie szyfrogramu. Jest to bezpieczne, ale wymaga dwóch oddzielnych operacji z użyciem dwóch oddzielnych kluczy. Schematy AEAD, takie jak AES-GCM, łączą obie operacje z użyciem jednego klucza, upraszczając implementację i eliminując całą klasę ataków typu padding oracle, które nękały MAC-then-Encrypt (MtE) — kolejność stosowaną w starszych wersjach TLS (CBC + HMAC). TLS 1.3 korzystający z AEAD całkowicie unika tych problemów.
AES-128-GCM a AES-256-GCM
Zarówno AES-128-GCM, jak i AES-256-GCM są zatwierdzone przez NIST i uznawane za bezpieczne wobec komputerów klasycznych. AES-128 zapewnia 128-bitowy poziom bezpieczeństwa i działa nieco szybciej; AES-256 zapewnia 256-bitowy poziom bezpieczeństwa, oferując większy margines bezpieczeństwa wobec przyszłej analizy kryptograficznej i zagrożeń kwantowych. W większości dzisiejszych zastosowań AES-128-GCM jest wystarczający, ale systemy rządowe przetwarzające informacje niejawne (NSA Suite B) wymagają AES-256. TLS 1.3 oferuje oba warianty, a serwery mogą ustalać ich priorytet na podstawie swojej polityki bezpieczeństwa.
Proces weryfikacji tagu uwierzytelniania
Podczas odszyfrowywania szyfrogramu AEAD odbiorca musi zweryfikować tag uwierzytelniania przed odszyfrowaniem. Proces wygląda następująco: ponownie obliczyć oczekiwany tag na podstawie otrzymanego szyfrogramu, klucza i nonce; porównać go z otrzymanym tagiem za pomocą funkcji porównującej działającej w stałym czasie; dopiero jeśli wartości są zgodne, przystąpić do odszyfrowywania. Porównanie w stałym czasie ma kluczowe znaczenie — jeśli zostanie przerwane przy pierwszym niezgodnym bajcie, atakujący może przeprowadzić atak z kanałem bocznym oparty na pomiarze czasu i fałszować prawidłowe tagi bajt po bajcie. Każda biblioteka AEAD, która stosuje porównanie kończące się przedwcześnie, jest podatna na atak.
Zastosowania AEAD w świecie rzeczywistym
Algorytmy AEAD są powszechnie stosowane we współczesnych systemach bezpieczeństwa: TLS 1.3 używa AES-GCM i ChaCha20-Poly1305 do szyfrowania wszystkich rekordów; VPN WireGuard korzysta wyłącznie z ChaCha20-Poly1305; protokół Signal używa go do szyfrowania wiadomości; protokół QUIC (będący podstawą HTTP/3) używa AES-GCM. Gdy widzą Państwo zestaw szyfrów taki jak TLS_AES_256_GCM_SHA384, SHA384 odnosi się do funkcji skrótu HKDF używanej do wyprowadzania kluczy, a nie do mechanizmu integralności — za integralność odpowiada tag GCM.
Szybki test
Sprawdź swoją znajomość zagadnień CompTIA Security+ (SY0-701) omówionych w tej lekcji.
Podsumowanie lekcji
W tej lekcji nauczyli się Państwo, że: algorytmy AEAD zapewniają jednocześnie poufność i integralność za pomocą tagu uwierzytelniania, który wykrywa każdą modyfikację szyfrogramu; ponowne użycie nonce AES-GCM ma katastrofalne skutki — umożliwia odzyskanie strumienia kluczowego i sfałszowanie klucza uwierzytelniania — dlatego nonce musi być unikalny dla każdego szyfrowania; a ChaCha20-Poly1305 jest wydajną alternatywą dla AES-GCM na urządzeniach pozbawionych sprzętowego przyspieszenia AES. W następnej części omówimy funkcje wyprowadzania klucza służące do zabezpieczania haseł.
Często zadawane pytania
Czy lekcja „Szyfrowanie uwierzytelnione: AES-GCM i ChaCha20-Poly1305” jest bezpłatna?
Tak — pełny tekst „Szyfrowanie uwierzytelnione: AES-GCM i ChaCha20-Poly1305” 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 Security+ Academy, przejdź na CoddyKit PRO. Kurs Security+ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Szyfrowanie uwierzytelnione: AES-GCM i ChaCha20-Poly1305”?
Poznaj sposób, w jaki szyfry AEAD jednocześnie zapewniają poufność i integralność, oraz dowiedz się, dlaczego niewłaściwe użycie nonce w AES-GCM prowadzi do katastrofalnego odzyskania klucza. Ćwiczysz Security+ 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ąć Security+ Academy?
Nie wymagamy żadnego doświadczenia. Security+ 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 uwierzytelnione: AES-GCM i ChaCha20-Poly1305”?
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 Security+ Academy?
Tak. Każda lekcja Security+ 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
- Uzgadnianie TLS 1.3 i wznowienie 0-RTT
- Szyfrowanie uwierzytelnione: AES-GCM i ChaCha20-Poly1305
- Funkcje wyprowadzania klucza: PBKDF2, bcrypt i Argon2
- Kryptografia postkwantowa: CRYSTALS-Kyber i Dilithium