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 (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).
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.
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.
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.
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 klucza | Liczba rund | Poziom bezpieczeństwa | Zastosowanie |
|---|---|---|---|
| AES-128 | 10 | 128 bitów | Aplikacje komercyjne, TLS |
| AES-192 | 12 | 192 bity | Systemy rządowe (SECRET) |
| AES-256 | 14 | 256 bitów | TOP 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.
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.
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.
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).
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.
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
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.
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.
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.
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.
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
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.
Przeczytaj również