AES (Advanced Encryption Standard) — е симетричен блоков алгоритъм за криптиране, приет през 2001 г. от Националния институт за стандарти и технологии на САЩ (NIST) като официален стандарт. AES замени остарелия DES и оттогава се превърна в най-разпространения алгоритъм за криптиране в света, използван от банкови системи до мобилни приложения. Според данни на NIST (2023), AES осигурява устойчивост, еквивалентна на 2^256 операции за ключ с дължина 256 бита, което го прави неуязвим за съвременните атаки с груба сила. NIST FIPS 197, 2023
Основни точки
AES (Advanced Encryption Standard) — е симетричен блоков шифър, разработен от белгийските криптографи Joan Daemen и Vincent Rijmen под името Rijndael. През 2001 г. NIST избра Rijndael за победител в конкурса за нов стандарт за криптиране на САЩ след пет години отворено тестване и анализ. AES работи с блокове данни с фиксиран размер (128 бита) и поддържа три дължини на ключа: 128, 192 и 256 бита. Броят на трансформационните кръгове зависи от дължината на ключа: 10 кръга за 128-битов, 12 за 192-битов и 14 за 256-битов ключ. Всеки кръг включва четири операции: SubBytes (нелинейна замяна на байтове чрез S-box), ShiftRows (циклично изместване на редове), MixColumns (разбъркване на колони) и AddRoundKey (налагане на кръгов ключ).
Разработката на AES започва през 1997 г., когато NIST обявява конкурс за замяна на DES, чийто 56-битов ключ е разбит за 22 часа през 1998 г. на специализираното устройство Deep Crack. В конкурса участват 15 алгоритъма от различни страни, включително Serpent (Великобритания), Twofish (САЩ) и RC6 (САЩ). До финала през 1999 г. остават 5 кандидата. Rijndael печели благодарение на комбинация от висока скорост на всички платформи (от 8-битови микроконтролери до 64-битови сървъри), устойчивост на криптоанализ и компактна имплементация в хардуер. От 2006 г. AES се използва за криптиране на данни с гриф SECRET и TOP SECRET в правителствените системи на САЩ. Днес AES е вграден във всички основни протоколи: TLS 1.2/1.3, IPsec, SSH, Wi-Fi WPA2/WPA3 и Bluetooth BR/EDR.
AES обработва данни на блокове от 128 бита (16 байта), организирани в матрица 4x4 байта, наречена state. Всеки кръг на криптиране изпълнява последователност от детерминирани трансформации, които заедно създават ефект на „лавина”: промяната на един бит от входните данни променя около 50% от битовете на изходните данни. Такъв ефект прави AES устойчив на диференциален и линеен криптоанализ — основните методи за разбиване на блокови шифри.
Процесът започва с AddRoundKey — налагане на началния ключ върху state чрез операция XOR. След това се изпълняват кръговете: SubBytes заменя всеки байт на state със стойност от S-box (таблица за замяна). ShiftRows циклично измества втория ред с 1 позиция, третия с 2, четвъртия с 3 — това осигурява разбъркване между колоните. MixColumns умножава всяка колона на state по фиксирана матрица в полето на Галоа GF(2^8), създавайки зависимост на всеки изходен байт от всички четири входни байта на колоната. AddRoundKey налага следващия кръгов ключ, получен от началния ключ чрез процедурата Key Expansion. Последният кръг се различава по липсата на операция MixColumns. Дешифрирането използва обратните операции InvSubBytes, InvShiftRows, InvMixColumns и AddRoundKey в обратен ред. За мобилните разработчици разбирането на вътрешната структура на AES не е необходимо — достатъчно е да знаят как правилно да извикват вградените API на платформата с подходящи параметри.
Ключовата характеристика на AES, която осигурява неговата криптоустойчивост, е лавинният ефект (avalanche effect). Промяната на един бит в открития текст или ключа води до промяна на приблизително 50% от битовете на шифрования текст, което прави AES изключително устойчив на диференциален и линеен криптоанализ. Комбинацията от операции SubBytes (нелинейност чрез S-box) и MixColumns (дифузия чрез умножение в полето на Галоа) създава математическа сложност, при която дори знанието на част от шифрования текст не позволява възстановяване на ключа по-бързо от пълно търсене. Според анализ на NIST (2018), най-добрата известна атака срещу AES-128 — biclique attack — намалява ефективната дължина на ключа само с 2 бита (до 126,2 бита), което не дава практическо предимство на атакуващия. За AES-256 не съществува нито една практически осъществима атака, превъзхождаща пълното търсене.
AES поддържа три размера на ключа, всеки от които съответства на определено ниво на криптоустойчивост. Изборът на размер на ключа влияе на сигурността, производителността и изискванията към ресурсите на устройството.
| Размер на ключа | Брой кръгове | Ниво на сигурност | Приложение |
|---|---|---|---|
| AES-128 | 10 | 128 бита | Търговски приложения, TLS |
| AES-192 | 12 | 192 бита | Правителствени системи (SECRET) |
| AES-256 | 14 | 256 бита | TOP SECRET, финансов сектор |
Практическо правило: в мобилните приложения използвайте AES-256 по подразбиране. Разликата в производителността между AES-128 и AES-256 на съвременни устройства с поддръжка на AES-NI не надвишава 10–15%, но нивото на сигурност се удвоява. Според квантов анализ (Grassl et al., 2016), за разбиване на AES-128 са необходими 2^77 квантови операции чрез алгоритъма на Гровър, а за AES-256 — 2^149, което прави AES-256 устойчив на квантови атаки за следващите 20–30 години. Дори AES-128 осигурява достатъчна защита за огромното мнозинство от търговски сценарии: за пълно търсене на 128-битов ключ е необходима повече енергия, отколкото съществува във Вселената според оценката на Брус Шнайер. Въпреки това, стандартите за сигурност (GDPR, HIPAA, PCI DSS) често изрично изискват AES-256, затова в продукционни проекти се препоръчва използването на максималната дължина на ключа.
AES като блоков шифър криптира блокове с фиксиран размер (128 бита). За криптиране на данни с произволна дължина се използват режими на работа (modes of operation). Изборът на режим критично влияе на сигурността: неправилният режим може да анулира устойчивостта на AES.
За мобилни проекти използвайте AES-256-GCM с nonce с дължина 12 байта. GCM решава два проблема едновременно: криптиране на данни и проверка на автентичност, което предотвратява атаки от тип padding oracle и chosen ciphertext. Android Keystore и iOS CryptoKit поддържат AES-GCM веднага след изваждане от кутията, без необходимост от имплементиране на допълнителни криптографски примитиви. При работа с GCM е важно никога да не повтаряте nonce с един и същ ключ — това напълно унищожава сигурността на криптирането. Генерирайте нов случаен nonce за всяко криптиране и го съхранявайте заедно с шифрования текст.
Нека разгледаме пример за сигурна имплементация на AES-256-GCM на Android, използвайки Jetpack Security. Кодът по-долу демонстрира пълния цикъл: създаване на AES-256 ключ чрез MasterKey, криптиране и дешифриране на низ с допълнителни удостоверени данни (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)
}
Ключовата особеност на това решение е използването на AES-256-GCM на две нива: за криптиране на двойки ключ-стойност (PrefValueEncryptionScheme) и за защита на самите имена на ключовете (PrefKeyEncryptionScheme използва AES-256-SIV, устойчив на повторение на nonce). MasterKey се генерира с помощта на алгоритъма AES-256-GCM и се съхранява в Android Keystore, защитен хардуерно на устройства с Trusted Execution Environment. На устройства без хардуерна поддръжка (TEE) ключът се криптира чрез Bouncy Castle, което все още е по-сигурно от съхранението в SharedPreferences.
За директно криптиране на големи обеми данни (например изображения или файлове) използвайте AES-256-GCM чрез EncryptedFile от AndroidX Security. За експорт на ключове (например за архивиране) използвайте допълнително криптиране с потребителска парола чрез PBKDF2 със 100000+ итерации.
На iOS работата с AES е организирана чрез рамката CryptoKit (Swift 5.0+). Ключът AES-256 се създава чрез SymmetricKey(size: .bits256) и се съхранява в Secure Enclave — хардуерен криптопроцесор, изолиран от основния CPU и операционната система. CryptoKit предоставя две имплементации на AES: AES.GCM (препоръчителен) и AES.CBC (за обратна съвместимост с остарели формати). Криптирането се извършва чрез метода seal(), който приема данни, ключ и nonce (12 байта) и връща AES.GCM.SealedBox — структура, съдържаща шифрования текст и маркер за удостоверяване. Дешифрирането — чрез open(). Apple силно не препоръчва директно използване на CommonCrypto: CryptoKit автоматично избира оптималните параметри, защитава от side-channel атаки и използва хардуерно ускорение AES-NI на процесорите Apple Silicon. На устройства с Secure Enclave ключовете никога не напускат хардуерния модул, което изключва тяхната кражба дори при пълно компрометиране на приложението. За сериализация на ключа се използва методът withUnsafeBytes с последващо съхранение в Keychain чрез SecItemAdd с атрибут kSecAttrAccessible = kSecAttrAccessibleWhenUnlockedThisDeviceOnly.
Често задавани въпроси
AES е алгоритъм, който превръща четими данни в нечетим набор от байтове с помощта на таен ключ. Същият ключ е необходим, за да се върнат данните в оригиналния им вид. AES е толкова надежден, че се използва за криптиране на секретни документи на правителството на САЩ.
AES-128 използва ключ с дължина 128 бита и изпълнява 10 кръга на криптиране. AES-256 използва 256-битов ключ и 14 кръга, което го прави 2^128 пъти по-труден за разбиване. За мобилни приложения се препоръчва AES-256 поради минималната разлика в производителността.
AES-256-GCM — най-сигурният и препоръчителен режим. GCM осигурява удостоверено криптиране (криптиране + проверка на цялостността). Режимът ECB е забранен, CBC изисква отделен MAC. GCM е де факто стандарт за мобилни приложения.
Теоретично AES може да бъде разбит чрез пълно търсене, но за AES-256 са необходими 2^256 опита — повече от атомите в наблюдаемата Вселена. Практически атаки срещу AES-256 не съществуват. Side-channel атаките (Spectre, Meltdown) не разбиват AES, а крадат ключове от паметта, затова хардуерното съхранение на ключове е критично важно.
Използвайте библиотеката AndroidX Security: MasterKey.Builder с KeyScheme.AES256_GCM създава защитен ключ в Android Keystore, а EncryptedSharedPreferences автоматично криптира всички данни чрез AES-256-GCM. Без ръчна криптография — API-то е сигурно по подразбиране, без риск от грешки на разработчика.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също