AES: co to jest, algorytm szyfrowania symetrycznego i gdzie jest stosowany

Autor: IT Sectr Opublikowano: 2026-04-02 Czas czytania: 9 min

AES (Advanced Encryption Standard) — to symetryczny blokowy algorytm szyfrowania, przyjęty w 2001 roku przez Narodowy Instytut Standardów i Technologii USA (NIST) jako oficjalny standard. AES zastąpił przestarzały DES i od tego czasu stał się najpopularniejszym algorytmem szyfrowania na świecie, stosowanym od systemów bankowych po aplikacje mobilne. Według danych NIST (2023), AES zapewnia odporność równoważną 2^256 operacjom dla klucza o długości 256 bitów, co czyni go niepodatnym na współczesne ataki brute force. NIST FIPS 197, 2023

Najważniejsze

  • AES — symetryczny blokowy szyfr o stałym rozmiarze bloku 128 bitów i kluczach 128, 192 lub 256 bitów.
  • Tryb GCM — zalecany tryb pracy AES dla aplikacji mobilnych, zapewniający uwierzytelnione szyfrowanie.
  • AES-256 — wersja z maksymalnym poziomem odporności, zalecana do ochrony danych o wysokiej wrażliwości.
  • Przyspieszenie sprzętowe — instrukcje AES-NI procesora pozwalają wykonywać szyfrowanie z prędkością do 10 GB/s na nowoczesnych urządzeniach.
  • Android i iOS udostępniają wbudowane API dla AES: Android Keystore i iOS CryptoKit z obsługą przyspieszenia sprzętowego.

Co to jest AES?

AES (Advanced Encryption Standard) — to symetryczny blokowy szyfr opracowany przez belgijskich kryptografów Joana Daemena i Vincenta Rijmena pod nazwą Rijndael. W 2001 roku NIST wybrał Rijndaela jako zwycięzcę konkursu na nowy standard szyfrowania USA po pięciu latach otwartych testów i analiz. AES działa na blokach danych o stałym rozmiarze (128 bitów) i obsługuje trzy długości klucza: 128, 192 i 256 bitów. Liczba rund transformacji zależy od długości klucza: 10 rund dla 128-bitowego, 12 dla 192-bitowego i 14 dla 256-bitowego klucza. Każda runda obejmuje cztery operacje: SubBytes (nieliniowa zamiana bajtów przez S-box), ShiftRows (cykliczne przesunięcie wierszy), MixColumns (mieszanie kolumn) i AddRoundKey (nałożenie klucza rundy).

Historia standardu AES

Opracowanie AES rozpoczęło się w 1997 roku, kiedy NIST ogłosił konkurs na zastąpienie DES, którego 56-bitowy klucz został złamany w 22 godziny w 1998 roku na specjalistycznym urządzeniu Deep Crack. W konkursie wzięło udział 15 algorytmów z różnych krajów, w tym Serpent (Wielka Brytania), Twofish (USA) i RC6 (USA). Do finału w 1999 roku pozostało 5 kandydatów. Rijndael zwyciężył dzięki kombinacji wysokiej prędkości na wszystkich platformach (od 8-bitowych mikrokontrolerów po 64-bitowe serwery), odporności na kryptoanalizę i kompaktowej implementacji w sprzęcie. Od 2006 roku AES jest używany do szyfrowania danych oznaczonych klauzulą SECRET i TOP SECRET w systemach rządowych USA. Obecnie AES jest wbudowany we wszystkie główne protokoły: TLS 1.2/1.3, IPsec, SSH, Wi-Fi WPA2/WPA3 i Bluetooth BR/EDR.

Jak działa szyfrowanie AES

AES przetwarza dane blokami po 128 bitów (16 bajtów), zorganizowanymi w macierz 4x4 bajtów, zwaną state. Każda runda szyfrowania wykonuje sekwencję deterministycznych przekształceń, które łącznie tworzą efekt „lawiny”: zmiana jednego bitu danych wejściowych zmienia około 50% bitów danych wyjściowych. Taki efekt czyni AES odpornym na kryptoanalizę różnicową i liniową — główne metody łamania szyfrów blokowych.

Proces rozpoczyna się od AddRoundKey — nałożenia początkowego klucza na state przez operację XOR. Następnie wykonywane są rundy: SubBytes zastępuje każdy bajt state wartością z S-box (tabeli zamiany). ShiftRows cyklicznie przesuwa drugi wiersz o 1 pozycję, trzeci o 2, czwarty o 3 — zapewnia to mieszanie między kolumnami. MixColumns mnoży każdą kolumnę state przez stałą macierz w ciele Galois GF(2^8), tworząc zależność każdego bajtu wyjściowego od wszystkich czterech wejściowych bajtów kolumny. AddRoundKey nakłada kolejny klucz rundy, uzyskany z klucza początkowego przez procedurę Key Expansion. Ostatnia runda różni się brakiem operacji MixColumns. Deszyfrowanie używa operacji odwrotnych InvSubBytes, InvShiftRows, InvMixColumns i AddRoundKey w odwrotnej kolejności. Dla programistów mobilnych zrozumienie wewnętrznej struktury AES nie jest wymagane — wystarczy wiedzieć, jak poprawnie wywoływać wbudowane API platformy z odpowiednimi parametrami.

Efekt lawiny i odporność kryptograficzna AES

Kluczową cechą AES zapewniającą jego odporność kryptograficzną jest efekt lawiny (avalanche effect). Zmiana jednego bitu w tekście jawnym lub kluczu prowadzi do zmiany około 50% bitów szyfrogramu, co czyni AES niezwykle odpornym na kryptoanalizę różnicową i liniową. Połączenie operacji SubBytes (nieliniowość przez S-box) i MixColumns (dyfuzja przez mnożenie w ciele Galois) tworzy matematyczną złożoność, przy której nawet znajomość części szyfrogramu nie pozwala odzyskać klucza szybciej niż przez pełny przegląd. Według analizy NIST (2018), najlepszy znany atak na AES-128 — biclique attack — skraca efektywną długość klucza zaledwie o 2 bity (do 126.2 bitów), co nie daje praktycznej przewagi atakującemu. Dla AES-256 nie istnieje ani jeden praktycznie wykonalny atak przewyższający pełny przegląd.

Rozmiary kluczy AES i poziomy bezpieczeństwa

AES obsługuje trzy rozmiary klucza, z których każdy odpowiada określonemu poziomowi odporności kryptograficznej. Wybór rozmiaru klucza wpływa na bezpieczeństwo, wydajność i wymagania dotyczące zasobów urządzenia.

Rozmiar kluczaLiczba rundPoziom bezpieczeństwaZastosowanie
AES-12810128 bitówAplikacje komercyjne, TLS
AES-19212192 bitySystemy rządowe (SECRET)
AES-25614256 bitówTOP SECRET, sektor finansowy

Praktyczna zasada: w aplikacjach mobilnych używaj domyślnie AES-256. Różnica w wydajności między AES-128 a AES-256 na nowoczesnych urządzeniach z obsługą AES-NI wynosi nie więcej niż 10–15%, ale poziom bezpieczeństwa podwaja się. Według analizy kwantowej (Grassl et al., 2016), do złamania AES-128 potrzeba 2^77 operacji kwantowych przez algorytm Grovera, a dla AES-256 — 2^149, co czyni AES-256 odpornym na ataki kwantowe przez najbliższe 20–30 lat. Nawet AES-128 zapewnia wystarczającą ochronę dla zdecydowanej większości scenariuszy komercyjnych: do pełnego przeglądu 128-bitowego klucza potrzeba więcej energii, niż istnieje we Wszechświecie według szacunków Bruce’a Schneiera. Jednak standardy bezpieczeństwa (GDPR, HIPAA, PCI DSS) często wyraźnie wymagają AES-256, dlatego w projektach produkcyjnych zaleca się używanie maksymalnej długości klucza.

Tryby pracy AES

AES jako szyfr blokowy szyfruje bloki o stałym rozmiarze (128 bitów). Do szyfrowania danych o dowolnej długości używa się trybów pracy (modes of operation). Wybór trybu krytycznie wpływa na bezpieczeństwo: nieprawidłowy tryb może zniweczyć odporność AES.

  • ECB (Electronic Codebook) — najprostszy i najbardziej niebezpieczny tryb. Każdy blok jest szyfrowany niezależnie tym samym kluczem. Identyczne bloki tekstu jawnego dają identyczne bloki szyfrogramu, co pozwala odtworzyć strukturę danych. Zakazany do użycia we wszystkich nowoczesnych standardach bezpieczeństwa. NIGDY nie używaj ECB w aplikacjach mobilnych.
  • CBC (Cipher Block Chaining) — każdy poprzedni blok szyfrogramu jest używany jako wektor inicjujący (IV) dla następnego. Wymaga losowego IV dla każdej wiadomości. Podatny na ataki padding oracle przy nieprawidłowej implementacji. Nadaje się do szyfrowania plików, ale wymaga MAC (HMAC) do zapewnienia integralności danych.
  • GCM (Galois/Counter Mode) — zalecany tryb dla aplikacji mobilnych. Zapewnia uwierzytelnione szyfrowanie (AEAD): szyfrowanie + sprawdzanie integralności w jednej operacji. Używa licznika do generowania strumienia klucza i mnożenia w ciele Galois do uwierzytelniania. GCM wymaga unikalnego nonce (12 bajtów) dla każdej wiadomości. Zalecany przez NIST, stosowany w TLS 1.2/1.3 i Android Keystore.
  • CCM (Counter with CBC-MAC) — alternatywny tryb AEAD oparty na CTR + CBC-MAC. Wolniejszy niż GCM i nie obsługuje przetwarzania równoległego. Stosowany w protokołach ZigBee i 802.11 (Wi-Fi). W aplikacjach mobilnych preferowany jest GCM.

W projektach mobilnych używaj AES-256-GCM z nonce o długości 12 bajtów. GCM rozwiązuje dwa problemy jednocześnie: szyfrowanie danych i sprawdzanie autentyczności, co zapobiega atakom typu padding oracle i chosen ciphertext. Android Keystore i iOS CryptoKit obsługują AES-GCM od razu po wyjęciu z pudełka bez konieczności implementacji dodatkowych prymitywów kryptograficznych. Podczas pracy z GCM ważne jest, aby nigdy nie powtarzać nonce z tym samym kluczem — całkowicie niszczy to bezpieczeństwo szyfrowania. Generuj nowy losowy nonce dla każdego szyfrowania i przechowuj go razem z szyfrogramem.

Implementacja AES w aplikacjach mobilnych

Rozważmy przykład bezpiecznej implementacji AES-256-GCM na Androidzie z użyciem Jetpack Security. Poniższy kod demonstruje pełny cykl: utworzenie klucza AES-256 przez MasterKey, szyfrowanie i deszyfrowanie ciągu znaków z dodatkowymi uwierzytelnionymi danymi (AAD).

kotlin
import androidx.security.crypto.MasterKey
import androidx.security.crypto.EncryptedSharedPreferences

val masterKey = MasterKey.Builder(context)
    .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
    .build()

val securePrefs = EncryptedSharedPreferences.create(
    context,
    "secure_prefs",
    masterKey,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)

fun storeSecureData(key: String, value: String) {
    securePrefs.edit().putString(key, value).apply()
}

fun readSecureData(key: String): String? {
    return securePrefs.getString(key, null)
}

Kluczową cechą tego rozwiązania jest AES-256-GCM używany na dwóch poziomach: do szyfrowania par klucz-wartość (PrefValueEncryptionScheme) i do ochrony samych nazw kluczy (PrefKeyEncryptionScheme używa AES-256-SIV, odpornego na powtarzanie nonce). MasterKey jest generowany z użyciem algorytmu AES-256-GCM i przechowywany w Android Keystore, zabezpieczonym sprzętowo na urządzeniach z Trusted Execution Environment. Na urządzeniach bez obsługi sprzętowej (TEE) klucz jest szyfrowany przez Bouncy Castle, co i tak jest bezpieczniejsze niż przechowywanie w SharedPreferences.

Do bezpośredniego szyfrowania dużych ilości danych (np. obrazów lub plików) używaj AES-256-GCM przez EncryptedFile z AndroidX Security. Do eksportu kluczy (np. do tworzenia kopii zapasowej) użyj dodatkowego szyfrowania z hasłem użytkownika przez PBKDF2 z 100000+ iteracjami.

AES na iOS przez CryptoKit

W iOS praca z AES jest zorganizowana przez framework CryptoKit (Swift 5.0+). Klucz AES-256 jest tworzony przez SymmetricKey(size: .bits256) i przechowywany w Secure Enclave — sprzętowym kryptoprocesorze odizolowanym od głównego CPU i systemu operacyjnego. CryptoKit udostępnia dwie implementacje AES: AES.GCM (zalecany) i AES.CBC (dla zgodności wstecznej z przestarzałymi formatami). Szyfrowanie odbywa się przez metodę seal(), która przyjmuje dane, klucz i nonce (12 bajtów), a zwraca AES.GCM.SealedBox — strukturę zawierającą szyfrogram i tag uwierzytelnienia. Deszyfrowanie — przez open(). Apple stanowczo nie zaleca bezpośredniego używania CommonCrypto: CryptoKit automatycznie wybiera optymalne parametry, chroni przed atakami side-channel i używa sprzętowego przyspieszenia AES-NI na procesorach Apple Silicon. Na urządzeniach z Secure Enclave klucze nigdy nie opuszczają modułu sprzętowego, co uniemożliwia ich kradzież nawet przy całkowitej kompromitacji aplikacji. Do serializacji klucza używana jest metoda withUnsafeBytes z następnym zapisem w Keychain przez SecItemAdd z atrybutem kSecAttrAccessible = kSecAttrAccessibleWhenUnlockedThisDeviceOnly.

Często zadawane pytania

Co to jest AES prostymi słowami?

AES to algorytm, który zamienia czytelne dane w nieczytelny zbiór bajtów za pomocą tajnego klucza. Ten sam klucz jest potrzebny, aby przywrócić dane do pierwotnej postaci. AES jest tak niezawodny, że jest używany do szyfrowania tajnych dokumentów rządu USA.

Czym różni się AES-128 od AES-256?

AES-128 używa klucza o długości 128 bitów i wykonuje 10 rund szyfrowania. AES-256 używa 256-bitowego klucza i 14 rund, co czyni go 2^128 razy trudniejszym do złamania. W aplikacjach mobilnych zaleca się AES-256 ze względu na minimalną różnicę w wydajności.

Który tryb AES jest najbezpieczniejszy?

AES-256-GCM — najbezpieczniejszy i zalecany tryb. GCM zapewnia uwierzytelnione szyfrowanie (szyfrowanie + sprawdzanie integralności). Tryb ECB jest zabroniony, CBC wymaga osobnego MAC. GCM jest standardem de facto w aplikacjach mobilnych.

Czy można złamać AES?

Teoretycznie AES może być złamany przez pełny przegląd, ale dla AES-256 potrzeba 2^256 prób — więcej niż atomów w obserwowalnym Wszechświecie. Praktyczne ataki na AES-256 nie istnieją. Ataki side-channel (Spectre, Meltdown) nie łamią AES, ale kradną klucze z pamięci, dlatego sprzętowe przechowywanie kluczy jest krytycznie ważne.

Jak używać AES w aplikacji mobilnej na Androidzie?

Użyj biblioteki AndroidX Security: MasterKey.Builder z KeyScheme.AES256_GCM tworzy zabezpieczony klucz w Android Keystore, a EncryptedSharedPreferences automatycznie szyfruje wszystkie dane przez AES-256-GCM. Żadnej ręcznej kryptografii — API jest bezpieczne domyślnie, bez ryzyka błędów programisty.

Podsumowanie

  • AES — najpopularniejszy i sprawdzony symetryczny algorytm szyfrowania, standaryzowany przez NIST w 2001 roku.
  • AES-256 zapewnia maksymalny poziom odporności z zapasem na ataki kwantowe najbliższych 20–30 lat.
  • Tryb GCM — jedyny zalecany tryb dla aplikacji mobilnych: szyfrowanie + uwierzytelnianie w jednej operacji.
  • Android Keystore i iOS Secure Enclave — sprzętowe magazyny izolujące klucze AES od aplikacji.
  • Jetpack Security (Android) i CryptoKit (iOS) udostępniają bezpieczne implementacje AES-256-GCM bez ręcznej kryptografii.
  • Nonce (IV) dla GCM musi być unikalny dla każdego szyfrowania — powtórzenie całkowicie niszczy bezpieczeństwo.
  • Zalecenie: używaj AES-256-GCM przez EncryptedSharedPreferences na Androidzie i CryptoKit na iOS dla wszystkich poufnych danych.

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również