AES (Advanced Encryption Standard) — är en symmetrisk blockkrypteringsalgoritm som antogs 2001 av USA:s nationella institut för standarder och teknik (NIST) som officiell standard. AES ersatte den föråldrade DES och har sedan dess blivit den mest utbredda krypteringsalgoritmen i världen, som används från banksystem till mobila applikationer. Enligt NIST-data (2023) ger AES ett motstånd som motsvarar 2^256 operationer för en nyckel på 256 bitar, vilket gör den oskadlig för moderna brute force-attacker. NIST FIPS 197, 2023
Huvudpunkter
AES (Advanced Encryption Standard) — är en symmetrisk blockkrypto utvecklad av de belgiska kryptograferna Joan Daemen och Vincent Rijmen under namnet Rijndael. År 2001 valde NIST Rijndael som vinnare av tävlingen om den nya amerikanska krypteringsstandarden efter fem års öppen testning och analys. AES arbetar med datablock av fast storlek (128 bitar) och stödjer tre nyckellängder: 128, 192 och 256 bitar. Antalet transformationsrundor beror på nyckellängden: 10 rundor för 128-bitars, 12 för 192-bitars och 14 för 256-bitars nyckel. Varje runda omfattar fyra operationer: SubBytes (olinjär bytesubstitution genom S-box), ShiftRows (cyklisk förskjutning av rader), MixColumns (blandning av kolumner) och AddRoundKey (applicering av rundnyckel).
Utvecklingen av AES började 1997 när NIST utlyste en tävling för att ersätta DES, vars 56-bitarsnyckel knäcktes på 22 timmar 1998 på den specialiserade enheten Deep Crack. 15 algoritmer från olika länder deltog i tävlingen, inklusive Serpent (Storbritannien), Twofish (USA) och RC6 (USA). Till finalen 1999 återstod 5 kandidater. Rijndael vann tack vare en kombination av hög hastighet på alla plattformar (från 8-bitars mikrokontrollers till 64-bitars servrar), motståndskraft mot kryptoanalys och kompakt implementering i hårdvara. Sedan 2006 har AES använts för att kryptera data med klassificeringen SECRET och TOP SECRET i amerikanska statliga system. Idag är AES inbyggd i alla större protokoll: TLS 1.2/1.3, IPsec, SSH, Wi-Fi WPA2/WPA3 och Bluetooth BR/EDR.
AES bearbetar data i block om 128 bitar (16 byte), organiserade i en 4x4 byte-matris som kallas state. Varje krypteringsrunda utför en serie deterministiska transformationer som tillsammans skapar en „lavineffekt“: ändring av en bit i indata ändrar cirka 50 % av bitarna i utdata. En sådan effekt gör AES motståndskraftig mot differentiell och linjär kryptoanalys — de viktigaste metoderna för att knäcka blockkrypton.
Processen börjar med AddRoundKey — applicering av den initiala nyckeln på state genom XOR-operation. Därefter utförs rundorna: SubBytes ersätter varje byte i state med värdet från S-box (ersättningstabell). ShiftRows förskjuter cykliskt andra raden med 1 position, tredje med 2, fjärde med 3 — detta säkerställer blandning mellan kolumner. MixColumns multiplicerar varje kolumn i state med en fast matris i Galoisfältet GF(2^8), vilket skapar beroende av varje utdatabyte på alla fyra indatabyte i kolumnen. AddRoundKey applicerar nästa rundnyckel, som erhålls från den initiala nyckeln genom Key Expansion-proceduren. Den sista rundan skiljer sig genom avsaknaden av MixColumns-operationen. Dekryptering använder de inversa operationerna InvSubBytes, InvShiftRows, InvMixColumns och AddRoundKey i omvänd ordning. För mobila utvecklare krävs inte förståelse av AES inre struktur — det räcker att veta hur man korrekt anropar plattformens inbyggda API:er med rätt parametrar.
Den viktigaste egenskapen hos AES som säkerställer dess kryptografiska motståndskraft är lavineffekten (avalanche effect). Ändring av en bit i klartexten eller nyckeln leder till ändring av cirka 50 % av bitarna i chiffertexten, vilket gör AES extremt motståndskraftig mot differentiell och linjär kryptoanalys. Kombinationen av SubBytes (olinjäritet genom S-box) och MixColumns (diffusion genom multiplikation i Galoisfältet) skapar en matematisk komplexitet där även kännedom om en del av chiffertexten inte tillåter återställning av nyckeln snabbare än fullständig sökning. Enligt NIST-analys (2018) minskar den bästa kända attacken mot AES-128 — biclique attack — den effektiva nyckellängden med endast 2 bitar (till 126,2 bitar), vilket inte ger angriparen någon praktisk fördel. För AES-256 finns det ingen praktiskt genomförbar attack som överträffar fullständig sökning.
AES stödjer tre nyckelstorlekar, som var och en motsvarar en viss nivå av kryptografisk motståndskraft. Valet av nyckelstorlek påverkar säkerheten, prestandan och kraven på enhetens resurser.
| Nyckelstorlek | Antal rundor | Säkerhetsnivå | Användning |
|---|---|---|---|
| AES-128 | 10 | 128 bitar | Kommersiella applikationer, TLS |
| AES-192 | 12 | 192 bitar | Statliga system (SECRET) |
| AES-256 | 14 | 256 bitar | TOP SECRET, finanssektorn |
Praktisk regel: i mobila applikationer använd AES-256 som standard. Prestandaskillnaden mellan AES-128 och AES-256 på moderna enheter med AES-NI-stöd överstiger inte 10–15 %, men säkerhetsnivån fördubblas. Enligt kvantanalys (Grassl et al., 2016) krävs 2^77 kvantoperationer genom Grovers algoritm för att knäcka AES-128, och för AES-256 — 2^149, vilket gör AES-256 motståndskraftig mot kvantattacker under de kommande 20–30 åren. Även AES-128 ger tillräckligt skydd för de allra flesta kommersiella scenarier: för fullständig sökning av en 128-bitars nyckel krävs mer energi än vad som finns i universum enligt Bruce Schneiers uppskattning. Säkerhetsstandarder (GDPR, HIPAA, PCI DSS) kräver dock ofta uttryckligen AES-256, därför rekommenderas att använda maximal nyckellängd i produktionsprojekt.
AES som blockkrypto krypterar block av fast storlek (128 bitar). För att kryptera data av godtycklig längd används driftlägen (modes of operation). Valet av läge påverkar säkerheten kritiskt: ett felaktigt läge kan upphäva AES motståndskraft.
För mobila projekt, använd AES-256-GCM med nonce på 12 byte. GCM löser två problem samtidigt: datakryptering och autenticitetsverifiering, vilket förhindrar padding oracle- och chosen ciphertext-attacker. Android Keystore och iOS CryptoKit stödjer AES-GCM direkt utan att ytterligare kryptografiska primitiver behöver implementeras. När du arbetar med GCM är det viktigt att aldrig upprepa nonce med samma nyckel — detta förstör helt krypteringssäkerheten. Generera en ny slumpmässig nonce för varje kryptering och spara den tillsammans med chiffertexten.
Låt oss titta på ett exempel på säker implementering av AES-256-GCM på Android med Jetpack Security. Koden nedan visar hela cykeln: skapande av AES-256-nyckel via MasterKey, kryptering och dekryptering av en sträng med ytterligare autentiserade data (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)
}
Den viktigaste egenskapen hos denna lösning är användningen av AES-256-GCM på två nivåer: för att kryptera nyckel-värdepar (PrefValueEncryptionScheme) och för att skydda själva nyckelnamnen (PrefKeyEncryptionScheme använder AES-256-SIV, som är resistent mot nonce-upprepning). MasterKey genereras med AES-256-GCM-algoritmen och lagras i Android Keystore, som är hårdvaruskyddat på enheter med Trusted Execution Environment. På enheter utan hårdvarustöd (TEE) krypteras nyckeln via Bouncy Castle, vilket fortfarande är säkrare än lagring i SharedPreferences.
För direkt kryptering av stora datamängder (t.ex. bilder eller filer) använd AES-256-GCM via EncryptedFile från AndroidX Security. För export av nycklar (t.ex. för säkerhetskopiering) använd ytterligare kryptering med användarens lösenord via PBKDF2 med 100000+ iterationer.
På iOS är arbetet med AES organiserat via ramverket CryptoKit (Swift 5.0+). AES-256-nyckeln skapas via SymmetricKey(size: .bits256) och lagras i Secure Enclave — en hårdvarukryptoprocessor isolerad från huvud-CPU och operativsystem. CryptoKit tillhandahåller två AES-implementeringar: AES.GCM (rekommenderad) och AES.CBC (för bakåtkompatibilitet med föråldrade format). Kryptering utförs via metoden seal(), som tar emot data, nyckel och nonce (12 byte) och returnerar en AES.GCM.SealedBox — en struktur som innehåller chiffertext och autentiseringstagg. Dekryptering — via open(). Apple rekommenderar starkt att inte använda CommonCrypto direkt: CryptoKit väljer automatiskt optimala parametrar, skyddar mot side-channel-attacker och använder hårdvaruacceleration AES-NI på Apple Silicon-processorer. På enheter med Secure Enclave lämnar nycklarna aldrig hårdvarumodulen, vilket omöjliggör stöld även vid fullständig kompromettering av applikationen. För serialisering av nyckeln används metoden withUnsafeBytes med efterföljande lagring i Keychain via SecItemAdd med attributet kSecAttrAccessible = kSecAttrAccessibleWhenUnlockedThisDeviceOnly.
Vanliga frågor
AES är en algoritm som omvandlar läsbar data till en oläsbar uppsättning byte med hjälp av en hemlig nyckel. Samma nyckel behövs för att återställa data till sin ursprungliga form. AES är så pålitlig att den används för att kryptera hemliga dokument från USA:s regering.
AES-128 använder en 128-bitars nyckel och utför 10 krypteringsrundor. AES-256 använder en 256-bitars nyckel och 14 rundor, vilket gör den 2^128 gånger svårare att knäcka. För mobila applikationer rekommenderas AES-256 på grund av den minimala prestandaskillnaden.
AES-256-GCM — det säkraste och rekommenderade läget. GCM ger autentiserad kryptering (kryptering + integritetskontroll). ECB-läget är förbjudet, CBC kräver separat MAC. GCM är de facto-standarden för mobila applikationer.
Teoretiskt kan AES knäckas genom fullständig sökning, men för AES-256 krävs 2^256 försök — fler än atomer i det observerbara universum. Praktiska attacker mot AES-256 finns inte. Side-channel-attacker (Spectre, Meltdown) knäcker inte AES utan stjäl nycklar från minnet, därför är hårdvarulagring av nycklar kritiskt viktig.
Använd biblioteket AndroidX Security: MasterKey.Builder med KeyScheme.AES256_GCM skapar en skyddad nyckel i Android Keystore, och EncryptedSharedPreferences krypterar automatiskt alla data via AES-256-GCM. Ingen manuell kryptografi — API:et är säkert som standard, utan risk för utvecklarfel.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också